守护进程
负责容器的建立、运行和监控,还负责镜像的构建和存储。docker demon
命令可启动 Docker 守护进程。html
Docker 客户端
经过http与 docker 守护进程通讯。与docker守护进程通讯的 API 有很是清晰的定义和文档,开发者也能够利用 API 直接和守护进程通讯,而不经过 docker 客户端。nginx
Docker 镜像仓库
默认的寄存服务为 Docker Hub, 负责镜像的存储和发布。根据实际须要,咱们也能够构建和运营本身的docker服务。git
cgroups
负责管理容器使用的资源,如内存和CPU;web
namespaces
负责容器之间的隔离;确保系统的其余部分与容器的文件系统、主机名、用户、网络和进程都是分开的。docker
UFS (union file system)
负责存储容器的镜像层。shell
swarm
docker 集群解决方案数据库
compose
负责构建和运行多个docker容器所组成的应用程序的工具。主要用于开发和测试环境。编程
machine
非Linux系统(Windows、MacOS)上的GUI,用于运行和管理docker容器;数组
docker trusted registry
管理和存储docker镜像。缓存
网络链接
overlay
服务发现
consul、skyDNS
服务编排及集群管理
kubernetes,swarm等等
专门用于托管容器的操做系统
虽然docker在大部分的Linux发行版本上 都运行的很好,但仍是出现了一些新的发行版项目,他们只考虑须要运行容器的环境,但愿作出体积小二容易管理的发行版,尤为是针对数据中心或集群的使用场景。
建立镜像的主要方法是经过 Dockerfile
和 docker build
。
命令 docker build
须要 Dockerfile
和build context
。 build context 是一组本地文件和目录,他能够被 Dockerfile 的 ADD
和 COPY
指令引用,一般以目录路径的形式指定。
若是提供的URL以http开头,它会被假定位直接指向 dockerfile ,这样作没什么用,由于该 Dockerfile
没有与任何上下文关联。
也能够将git仓库做为构建环境上下文。这种状况下,docker客户端会将Git仓库colone到本地,而后传递给守护进程做为构建环境上下文。
还能够经过stdin输入构建环境的上下文,方法是在须要输入上下文的地方使用 -
参数。该输入能够是一个归档文件,支持 tar.gz / xz / bzip2 格式。
从构建环境的上下文中排除没必要要的文件,可使用.dockerignore
文件,该文件相似 .gitignore
。
Dockerfile 中的每一个指令执行后都会生成一个镜像层,这个镜像层能够用来启动容器。一个新的镜像层的创建,使用上一个镜像层启动容器,而后执行dockerfile中的指令,再把它保存为一个新镜像。
当dockerfile 执行成功后,中间的那些容器会被删掉,除非提供 --rm=false
参数。
因为每一个指令的最终结果都只是个静态的镜像,本质上是一个文件系统以及一些元数据,所以即便指令中的持久进程,最终都会被停掉。好比你在一条指令中开启一个数据库服务的进程,但到了下一条指令,或启动容器的时候,它就已经不存在了。
若是你须要在启动容器的时候同事运行一个进程或服务,他必须从ENTRYPOINT
或 CMD
指令中启动。
Docker 为了加快镜像构建的速度,会将每个镜像层缓存下来。 Docker的缓存特性能大大提升工做效率。
基于镜像分层的特色,当咱们须要一个环境时,无需重头开始去构建一个镜像。最理想的作法是彻底不用建立镜像,直接使用某个现有的镜像,而后把配置文件和数据挂在上去便可。对于经常使用软件,好比数据库、web服务器,这是很是可行的。通常状况下使用官方镜像比本身建立一个镜像好得多,由于其余人已经找到使得该软件以最佳方式运行在容器中的方法。
若是你须要使用一个基础镜像以运行应用程序,那么应该先检查一下,应用程序所使用的编程语言或框架是否已提供了官方的镜像。若是只是须要一个小而完整的Linux 发行版本,能够选择 alpine
,他的大小仅仅5MB多一点,但仍提供了一个包管理器,能够轻松安装大量应用和工具。
一些指令(RUN
、CMD
、ENTRYPOINT
)可以接受 shell 和 exec 这两种格式。exec 格式须要用到一个JSON数组,如:["executable","param1","param2"],其中第一个元素是可执行文件,其余元素是他执行时所使用的参数。shell格式使用的是自由形式的字符串,字符串会传给 /bin/sh -c
执行。exec格式适用于须要规避 shell 对字符串作出错误解析的状况,或者当径向力没有包含 /bin/sh
时。
这些指令在 docker 网站上均可以找到很是详细的说明文档,随着docker的持续发展,文档也会有调整,下列指令描述若是与官方文档不一致,请以官网文档为准。
ADD
从构建环境上下文或远程URL将文件复制至镜像。若是是从一个本地路径添加一个压缩文件,他会被自动解压。
CMD
当容器启动执行时执行特定的指令。若是还定义了 ENTRYPOINT , 该指令将被解释为 ENTRYPOINT 的参数(这时候请确保使用的是 exec 格式)。CMD指令也会被 docker run 命令中镜像名称后面的参数覆盖。加入定义了多个CMD,只有最后一个会生效。
COPY
从构建环境上下文复制文件至镜像。它有两种形式,COPY src dest 或 COPY ["SRC","DEST"],若是路径中有空格的话,必须使用第二种格式。
ENTRYPOINT
设置一个在容器启动时运行的可执行文件(以及默认参数)。任何CMD指令或docker run 命令中镜像名称以后的参数,将做为参数传递给这个可执行文件。 ENTRYPOINT 指令一般用于提供“启动”脚本,目的是在解析参数以前,对变量和服务进行初始化。
ENV
设置镜像内的环境变量。这些变量能够被随后的指令应用。
EXPOSE
向 Docker 表示该容器将会有一个进程监听所指定的端口。提供这个信息的目的是用于链接容器或在执行 docker run 命令式经过 -p 参数把端口发布出来; EXPOSE 自己不会对网络有实质性的改变。
FROM
设置 Dockerfile 使用的基础镜像;随后的指令将基于该镜像之上。 FROM 必须为 Dockerfile 的第一条指令。
MAINTAINER
设置镜像维护者的姓名和联系方式
ONBUILD
指定当镜像被用做另外一个镜像的基础镜像时将会执行的指令。
RUN
在容器内执行指定的指令,并把结果保存下来。
USER
设置任何后续的RUN、CMD或ENTRYPOINT指令执行时所用的用户(用户名或UID)。
VOLUME
指定为数据卷的文件或目录。若是该文件或目录已经在镜像中存在,那么当容器启动时,他就会被复制到这个卷。若是提供了多个参数,那么就将被解释成多个数据卷。
WORKDIR
对任何后续的 RUN、CMD、ENTRYPOINT、ADD、COPY指令设置的工做目录。这个指令可屡次使用。
假设你在容器中运行一个 Nginx web服务器,你如何使外界能够访问他呢?经过 -p
或 -P
选项来发布端口。好比:
$docker run -d -p 8000:80 nginx
容器启动后,咱们能够经过 localhost:8000
访问到容器内的 web 服务。其中 -p 8000:80
参数告诉 docker 将主机的 8000 端口转发到容器的 80 端口。或者可使用 -P
参数来告诉 Docker 自动选择一个主机上未使用的端口。
数据卷,是一个目录,但并不属于UFS的一部分,它只是在主机上被绑定挂在到容器的一个普通目录。有三种方式能够挂载数据卷:
执行 Docker 时,经过 -v
选项来指定数据卷
docker run -it --name test -v /data debian /bin/bash
经过 Dockerfile 的 VOLUME 命令
FROM debian VOLUME /data
指定数据卷要绑定的主机目录
docker run -v /home/data:/data debian ls /data
这个例子把主机的 /home/data 目录绑定到容器的 /data 目录,容器可以使用主机 /home/data 目录下的文件。
在执行 docker run 命令时,咱们经过传入 --volumes-from container
参数能够实现容器间的数据共享。一个经常使用的作法是,建立数据容器,这种容器的惟一目的就是与其余容器分享数据。
其实常常用到的命令还有不少,能够在 http://docs.docker.com
查阅完整的释义,也能够在命令行经过 --help
参数查看具体使用说明。
本文地址:http://www.javashuo.com/article/p-otzowmbz-he.html
若是您有任何建议或疑问请在下面留言交流。