2.3 How——容器是如何工作的
接下来学习容器核心知识的最主要部分。
我们首先会介绍Docker的架构,然后分章节详细讨论Docker的镜像、容器、网络和存储。
1. Docker架构
Docker的核心组件包括:
● Docker客户端:Client
● Docker服务器:Docker daemon
● Docker镜像:Image
● Registry
● Docker容器:Container
Docker架构如图2-10所示。
图2-10
Docker采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信。
2. Docker客户端
最常用的Docker客户端是docker命令。通过docker我们可以方便地在Host上构建和运行容器。
docker支持很多操作(子命令),后面会逐步用到,如图2-11所示。
图2-11
除了docker命令行工具,用户也可以通过REST API与服务器通信。
3. Docker服务器
Docker daemon是服务器组件,以Linux后台服务的方式运行,如图2-12所示。
图2-12
Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。
默认配置下,Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开TCP监听,步骤如下:
(1)编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service,在环境变量ExecStart后面添加 -H tcp://0.0.0.0,允许来自任意IP的客户端连接,如图2-13所示。
图2-13
如果使用的是其他操作系统,配置文件的位置可能会不一样。
(2)重启Docker daemon,如图2-14所示。
图2-14
(3)服务器IP为192.168.56.102,客户端在命令行里加上 -H参数,即可与远程服务器通信,如图2-15所示。
图2-15
info子命令用于查看Docker服务器的信息。
4. Docker镜像
可将Docker镜像看成只读模板,通过它可以创建Docker容器。
例如某个镜像可能包含一个Ubuntu操作系统、一个Apache HTTP Server以及用户开发的Web应用。
镜像有多种生成方法:(1)从无到有开始创建镜像;(2)下载并使用别人创建好的现成的镜像;(3)在现有镜像上创建新的镜像。
可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作Dockerfile,通过执行docker build <docker-file>命令可以构建出Docker镜像,后面我们会讨论。
5. Docker容器
Docker容器就是Docker镜像的运行实例。
用户可以通过CLI(Docker)或是API启动、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
6. Registry
Registry是存放Docker镜像的仓库,Registry分私有和公有两种。
Docker Hub(https://hub.docker.com/)是默认的Registry,由Docker公司维护,上面有数以万计的镜像,用户可以自由下载和使用。
出于对速度或安全的考虑,用户也可以创建自己的私有Registry。后面我们会学习如何搭建私有Registry。
docker pull命令可以从Registry下载镜像。
docker run命令则是先下载镜像(如果本地没有),然后再启动容器。
7.一个完整的例子
还记得我们运行的第一个容器吗?现在通过它来体会一下Docker各个组件是如何协作的。
容器启动(如图2-16所示)过程如下:
图2-16
(1)Docker客户端执行docker run命令。
(2)Docker daemon发现本地没有httpd镜像。
(3)daemon从Docker Hub下载镜像。
(4)下载完成,镜像httpd被保存到本地。
(5)Docker daemon启动容器。
docker images可以查看到httpd已经下载到本地,如图2-17所示。
图2-17
docker ps或者docker container ls显示容器正在运行,如图2-18所示。
图2-18