在不同的操作系统中都可以安装 Docker ,本节内容中只演示 Ubuntu 环境下的 Docker 安装。本次安装演示的 Ubuntu 版本为 Ubuntu 20.04.1 LTS 。apt 更换国内源在安装应用之前,我们需要把 apt 更换为国内源,这里我们选择阿里云的 mirros.aliyun.com。# 备份 apt 源列表文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak# 更换源为 mirros.aliyun.comsudo sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list# 更新源sudo apt-get cleansudo apt-get update更换完毕后,我们还需要安装 apt 的一些工具,如 https,curl 等。安装 apt 依赖包sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common获取 GPG 密钥证书我们这里使用阿里云的镜像来获取 GPG 密钥:curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -获取成功会返回 OK ,我们使用 apt-key finger 命令查看:apt-key finger# 输出密钥信息/etc/apt/trusted.gpg--------------------pub rsa4096 2017-02-22 [SCEA]9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88uid [ unknown] Docker Release (CE deb) <docker@docker.com>sub rsa4096 2017-02-22 [S]密钥添加成功后,我们就可以开始后续的安装了。添加 Docker 源为了更快速的安装 Docker,这里我们添加阿里云的 Docker 源,首先我们先使用 lsb_release -a 命令获取当前系统的 Codename:lsb_release -a# 输出系统信息No LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 20.04.1 LTSRelease: 20.04Codename: focal本系统的 Codename 也就是版本代码为 focal,我们在添加 Docker 源的时候就会使用这个版本:# 添加 docker-ce 源,系统为 ubuntu,系统版本为 focal, stable 为 docker 稳定版。sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal stable"执行完毕后,我们需要更新 apt 源:sudo apt-get updateDocker 安装更新完源后,我们就可以开始安装 Docker 组件了:sudo apt-get install docker-ce docker-ce-cli containerd.io执行这一行命令需要一点时间,稍等片刻。完成后我们就可以来查看 Docker 是否安装成功了。查看 Docker 版本使用 docker -v 来查看 Docker 版本:docker -v# 输出 docker 版本信息Docker version 19.03.13, build 4484c46d9d看到版本信息输出就说明我们的 Docker 源安装成功了。Tips: 如果安装失败,需要注意系统的版本和添加的 Docker 源是否能使用。安装成功后,我们来添加 Docker Image 镜像源。添加 Docker Image 镜像源使用阿里云的 Docker Image 镜像源,需要登录阿里云官网开启 容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors添加 Docker Image 镜像源为阿里云镜像,这里同学们使用自己账号的加速器地址即可:sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]}EOF添加完毕后,我们就可以启动我们的 Docker 服务了。启动 Dockerservice docker start# 输出启动信息* Starting Docker: docker 启动完成,接下来我们进行测试。Docker 测试执行测试命令:docker run hello-world输出:Unable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world0e03bdcc26d7: Pull complete Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bcStatus: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/我们看到这段信息就说明,我们的 Docker 测试成功了。那么接下来,我们就可以使用 Docker 来安装 Zookeeper 服务。
安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限# 下载 docker-compose wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64# 移到 /usr/local/bin/docker-composesudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose# 给 docker-compose 执行权限sudo chmod +x /usr/local/bin/docker-compose查看安装是否成功:docker-compose -v
Tips:CentOS8 的推荐的新包管理工具是 dnf,所以我们使用 dnf 来安装 Docker。 CentOS7 的版本只需要将 dnf 替换成 yum 即可。1. 添加软件源:dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.执行下面这条命令更新软件包索引:dnf update3. 安装需要的依赖:目前 Centos8 软件源中的 containerd.io 版本偏低,我们需要手动安装一个新版本,这样才能顺利安装 docker-ce 19.03,否则只能安装老版本的 docker-ce。Centos7 用户可以跳过此步。dnf install -y https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm4. 安装 Docker-ce:dnf install -y docker-ce5.配置网络与防火墙systemctl stop firewalldiptables -P INPUT ACCEPTiptables -Fecho "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.confsysctl -psystemctl start firewalldfirewall-cmd --add-masquerade --permanentfirewall-cmd --reload6. 将 Docker 设定为开机启用:systemctl enable docker7. 启动 Docker 服务:systemctl start docker8. 使用 查看 docker 版本:Tips:如果使用的是非root用户,需要先将当前用户加入到Docker用户组并重启Docker服务sudo usermod -aG docker `whoami`newgrp dockersystemctl restart docker执行docker version查看安装版本信息Client: Docker Engine - Community Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:46:54 2020 OS/Arch: linux/amd64 Experimental: falseServer: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:45:28 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683如果可以成功输出上面的版本号,说明我们的 Docker 已经安装成功了!
前面的小节我们学习了一些前置知识和 Docker 的基本原理,那么,你可能会问了:Docker 到底有哪些优点呢?我们为什么要学习 Docker 呢?别着急,这节课我们就来细数下 Docker 的优点:
Docker Compose 的定位是:定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)。Docker Compose 中有两个重要的概念:服务 service :一个应用的容器,实际上可以包括多个运行相同镜像的容器实例。项目 project :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。通过 Docker Compose,我们可以使用 docker-compose.yml 文件来配置应用程序需要的所有服务,然后使用 up 命令,就可以从 docker-compose.yml 文件配置中创建并启动所有服务。首先我们来安装 Docker Compose。
Docker 容器与我们之前的容器在本质上没有区别,我们之前的容器更偏向抽象的技术概念,而受到在 Docker 管理约束的容器就是 Docker 容器,它会带有 Docker 产品的一些特征和功能。Docker镜像 和 Docker容器 的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。从文件系统来看,Docker容器比Docker镜像多一层可读写的文件系统挂载层,从生命周期来看,Docker容器可以被创建、启动、停止、删除、暂停等。
我们可以直接从 Docker 官方 GitHub Release 上直接拉取编译好的二进制文件:# 拉取 composecurl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 添加 docker-compose 命令chmod +x /usr/local/bin/docker-compose# 补全命令curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose执行完毕后,我们来查看 docker-compose 的版本:docker-compose -v# 输出版本信息docker-compose version 1.27.4, build 40524192
Docker Swarm 是一个由 Docker 开发的调度框架。它的使用方式接近 Docker 本身,加之 Docker Machine 可以快速创建部署 Docker 宿主机,使得 Swarm 整体部署和使用非常简单,易于上手。2.1.1 功能特性集群管理集成进 Docker Engine;去中心化设计;声明式服务模型;服务扩容缩容;协调预期状态与实际状态的一致性;多主机网络;服务发现;负载均衡;安全策略;滚动更新。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 系统或 Windows 系统上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。首先我们来简单了解一下 Docker 的组成。在 Docker 中有 4 个基本组成:Docker Image 镜像Docker Container 容器Docker Client 客户端Docker Daemon 守护进程Docker 和 Zookeeper 同样是 C/S 的架构,Docker 服务端通过 Docker Daemon 守护进程来维持长时间的运行,Docker Client 客户端通过 CLI 的 API 来对 Docker 服务端的 Docker Image 镜像和 Docker Container 容器来进行操作。我们通过 API 去 Docker Hub 的官网拉取 Image 镜像,然后通过 Image 镜像来创建 Container 容器。在我们使用 Docker 来搭建 Zookeeper 集群的时候,也同样的先去 Docker Hub 的官网拉取 Zookeeper 的镜像,然后通过这个 Zookeeper 镜像就能创建 Zookeeper 的容器实例了。这个 Zookeeper 的容器实例就是一个 Zookeeper 服务,我们就可以通过 Zookeeper 客户端来进行连接和操作了。简单了介绍了 Docker ,接下来我们介绍如何安装 Docker。
本节介绍镜像仓库的使用。目前 Docker 官方维护了一个公共仓库 Docker Hub,这是一个用于管理公共镜像的地方,我们可以找到各种镜像,也可以把我们自己的镜像推送上去。当然,根据需要我们也可以搭建私有的镜像仓库,用于管理自己的镜像。
我们自己在上一节留下了不少问题,在自制 rootfs 有很多不完善的地方,在 Docker 产品的方面,就对这些部分进行了补足, 解决的方案,基本都是围绕 UnionFS (联合文件系统)展开的,本节我们会讲讲 UnionFS 和它在 Docker中 的应用。
Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上。如图所示的是一个 Docker 的 Logo,它生动描述了 Docker 这个产品的本质:软件行业的集装箱。集装箱是指具有一定强度、刚度和规格专供周转使用的大型装货容器。对于绝大多数的货物,我们不需要专门定制化运输船。在一艘大型货船上,各种各样的货物被集装箱标准化,可以把货物规整地摆放运输,各个集装箱之间互相隔离,不会影响。我们将 Docker 与集装箱做个类比,方便我们理解 Docker:传统行业集装箱Docker货物的实体软件应用和自身运行依赖的环境具有统一的规格,便于运输运行环境的统一性与外界环境隔离容器之间互不影响
Docker 项目诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目,基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
使用 ssh 命令登录 master-1 虚拟机终端。ssh root@192.168.1.12 输入密码后登录:接下来我们来安装 Docker 、Kubernetes 运行环境。Tips:可以将这些命令保存到install.sh中,然后执行 sh ./install.sh安装。操作步骤如下# 将CentOS8 的软件源更换成国内的阿里源rm -fr /etc/yum.repos.d/*dnf config-manager --add-repo https://mirrors.aliyun.com/repo/Centos-8.repo# 添加 docker软件源dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 添加 Kubernetes 软件源cat <<EOF > /etc/yum.repos.d/Kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF# 更新软件dnf update# 安装Docker相关依赖dnf install -y https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm# 获取阿里云k8s镜像源对应的版本 version=`curl -s https://github.com/AliyunContainerService/k8s-for-docker-desktop/blob/master/images.properties|grep kube-apiserver:v|awk -F kube-apiserver:v '{print $2}'|awk -F '<' '{print $1}'`echo $version > .k8s.version# 安装 Docker 和 k8s 工具dnf install -y docker-ce kubeadm-$version kubectl-$version kubelet-$version tc# 关闭 Selinuxsetenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 关闭并禁用firewalldsystemctl stop firewalldsystemctl disable firewalld# 设定iptables规则iptables -P INPUT ACCEPTiptables -F# 设定允许ipv4路由转发echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.confsysctl -p# 设定 Docker cgroup 驱动模式为 systemdmkdir /etc/dockercat <<EOF > /etc/docker/daemon.json{ "exec-opts": ["native.cgroupdriver=systemd"]}EOF# 设定docker kubelet开机自启systemctl enable dockersystemctl enable kubelet执行docker --version与kubeadm version确认安装完成。
PyCharm 集成了 Docker,允许在 Docker 容器中部署的各种配置开发环境中运行应用程序。当然前提也是需要安装 Docker 与 Docker plugin(PyCharm 已经预装)。Tips:关于 Docker 的使用,可以参考这里。step1:启动要用的 Docker 容器:docker run python:latest myteststep2:打开项目, 访问解释器页面,然后点击齿轮按钮,点击“add"。(参考前面步骤)step3:左侧面板点击 Docker,配置 server:step4:显示连接成功后,会自动显示对应 docker 服务包含的所有镜像。step5:选择在步骤1运行的镜像文件,点击 OK:
使用 Docker Compose 的步骤分成三步。也可以使用现有的镜像 ,或者根据需要编写容器所需镜像的 Dockerfile编写获取用于配置容器的 docker-compose.yml使用 docker-compose 命令启动应用准备镜像这一过程我们之前已经掌握了,编写docker-compose.yml部分我们会放在下一节详细介绍,这里我们就直接来使用它,感受Docker Compose 的强大功能。
在多阶段构建章节中,我们将flask应用打包成了镜像myhello,然后创建myhello应用容器,它依赖redis服务,所以我们设定myhello容器通过宿主机网络与redis进行数据交换。如果在别的服务器上,使用Docker重新部署一边,操作的过程还是比较麻烦的。一般来说,我们要求每个Docker容器只运行一个独立服务,每个镜像都要保持尽可能的简洁、功能单一,貌似这些规范反而降低了我们的效率。同时,随着技术演进,我们越来越推崇将大型服务拆分成较小的微服务,分别部署到独立的机器或容器中,也就是说,我们的应用系统往往由数十个甚至上百个小型服务组成。试想一下,使用之前讲到的容器技术搭建系统,不仅需要众多复杂的命令,处理众多容器间的依赖更是非常消耗精力的。归结下来,我们缺少一个对容器组合进行管理的工具。Docker Compose 是 Docker 官方编排项目。使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。在 Docker Compose 里,我们通过一个配置文件,将所有与应用系统相关的软件及它们对应的容器进行配置,之后使用 Docker Compose 提供的命令进行启动,就能让 Docker Compose 将刚才我们所提到的那些复杂问题解决掉。
执行以下命令,使用Docker运行私有仓库服务registry。docker run -d -v /root/registry:/var/lib/registry -p 6000:5000 --restart=always --name registry registryTips:此命令会启动一个容器,设定本地的 /root/registry 目录存储上传的镜像。配置/etc/docker/daemon.json,添加一行insecure-registries配置{... "insecure-registries": ["127.0.0.1:6000"]...}127.0.0.1:6000是我们上面的自定义镜像仓库服务的地址端口。
上一节中,我们学会了如何从Docker Hub官方仓库中获取镜像。同时,我们已经知道,Docker镜像是静态的,要使用它,就是以镜像为模板,创建并运行Docker容器应用。本节我们将详细介绍Docker容器的使用,在了解容器的各项操作之前,我们先来回顾一下,Docker 容器的生命周期里分为五种状态,其分别代表着:Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态;Running:容器正在运行,也就是容器中的应用正在运行;Paused:容器已暂停,表示容器中的所有程序都处于暂停 状态;Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止;Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。容器的操作使容器在不同状态间转换。下面我们围绕着容器生命周期,介绍Docker对容器的操作。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到其它 Linux 系统上。把一个应用部署到生产环境中,需要进行各种安装和配置:安装各种依赖包安装相关的应用程序并进行配置,例如 nginx、mysql 等配置非常繁琐、容易出错,使用 docker 可以有效的解决问题:开发者可以打包他们的应用以及依赖包到一个可移植的镜像在生产环境下拉取一份镜像(已经配置好各种依赖包),直接运行镜像Docker 对于显著的降低了应用部署的工作量,是运维人员必须掌握的技术。
如果你自己使用 Ubuntu 发行版,可以参考如下步骤安装 Docker:Tips:Ubuntu 的包管理工具是 apt,所以我们使用 apt 来安装 Docker。1. 安装 curl:apt install curl -y2. 安装 Docker:sh -c "$(curl -fsSL https://get.docker.com)"3. 启动 Docker 服务:systemctl start docker4. 将 Docker 设定为开机启用:systemctl enable docker
我们使用 systemctl 命令管理 Docker 服务。启动 Docker 服务:systemctl start docker停止 Docker 服务:systemctl stop docker重启 Docker 服务:systemctl restart docker设定 Docker 服务开机自启动:systemctl enable docker取消 Docker服务开机自启动:systemctl disable docker
经过上面几节的积累,我们对 Docker 各个方面都有了大致的了解,这一节,我们将常用的 Redis,Nginx, Mysql 等服务部署到 Docker 上来。
查询镜像我们可以去 Docker Hub 的官网查看 Zookeeper 的镜像:https://hub.docker.com/_/zookeeper也可以使用 search 命令来查询 Zookeeper 镜像:# 查询 zookeeper 镜像docker search zookeeper执行这条命令会输出很多 zookeeper 镜像,这里我们可以看到第一条就是官方的 zookeeper 镜像。NAME DESCRIPTION STARS OFFICIAL AUTOMATEDzookeeper Apache ZooKeeper is an open-source... 936 [OK] 拉取镜像接下来我们开始拉取 Zookeeper 镜像:# 拉取 zookeeper 镜像,默认是 latestdocker pull zookeeper# 选择版本拉取就在后面跟上版本信息docker pull zookeeper:3.6这里我们选择 latest 版的镜像,执行 docker pull zookeeper 后开始拉取镜像:Using default tag: latestlatest: Pulling from library/zookeeperd121f8d1c412: Pull complete 75deccc0fc24: Pull complete 690f480f5f48: Pull complete b20f9556d3e0: Pull complete 30b60f0b1627: Pull complete a774eb30ae9a: Pull complete 99abe5102984: Pull complete f0154f2759c0: Pull complete Digest: sha256:6c051390cfae7958ff427834937c353fc6c34484f6a84b3e4bc8c512b53a16f6Status: Downloaded newer image for zookeeper:latestdocker.io/library/zookeeper:latest查看本地镜像拉取镜像完毕后,我们使用 images 命令来查看镜像:# 查看镜像docker images# 输出信息REPOSITORY TAG IMAGE ID CREATED SIZEzookeeper latest 36b7f3aa2340 10 days ago 252MB启动镜像接下来我们就可以启动 zookeeper 镜像了。# run 启动,-d 后台运行,--name 别名,-p 端口映射(可以写多个), 容器名称:版本(不写默认latest)docker run -d --name=zookeeper -p 2181:2181 zookeeper启动成功后会输出当前容器的 ID:6e191d07172187ec27c2227ae99760177b2fe7dbca25061af35586dd7ee0d1cb查看容器这里我们可以使用 container 命令来查看容器:# 查看所有的容器docker container ls -a输出容器列表,我们可以看见刚才启动的 zookeeper 容器:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6e191d071721 zookeeper "/docker-entrypoint.…" 3 minutes ago Up 3 minutes zookeeper进入容器使用 exec 命令我们就可以进入已经启动的 zookeeper 容器:docker exec -it zookeeper /bin/bash进入容器后我们使用 ls 命令来查看 文件列表:LICENSE.txt NOTICE.txt README.md README_packaging.md bin conf docs libZookeeper 的命令就在 bin 目录中,我们可以使用 zkCli.sh 连接 Zookeeper 服务端,也可以使用宿主机的客户端加映射的端口来连接 Docker 容器内的 Zookeeper 服务端。想要退出容器的话使用 exit 命令即可。关闭容器如果我们想要关闭容器,在容器外使用以下命令:docker container stop zookeeper如果这样来启动多个容器,然后一个一个配置的话,也是一件繁琐的事情。那么有没有一次性能启动多个 Zookeeper 的方式呢?接下来我们就使用 Docker Compose 来构建 Zookeeper 集群。
我们将中间只读的 rootfs 的集合称为 Docker 镜像,我们在后面的部分会讲到,Docker 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。UnionFS 使得镜像的复用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
这里我们先打打“鸡血”。对于个人来说,我们学习的动力主要有两部分,其一是掌握 Docker 使用可以提升自身竞争力,其二是 Docker 在我们日常使用中也能提供不少便利,掌握接下来的基础部分后,我们会有一节重新仔细地总结一下 Docker 的优势。
基于 Docker 环境来安装 Swagger Editor 是 Swagger Editor 官方提供的第二种方式,同样地,想在 Docker 中安装 Swagger Editor ,需要电脑中首先要有 Docker 环境。关于 Docker 的安装过程以及基础知识,由于不是本节文章所需要介绍的内容,所以该方面的知识点希望同学们可以在课下了解。
上一节我们快速体验了 Docker Compose,本节我们来学习如何编写和使用 Docker Compose。Docker Compose 的配置文件是一个基于 YAML 格式的文件。与 Dockerfile 采用 Dockerfile 作为默认文件名一样,Docker Compose 的配置文件也有一个缺省的文件名,就是 docker-compose.yml。Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container),Docker Compose 定义了一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。
我们知道,Docker 提供了两类数据管理的方式:挂载宿主机目录或文件;使用数据卷;上节课我们学习了挂载宿主机目录或文件的数据管理方式。本节,我们介绍如何使用 Docker 数据卷。但是明明可以使用挂载宿主机目录或文件的方式,为什么还要使用数据卷呢?其实,使用数据卷的好处就在于:我们不必自己维护一个外部路径挂载和存储的关系,借助Docker管理数据,并且通过语义化数据卷命名,更加方便直观地使用它来数据共享。
Docker 的官方文档中有一张图片,很好地展示了 Docker 使用 UnionFS 搭建的分层结构的状态。使用 UnionFS 搭建的分层结构图中的容器是运行在 debian 容器环境中的 apache 网页应用,这个环境还提供了 emacs 编辑器功能。将之前我们自己构建的 rootfs 与上面这张图片对比,会发现我们将所有系统文件、运行库文件和上层应用,都放到了一个 rootfs 里面,这样做缺乏灵活性,增大了维护的复杂度。而 Docker 引入了层(layer)的概念,将 rootfs 的内容进行了分层管理,有系统层,运行库依赖层等等,可以一层接一层进行增量式挂载叠加。启动容器的时候通过 UnionFS 把相关的层挂载到一个目录,作为容器的根 rootfs。借助于 UnionFS,容器内部的更改都被保存到了最上面的读写层,而其他层都是只读的,这样中间的只读 rootfs 是可以被多个容器复用的。UnionFS 将文件的更新挂载到老的文件之上,而不去修改那些不更新的内容,这就意味着即使虚拟的文件系统被反复修改,也能保证宿主机空间占用保持一个较低水平。