什么是docker?
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
一个完整的Docker有以下几个部分组成:
dockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
docker基本架构介绍:
docker与传统虚拟技术对比:
VM(传统虚拟机技术)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;
Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。
docker优势: 更高效的利用系统资源,更快的启动时间,一致的运行环境,持续交付和部署。更轻松的迁移,更轻松的维护和扩张。
Docker安装部署
docker安装非常简单,支持各种平台,请到官网自行安装下载
Docker常用命令
使用示例:以nginx镜像为例
检索docker远程仓库
docker search nginx
运行结果如下:
获取镜像(拉取nginx镜像到本地镜像库)
docker pull nignx
pull命令从仓库获取所需要的镜像。与github很相似
运行结果:
查看本地镜像列表
docker images
启动nginx容器
docker run -p 8080:80 -d nginx
运行结果:
进入容器
docker exec -it d35d42b6a4e3 /bin/bash
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互
运行结果:
验证容器状态
docker ps
运行结果:
访问容器,浏览器访问localhost:8080
到此容器已正常启动运行
docker网络配置-容器的互联
实例准备:dockerfile内容如下
FROM ubuntu:14.04
RUN sed -i 's/aechive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash
执行上文中创建镜像命令,images name:cct,创建镜像,同时根据镜像启动容器cct1,cct2,...等,具体操作如下:
启动cct1,cct2容器
1.允许所有容器互联
默认情况下,docker允许容器间互联,例如在cct2中执行ping或curl到cct1,运行结果如下:
进入cct2容器命令:
docker exec -it cct2 /bin/bash
与cct1容器联通性验证(curl、ping):
2.拒绝容器间互联
修改docker配置文件,添加配置项如下:
"icc" : false
重启dicker服务,重启容器
3.允许指定容器互联
修改docker配置文件,添加配置项如下:
"icc" : false
“iptables”:true
重启docker服务后,启动容器时,添加--link命令,具体如下:
docker run -it --name=cct3 --link=cct1:webcct1 cct
参数介绍:
link=cct1 :表示与cct1建立连接
:webcct1 :连接别名,可用于curl webcct1 测试连接,类似虚拟域名
利用 Dockerfile 来创建镜像
Dockfile是一个用于编写docker镜像生成过程的文件,其有特定的语法。在一个文件夹中,如果有一个名字为Dockfile的文件,其内容满足语法要求,在这个文件夹路径下执行命令:docker build --tag name:tag .,就可以按照描述构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写就是lastest。注意后面有一个空格和点。
dockerfile实例文件如下:
基本指令介绍:
FROM
用法:FROM
说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像。
MAINTAINER
用法:MAINTAINER
说明:描述镜像的创建者,名称和邮箱
RUN
用法:RUN "command" "param1" "param2"
说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。
CMD
用法:CMD command param1 param2
说明:CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。
EXPOSE
用法:EXPOSE
说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。
ENV
用法:EVN
EVN
说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。
ADD
用法:ADD
说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。
COPY
用法:COPY
说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。
ENTRYPOINT
用法:ENTRYPOINT "command" "param1" "param2"
说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。
VOLUME
用法:VOLUME ["path"]
说明:在主机上创建一个挂载,挂载到容器的指定路径。docker run -v命令也能完成这个操作,而且更强大。这个命令不能指定主机的需要挂载到容器的文件夹路径。但docker run -v可以,而且其还可以挂载数据容器。
volume实现容器之外的数据持久化存储,例:
启动docker容器时,设置volume,具体命令如下:
docker run -p 8080:80 -d -v $PWD/html:/var/www/html 镜像名称
# -v $PWD/html:/var/www/html 表示将容器的/var/www/html 与本机/html目录关联
USER
用法:USER daemon
说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。
WORKDIR
用法:WORKDIR path
说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /home WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。
ONBUILD
用法:ONBUILD [INSTRUCTION]
说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。
STOPSIGNAL
语法:
STOPSIGNAL signal
STOPSIGNAL命令是的作用是当容器推出时给系统发送什么样的指令
HEALTHCHECK
容器健康状况检查命令
语法有两种:
1. HEALTHCHECK [OPTIONS] CMD command
2. HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三中选项:
--interval=DURATION 两次检查默认的时间间隔为30秒
--timeout=DURATION 健康检查命令运行超时时长,默认30秒
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
注意:
HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。
CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作了
2: reserved - 保留值
例子:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康检查命令是:curl -f http://localhost/ || exit 1
两次检查的间隔时间是5秒
命令超时时间为3秒
常见问题
1.dockerfile 中 ARG 与 ENV 的区别?
ARG指令定义了用户可以在编译时或者运行时传递的变量,如使用如下命令: --build-arg
ENV指令是在dockerfile里面设置环境变量,不能在编译时或运行时传递
以下是ARG和ENV的有效结合:
ARG var
ENV var=${var}
2.CMD和ENTRYPOINT指令差异?
差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。
差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;
3.COPY和ADD指令差异?
COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。
满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。
相关资料:
docker中文社区:http://www.docker.org.cn/book/install/supported-platform-17.html