简介
基本组成
体系结构
镜像管理
docker镜像管理常用的命令
容器管理
Dockerfile
Dockerfile定制镜像
构建镜像
指令
Compose
管理应用程序数据
管理应用程序示例
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker Client 客户端
Docker daemon 守护进程
Docker Image 镜像
Docker Container 容器
Docker Registry 仓库
docker image镜像
镜像是容器的基石,容器基于镜像启动和运行。镜像就好像容器的源代码,保存了容器各种启动的条件。镜像是一个层叠的只读文件系统。
docker container 容器
容器通过镜像来启动,容器是docker的执行来源,可以执行一个或多个进程。镜像相当于构建和打包阶段,容器相当于启动和执行阶段。容器启动时,Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台。
docker registry 仓库
docker仓库用来保存镜像。docker仓库分为公有和私有。docker公司提供公有仓库docker hub,网址:https://hub.docker.com/。我们也可以创建自己私有的仓库。

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,模块各司其职。
用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储。
当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境。
当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
Libcontainer 是一项独立的容器管理包,Networkdriver 以及 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作。
docker镜像是一个不包含Linux内核的操作系统。
镜像由docker公司的公共镜像仓库下载 https://hub.docker.com/explore
镜像与容器关系
通过docker history <id/name>查看镜像中各层的内容及大小,每层对应着dockerfile中的一个指令,docker镜像默认存储在/var/lib/dockerk/中。
容器其实就是在镜像的最上面加了一层读写层,在运行容器里做的任何修改,都会写到这个读写层。如果容器删除了,最上面的读写层数据也就丢失了。docker使用存储驱动管理镜像每层内容及可读写的容器层。
存储驱动
Ubuntu
aufs devicemapper overlay2 overlay zfs vfs
Debian
aufs devicemapper overlay2 vfs overlay
centos(6)
devicemapper vfs overlay(7)
fedora
devicemapper overlay2 overlay vfs
overlay overlay2 - ext4,xfs
aufs -ext4,xfs
devicemapper - direct-lvm
btrfs -btrfs
zfs -zfs
ls列出镜像
build构建镜像(来自dockerfile)
history查看镜像历史(执行了那些步骤)
inspect显示一个或多个镜像详细信息
pull从镜像仓库拉取镜像
push推送一个镜像到仓库(需要登录)
rm删除镜像
prune移除未使用的镜像。没有被标记或被任何容器引用的
tag创建一个引用镜像标记目标镜像
save保存一个或多个镜像到一个tar归档文件
load加载镜像来自tar归档或标准输入
创建容器常用项
管理容器常用指令
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1.定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件) 在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
2.From和RUN指令的作用
FROM:定制的镜像都是基于FROM的镜像,这里的nginx就是定制需要的基础镜像。后续的操作都是基于nginx。
RUN:用于执行后面跟着的命令行命令(两种格式):
shell
exec格式
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。
注:最后的 . 代表本次执行的上下文路径。
上下文路径
有提到指令最后一个 . 是上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose.yml
上面的 <code>docker-compose.yml</code> 文件定义了两个服务 web 和 database, 一个服务在运行时对应一个容器的实例, 上面的文件表示要启动两个实例。
在部署时, 通常将 <code>docker-compose.yml</code> 文件放到一个目录, 表示一个应用, docker 会为这个应用创建一个独立的网络, 便于和其它应用进行隔离。
要运行这个程序, 只要在这个目录下执行 <code>docker-compose up -d</code> 命令, 就会按照上面的配置启动两个容器的实例:
要停止上面的容器, 只需要输入 <code>docker-compose down</code> 命令:
从上面的命令可以看出, docker-compose 不仅可以根据配置文件 <code>docker-compose.yml</code> 自动创建网络, 启动响应的容器实例, 也可以根据配置文件删除停止和删除容器实例, 并删除对应的网络, 确实是 <code>docker run</code> 命令更加方便, 因此推荐在测试环境或者生产环境中使用。
将数据从宿主机到容器的三种方式
volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式
bind mounts 将宿主机上的任意位置的文件或者目录挂在到容器 (–mount type=bind,src=源目录,dst=目标目录)
tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用
tmpfs,同时避免写入容器可写层提高性能。
参考
http://www.google.com
http://t.cn/RdiV7Sn