介绍
Docker 简化了在容器中管理应用程序进程的过程。虽然容器在某些方面类似于虚拟机,但它们更轻量级和资源友好。这允许开发人员将应用程序环境分解为多个独立的服务。
对于依赖于多个服务的应用程序,编排所有容器以一起启动、通信和关闭可能很快变得笨拙。Docker Compose是一种工具,允许您根据 YAML 文件中设置的定义运行多容器应用程序环境。它使用服务定义来构建具有多个容器的完全可定制的环境,这些容器可以共享网络和数据量。
在本指南中,我们将演示如何在 Ubuntu 20.04 服务器上安装 Docker Compose 以及如何开始使用此工具。
先决条件
要阅读本文,您需要:
- 以具有 sudo 权限的非 root 用户身份访问 Ubuntu 20.04 本地计算机或开发服务器。如果您使用远程服务器,建议安装活动防火墙。要设置这些,请参阅我们的 Ubuntu 20.04 初始服务器设置指南。
- 按照如何在 Ubuntu 20.04 上安装和使用 Docker 的步骤 1 和 2在您的服务器或本地计算机上安装 Docker。
第 1 步 – 安装 Docker Compose
为了确保我们获得 Docker Compose 的最新稳定版本,我们将从其官方 Github 存储库下载该软件。
首先,在他们的发布页面确认可用的最新版本。在撰写本文时,最新的稳定版本是1.27.4
.
以下命令将下载1.27.4
发行版并将可执行文件保存在/usr/local/bin/docker-compose
,这将使该软件可全局访问为docker-compose
:
- sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/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
你会看到类似这样的输出:
Outputdocker-compose version 1.27.4, build 40524192
Docker Compose 现在已成功安装在您的系统上。在下一节中,我们将看到如何docker-compose.yml
使用此工具设置文件并启动和运行容器化环境。
步骤 2 — 设置docker-compose.yml
文件
为了演示如何设置docker-compose.yml
文件并使用 Docker Compose,我们将使用来自Docker Hub(公共 Docker 注册表)的官方Nginx 映像创建一个 Web 服务器环境。此容器化环境将提供单个静态 HTML 文件。
首先在您的主文件夹中创建一个新目录,然后进入该目录:
- mkdir ~/compose-demo
- cd ~/compose-demo
在此目录中,设置一个应用程序文件夹作为 Nginx 环境的文档根目录:
- mkdir app
使用您喜欢的文本编辑器,index.html
在app
文件夹中创建一个新文件:
- nano app/index.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>
</body>
</html>
完成后保存并关闭文件。如果您正在使用nano
,则可以通过键入CTRL+X
、 然后Y
和ENTER
进行确认。
接下来,创建docker-compose.yml
文件:
- nano docker-compose.yml
在您的docker-compose.yml
文件中插入以下内容:
version: '3.7'
services:
web:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app:/usr/share/nginx/html
该docker-compose.yml
文件通常从version
定义开始。这将告诉 Docker Compose 我们使用的是哪个配置版本。
然后我们有services
块,我们在其中设置作为此环境一部分的服务。在我们的例子中,我们有一个名为 的服务web
。此服务使用nginx:alpine
图像并使用ports
指令设置端口重定向。主机(运行 Docker Compose 的系统)端口8000
上的所有请求都将重定向到端口上的容器,Nginx 将在其中运行。web
80
该volumes
指令将在主机和容器之间创建一个共享卷。这将app
与容器共享本地文件夹,卷将位于/usr/share/nginx/html
容器内部,然后将覆盖 Nginx 的默认文档根目录。
保存并关闭文件。
我们已经设置了一个演示页面和一个docker-compose.yml
文件来创建一个容器化的 Web 服务器环境来为其提供服务。在下一步中,我们将使用 Docker Compose 提供此环境。
第 3 步 – 运行 Docker Compose
随着docker-compose.yml
到位文件中,我们现在可以执行多克撰写,使我们的环境了。以下命令将下载必要的 Docker 镜像,为web
服务创建一个容器,并在后台模式下运行容器化环境:
- docker-compose up -d
Docker Compose 将首先在您的本地系统上查找定义的镜像,如果找不到该镜像,它将从 Docker Hub 下载该镜像。你会看到这样的输出:
OutputCreating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done
您的环境现已启动并在后台运行。要验证容器是否处于活动状态,您可以运行:
- docker-compose ps
此命令将显示有关正在运行的容器及其状态的信息,以及当前存在的任何端口重定向:
Output 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.yml
文件中设置的共享卷使您的app
文件夹文件与容器的文档根目录保持同步。如果您对index.html
文件进行任何更改,它们将被容器自动选取,从而在您重新加载页面时反映在您的浏览器上。
在下一步中,您将看到如何使用 Docker Compose 命令管理您的容器化环境。
第 4 步 – 熟悉 Docker Compose 命令
您已经了解了如何设置docker-compose.yml
文件并使用docker-compose up
. 您现在将看到如何使用 Docker Compose 命令来管理您的容器化环境并与之交互。
要检查 Nginx 容器生成的日志,您可以使用以下logs
命令:
- docker-compose logs
你会看到类似这样的输出:
OutputAttaching 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 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
如果要暂停环境执行而不更改容器的当前状态,可以使用:
- docker-compose pause
OutputPausing compose-demo_web_1 ... done
在发出暂停后恢复执行:
- docker-compose unpause
OutputUnpausing compose-demo_web_1 ... done
该stop
命令将终止容器执行,但不会破坏与容器相关的任何数据:
- docker-compose stop
OutputStopping compose-demo_web_1 ... done
如果要删除与此容器化环境关联的容器、网络和卷,请使用以下down
命令:
- docker-compose down
OutputRemoving compose-demo_web_1 ... done
Removing network compose-demo_default
请注意,这不会删除 Docker Compose 用来启动您的环境的基本映像(在我们的示例中为nginx:alpine
)。这样,每当您使用 重新启动您的环境时docker-compose up
,该过程都会快得多,因为该映像已经在您的系统上。
如果您还想从系统中删除基本映像,您可以使用:
- docker image rm nginx:alpine
OutputUntagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
注意:请参阅我们关于如何安装和使用 Docker 的指南,以获取有关 Docker 命令的更详细参考。
结论
在本指南中,我们已经了解了如何安装 Docker Compose 并基于 Nginx Web 服务器映像设置容器化环境。我们还看到了如何使用 Compose 命令管理这个环境。
有关所有可用docker-compose
命令的完整参考,请查看官方文档。