Docker Compose的使用教程
前言
Docker 是容器的管理软件,容器类似于虚拟机,但它更小巧快捷、对资源友好。虚拟机启动起来就是GB级别,而Docker承载的容器只需要MB甚至KB容量即可。所以同时启动几千个容器也很常见。
对于依赖多种服务的应用程序来说,需要将它们所需的容器编排在一起。当需要使用时,我们得手动一个一个来启动,非常麻烦。对于这个问题,我们可以使用 Docker Compose 来解决,它是用于设置和运行多个容器的 Docker 容器管理工具,通过 Compose ,我们可以使用 YAML 文件来配置多容器应用程序的环境。
在本教程中,我们将学习到如何在 Ubuntu 20.04 服务器上安装 Docker Compose 以及如何使用这个工具。
准备工作
如要跟随本教程学习,首先我们要有一台安装好 Ubuntu 20.04 的服务器:
- 有 sudo 的 root 用户权限,大家可根据《 Ubuntu 120.04 初始服务器设置》(撰写中,稍后上线)指南来配置自己的服务器。
- Docker 已经按照《Docker入门指南:如何在 Ubuntu 20.04 上安装和使用 Docker 》的 第1步 和 第2步 中的说明进行安装。
第一步:安装 Docker Compose
为了确保我们使用 Docker Compose 最新的稳定版,我们可以从 Docker 官方 Github 版本库来下载。
首先,我们在 Docker Compose 发布页面确认可用的最新版本,在我们撰写本文时,最新的稳定版本是1.26.2
接下来我们使用curl
命令来下载 Docker Compose 1.26.2
发行版,并将可执行文件保存在/usr/local/bin/docker-compose
目录。这样我们可以使软件能够全局访问dokcer-compose
:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
下载完成后,我们来给docker-compose
设置合适的权限。
sudo chmod +x /usr/local/bin/docker-compose
最后,让我们来验证一下,是否可以运行:
docker-compose --version
如果没有任何问题,会看类似下面的结果输出:
docker-compose version 1.26.2, build d4451659
至此,Docker Compose 已经成功安装到我们的系统中。本教程下一节,我们来学习如何设置 docker-compose.yml
文件以及如何使用此工具启动并运行容器。
第2步:设置 docker-compose.yml
文件
为了演示如何设置docker-compose.yml
文件,以及 Docker Compose 如何使用。接下来,我们从 Docker Hub 上下载一份 Nginx 的官方镜像 ,然后用它跑一个web server 并创建一个静态HTML页面来做演示。
首先,我们在 home 目录创建一个新文件夹,然后再 cd 进入这个目录:
mkdir ~/compose-demo
cd ~/compose-demo
在此目录中,设置一个应用程序文件夹,作为 Nginx 环境的根目录:
mkdir app
使用常用的文本编辑器在app
目录下创建一个index.html
文件:
nano app/index.html
然后将以下代码复制到这个html文件中:
<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><title>Docker Compose Demo</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body><h1>This is a Docker Compose Demo Page. </h1><p>This content is being served by an Nginx container.</p><p>欢迎访问卡拉搜索 KalaSearch.com 获取更多教程 <p></body>
</html>
完成后,保存并退出编辑器。如果你也和我们一样使用nano
,那么可以通过CTRL+X
,Y
,ENTER
三步来进行保存退出。
接下来,我们创建 docker-compose.yml
文件:
nano docker-compose.yml
把以下内容复制到 docker-compose.yml
文件中。
version: '3.7'
services:web:image: nginx:alpineports:- "8000:80"volumes:- ./app:/usr/share/nginx/html
我们来逐条分析一下,以上代码到底是做什么用的。
docker-compose.yml
通常用version
定义开始。version
传递版本号给 Docker Compose ,告诉它我们正在使用哪个配置版本。
接着说services:
,在这段代码中,我们可以用来设置环境的一部分服务。在这个例子中,我们设置了一个名为web
的服务。这个服务使用nginx:alpine
镜像,并且设置了一个映射的转发端口。
宿主机端口(运行 Docker Compose 的主机系统)上的8000
端口上的所有请求都将重新定向到运行着 Niginx 容器的80
端口上。
最后是volumes:
将在主机和容器之间创建共享卷。宿主机上的app
这个文件夹作为两者之间的共享目录,而/usr/share/nginx/html
目录是容器内部对应的共享目录地址。这个设置会覆盖 Nginx 的默认目录。
保存文件并退出编辑器。
我们设置了一个demo页和一个docker-compose.yml
文件,用来配置容器中的web server环境。下一步,我们用 Docker Compose 搭建起这个环境。
Docker Compose的应用
第3步:运行 Docker Compose
配置了这个docker-compose.yml
文件后,我们可以执行 Docker Compose 来启动环境。以下命令将会下载一个必备的 Docker 镜像,为我们要创建的web
服务创建一个容器,并在后台运行。
docker-compose up -d
Docker Compose 这条命令执行后,首先在本地查询是否有配置文件中配置的镜像文件,如果没有。那么他会从 Docker Hub 上直接下载这个镜像。是不是超级方便。运行此命令后,输出结果如下:
kalasearch@chuan-server:~/compose-demo$ docker-compose up -d
Creating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
85434292d1cb: Pull complete
75fcb1e58684: Pull complete
2a8fe5451faf: Pull complete
42ceeab04dd4: Pull complete
Digest: sha256:ee8c35a6944eb3cc415cd4cbeddef13927895d4ffa50b976886e3abe48b3f35a
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done
kalasearch@chuan-server:~/compose-demo$
现在,您的环境已启动并在后台运行。要验证该容器是否处于活动状态,可以运行:
docker-compose ps
这个命令会显示有关正在运行的容器及状态,还有端口映射等信息:
Name Command State Ports
--------------------------------------------------------------------------------
compose-demo_web_1 /docker-entrypoint.sh ngin Up 0.0.0.0:8000->80/tcp...
看到以上输出信息,那么恭喜,已经跑起来啦。
如果你是在本地计算机上,那么可以通过访问localhost:8000
来查看,如果在远程服务器运行,那么可以通过your_server_domain_or_IP:8000
来访问。
最终,浏览器会显示以下内容:
docker compose
我们在docker-compose.yml
文件中设置了让宿主机app
文件夹与容器内/usr/share/nginx/html
目录保持同步的卷。那么如果我们对宿主机本地index.html
文件进行修改,那么容器会自动更新,并在我们刷新网页时,显示出来。 如果想深入了解容器与主机之间的卷共享,可以看我们的《 如何在 Docker 容器和主机之间共享数据》这篇文章。
下一步,我们将学习如何使用 Docker Compose 命令管理容器环境。
第4步:熟悉 Docker Compose 命令
我们已经学习了如何配置 docker-compose.yml
文件,以及如何使用 docker-compose up
。接下来,我们来学习如何使用 Docker Compose 命令来管理容器环境。
首先让我们来检查一下 Niginx 容器的 logs ,我们可以使用logs
命令:
docker-compose logs
执行命令后,我们可以看到:
kalasearch@chuan-server:~/compose-demo$ docker-compose logs
Attaching to compose-demo_web_1
web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1 | 192.168.180.1 - - [18/Jul/2020:06:36:12 +0000] "GET / HTTP/1.1" 200 357 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" "-"
web_1 | 2020/07/18 06:36:12 [error] 29#29: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.180.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.180.134:8000", referrer: "http://192.168.180.134:8000/"
web_1 | 192.168.180.1 - - [18/Jul/2020:06:36:12 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.180.134:8000/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" "-"
暂停环境运行而不更改容器的当前状态:
docker-compose pause
输出的结果:
Output
Pausing compose-demo_web_1 ... done
暂停后恢复运行:
docker-compose unpause
输出的结果:
Output
Unpausing compose-demo_web_1 ... done
如果我们要从系统中删除这个镜像,则可以使用:
docker image rm nginx:alpine
输出结果:
kalasearch@chuan-server:~/compose-demo$ docker image rm nginx:alpine
Untagged: nginx:alpine
Untagged: nginx@sha256:ee8c35a6944eb3cc415cd4cbeddef13927895d4ffa50b976886e3abe48b3f35a
Deleted: sha256:ecd67fe340f9048eaf01f304a37e9be9298480f242cc3e332a8a84c754df7d9a
Deleted: sha256:d67557feec595b4d2fc1740603ccdd70c3cf773d5f815c17200fd2ad739646fa
Deleted: sha256:f487d70ded155a43de3b3c6b840cad2bf241a2121aeb07257861782dfa069019
Deleted: sha256:cb2102d370f43419306fd9edf8d81d2b637b46f99f113c36d8ae81381cb86598
Deleted: sha256:5c2301a9fa5c2cb9e6c34af911adabe6e7ef4544e2fc59538eb1f84597ca42e9
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
如果想了解更多 Docker 命令,可参阅我们的《Docker 入门指南:如何在 Ubuntu 上安装和使用 Docker 》。
结论
本教程中,我们已经了解了如何安装 Docker Compose 以及如何基于 Nginx Web 服务器镜像设置容器环境。以及学习了如何使用 docker-compose
命令管理此环境。
更多关于 docker-compose
命令,可参考 Docker 官方文档。