介绍
Docker 简化了在容器中管理应用程序进程的过程。 虽然容器在某些方面类似于虚拟机,但它们更轻量级和资源友好。 这允许开发人员将应用程序环境分解为多个独立的服务。
对于依赖多个服务的应用程序,编排所有容器以一起启动、通信和关闭可能很快变得笨拙。 Docker Compose 是一种工具,可让您根据 YAML 文件中设置的定义运行多容器应用程序环境。 它使用服务定义来构建完全可定制的环境,其中包含可以共享网络和数据量的多个容器。
在本指南中,您将演示如何在 Ubuntu 20.04 服务器上安装 Docker Compose,以及如何开始使用此工具。
先决条件
要阅读本文,您将需要:
- 以具有 sudo 权限的非 root 用户身份访问 Ubuntu 20.04 本地计算机或开发服务器。 如果您使用的是远程服务器,建议安装活动防火墙。 要设置这些,请参阅我们的 Ubuntu 20.04 初始服务器设置指南。
- 按照 如何在 Ubuntu 20.04 上安装和使用 Docker 的 步骤 1 和 2 将 Docker 安装在您的服务器或本地计算机上。
Note: This tutorial will guide you through installing Docker Compose v1, which uses docker-compose
. Starting with Docker Compose v2, Docker has migrated towards using the compose
CLI plugin command as documented in our latest Ubuntu 22.04 version of this tutorial, and away from the original docker-compose
. While the installation differs, in general the actual usage involves dropping the hyphen from docker-compose
calls to become docker compose
. For full compatibility details, check the official Docker documentation on command compatibility between the new compose
and the old docker-compose
.
第 1 步 — 安装 Docker Compose
为确保您获得 Docker Compose 的最新稳定版本,您将从其 官方 Github 存储库 下载此软件。
首先,在他们的 发布页面 中确认可用的最新版本。 在撰写本文时,最新的稳定版本是 1.29.2
。
The following command will download the 1.29.2
release and save the executable file at /usr/local/bin/docker-compose
, which will make this software globally accessible as docker-compose
:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.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
您将看到与此类似的输出:
Outputdocker-compose version 1.29.2, build 5becea4c
Docker Compose 现在已成功安装在您的系统上。 在下一节中,您将看到如何设置 docker-compose.yml
文件并使用此工具启动和运行容器化环境。
第 2 步 — 设置 docker-compose.yml
文件
为了演示如何设置 docker-compose.yml
文件并使用 Docker Compose,您将使用来自 Docker Hub 的官方 Nginx 映像 创建一个 Web 服务器环境,公共 Docker 注册表。 此容器化环境将提供单个静态 HTML 文件。
首先在你的主文件夹中创建一个新目录,然后进入它:
mkdir ~/compose-demo cd ~/compose-demo
在此目录中,设置一个应用程序文件夹作为 Nginx 环境的文档根目录:
mkdir app
使用您喜欢的文本编辑器,在 app
文件夹中创建一个新的 index.html
文件:
nano app/index.html
将以下内容放入此文件:
~/compose-demo/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
文件中插入以下内容:
码头工人-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
指令设置端口重定向。 host 机器(运行 Docker Compose 的系统)的端口 8000
上的所有请求都将重定向到端口 [ 上的 web
容器X172X],Nginx 将在其中运行。
volumes
指令将在主机和容器之间创建一个 共享卷。 这将与容器共享本地的 app
文件夹,并且卷将位于容器内的 /usr/share/nginx/html
,然后将覆盖 Nginx 的默认文档根目录。
保存并关闭文件。
您已经设置了一个演示页面和一个 docker-compose.yml
文件来创建一个为其提供服务的容器化 Web 服务器环境。 在下一步中,您将使用 Docker Compose 启动此环境。
第三步——运行 Docker Compose
有了 docker-compose.yml
文件,您现在可以执行 Docker Compose 来启动您的环境。 以下命令将下载必要的 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 套接字的权限错误,这意味着您跳过了 如何在 Ubuntu 20.04 上安装和使用 Docker 的第 2 步。 返回并完成该步骤将启用在没有 sudo
的情况下运行 docker 命令的权限。
您的环境现在已启动并在后台运行。 要验证容器是否处于活动状态,您可以运行:
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
命令的完整参考,请查看 官方文档 。
如果您对 Docker Compose 的更多用法感兴趣,请查看 如何使用 Docker Compose 安装 WordPress 以及 如何使用 Nginx、Let's Encrypt 和 Docker Compose 保护容器化的 Node.js 应用程序。