docker入门学习之旅
一、docker与传统虚拟化技术的区别
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
Hypervisor 不仅协调虚拟机硬件资源,而且增加各虚拟机施加防护;
二、docker的基本概念
Docker 包括三个基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
2.1.镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等) 。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
2.2.容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
2.3.仓库
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository) ;每个仓库可以包含多个标签(Tag) ;每个标签对应一个镜像。
三、安装部署
3.1配置docker的yum仓库
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.2 安装docker-ce的社区版本
yum install docker
3.3 检查已安装的docker版本
yum list intalled | grep docker | yum list docker-ce --showd uplicates
四、docker的镜像管理
4.1 进入http://dockerhub.com官网注册一个账号 4.2 登录docker docker login docker.io 4.3 查找镜像 docker search alpine 4.4 拉取镜像 docker pull docker.io/library/alpine 4.5 拉取指定版本的镜像 docker pull docker.io/library/alpine:3.10.1
4.6 列出本地镜像
docker images | docker image ls
4.7 给镜像打标签
docker tag ${image_id} ${tag} 示例:docker tag 965ea09ff2eb docker.io/jhoneming/alpine:v3.10.3
4.8 推送镜像
docker push docker.io/jhoneming/alpine:3.10.1
4.9 删除镜像
docker rmi ${image_id} | docker rmi ${image_name}
4.10 强制删除镜像
docker rmi -f ${image_id} | docker rmi -f ${image_name}
五、docker容器的基本操作
容器主要操作如下:
查看所有容器 docker ps -a
启动交互式容器(写入内容到1.txt文件: echo hello > 1.txt, 1.txt文件随着容器的退出文件也就不存在了) ~]# docker run -ti --rm jhoneming/alpine:latest /bin/sh 启动一次性运行容器 ~]# docker run --rm jhoneming/alpine:latest /bin/echo hello 启动一个后台容器 docker run -d a24bb4013296 /bin/sleep 120 交互式进入一个容器 ~]# docker exec -ti e0b7fcf28418 /bin/sh
容器的启停操作 ~]# docker start/stop/restart e0b7fcf28418 删除镜容器 ~]# docker rm -f myalpine1 删除所有已经退出的容器 ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done 将容器固化成镜像(写入内容到1.txt文件:echo hello > 1.txt,由jhoneming/alpine:v3.10.3_with_1.txt镜像运行的容器中1.txt文件不会随着容器的退出而不存在) ~]# docker commit -p myalpine jhoneming/alpine:v3.10.3_with_1.txt 将镜像保存成文件 ~]# docker save 6c2009aef1cc > alpine:v3.10.3_with_1.txt.tar 加载文件生成一个镜像 ~]# docker load < alpine\:v3.10.3_with_1.txt.tar 给镜像打标签 ~]# docker tag 6c2009aef1cc jhoneming/alpine:v3.10.3_with_1.txt 实时查看容器运行产生的日志 ~]# docker logs -f 7756b96cc32a
六、docker容器的高级操作
容器主要高级操作如下:
~]# docker pull nginx:1.12.2
映射容器内端口到容器外 ~]# docker run --rm --name mynginx -d -p81:80 jhoneming/nginx:v1.12.2 ~]# mkdir html html]# wget www.baidu.com -O index.html
将容器内目录挂载到容器外目录上 ~]# docker run -d --rm --name nginx_with_baidu -d -p82:80 -v/root/html:/usr/share/nginx/html jhoneming/nginx:v1.12.2
检视容器目录挂载信息 ~]# docker inspect 8c440bed2ccb
初始化容器时传递环境变量 ~]# docker run --rm -e E_OPTS=abcdefg jhoneming/alpine:latest printenv ~]# docker exec -ti nginx_with_baidu /bin/bash tee /etc/apt/sources.list << EOF deb http://mirrors.163.com/debian/ jessie main non-free contrib deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib EOF
容器内安装软件 /# apt-get update && apt-get install curl -y ~]# docker commit -p 8c440bed2ccb jhoneming/nginx:curl ~]# docker push jhoneming/nginx:curl
七、Dockerfile
7.1 USER/WORKDIR指令用法
vi /data/dockerfile/Dockerfile FROM jhoneming/nginx:v1.12.2 #标红为基础镜像需创建 USER nginx ##指定容器进程运行用户 WORKDIR /usr/share/nginx/html #运行容器后进入的目录 dockerfile]# docker build . -t docker.io/jhoneming/nginx:v1.12.2_with_user_workdir #根据Dockerfile文件构建镜像 dockerfile]# docker run --rm -ti --name nginx123 jhoneming/nginx:v1.12.2_with_user_workdir /bin/bash #运行容器 nginx@149ac8f528cc:/usr/share/nginx/html$ whoami nginx nginx@149ac8f528cc:/usr/share/nginx/html$ pwd /usr/share/nginx/html 7.2 ADD/EXPOSE指令用法 FROM jhoneming/nginx:v1.12.2 ADD index.html /usr/share/nginx/html/index.html # 拷贝宿主机当前目录index.html文件到容器/usr/share/nginx/html目录下 EXPOSE 80 #将容器运行服务的80端口在宿主机映射随机端口 参数 -P dockerfile]# docker build . -t jhoneming/nginx:v1.12.2_with_index_expose dockerfile]# docker run --rm -d --name nginx123 -P jhoneming/nginx:v1.12.2_with_index_expose /data/dockerfile/dcokerfile #-P 映射端口
7.3 ENV/RUN指令用法
FROM centos:7
ENV VER 9.11.4 环境变量
RUN yum install bind-$VER -y 引用环境变量,bind软件固化到镜像上(RUN指令用法:构建镜像时执行可执行的命令)
dockerfile]# docker build . -t jhoneming/bind:v9.11.4_with_env_run
7.4 CMD/ENTRYPOINT指令用法
FROM centos:7
RUN yum install httpd -y
CMD ["httpd","-D","FOREGROUND"] #(启动容器时执行命令启动httpd服务进程)
dockerfile]# docker build . -t jhoneming/httpd:test
FROM centos:7
ADD entrypoint.sh /entrypoint.sh
RUN yum install epel-release -q -y && yum install nginx -y
ENTRYPOINT /entrypoint.sh #(启动容器默认会执行容器里/entrypoint.sh脚本)
vim /data/dockerfile/entrypoint.sh
#!/bin/bash
/sbin/nginx -g "daemon off;" #(容器的nginx进程以前台方式运行)
dockerfile]# docker run --rm -p84:80 jhoneming/nginx:mynginx
八、综合实验
FROM jhoneming/nginx:v1.12.2 USER root ENV WWW /usr/share/nginx/html ENV CONF /etc/nginx/conf.d RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo 'Asia/Shanghai' >/etc/timezone WORKDIR $WWW ADD index.html $WWW/index.html ADD demo.od.com.conf $CONF/demo.od.com.conf EXPOSE 80 CMD ["nginx","-g","daemon off;"] dockerfile]# vi demo.od.com.conf server { listen 80; server_name demo.od.com; root /usr/share/nginx/html; }
[root@centos7 dockerfile]# wget index.html www.baidu.com
[root@centos7 dockerfile]# ls /data/dockerfile/ -l
total 12
-rw-r--r-- 1 root root 78 Sep 13 17:47 demo.od.com.conf
-rw-r--r-- 1 root root 329 Sep 13 18:05 Dockerfile
-rw-r--r-- 1 root root 2381 Sep 13 18:24 index.html
dockerfile]# docker run -ti --rm --name lhwl2 --net=container:d62807b4af37 jhoneming/nginx:curl
九、Docker的网络模式
访问地址:https://www.cnblogs.com/sammyliu/p/5894191.html