如何在Rocky Linux 8上安装和使用Docker Compose

639 阅读8分钟

简介

Docker简化了在容器中管理应用程序进程的过程。虽然容器在某些方面类似于虚拟机,但它们更轻巧,对资源更友好。这使得开发者可以将一个应用环境分解成多个孤立的服务。

对于依赖于多个服务的应用程序来说,协调所有的容器一起启动、通信和关闭,很快就会变得难以应付。Docker Compose是一个工具,它允许你根据YAML文件中的定义来运行多容器应用环境。它使用服务定义来构建完全可定制的环境,其中有多个容器,可以共享网络和数据卷。

在本指南中,你将演示如何在Rocky Linux 8服务器上安装Docker Compose以及如何开始使用这个工具。

前提条件

要学习这篇文章,你将需要

  • 以具有sudo权限的非root用户身份访问Rocky Linux 8本地机器或开发服务器。如果你使用的是远程服务器,建议你安装一个有效的防火墙。
  • 在你的服务器或本地机器上安装Docker。

步骤1 - 安装Docker Compose

为了确保你获得最新的Docker Compose稳定版本,你将从Docker官方仓库下载这个软件。

首先,我们来更新软件包数据库。

sudo dnf check-update

接下来,如果你在安装Docker时没有添加官方的Docker仓库,请添加。

sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

虽然Docker没有提供Rocky Linux的特定仓库,但Rocky Linux是基于CentOS的,可以使用相同的仓库。现在你可以安装Docker Compose,它是Docker的一个插件。

sudo dnf install docker-compose-plugin

为了验证安装是否成功,你可以运行。

docker compose version

你会看到类似这样的输出。

Output
Docker Compose version v2.10.2

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

使用你喜欢的文本编辑器,在app 文件夹中创建一个新的index.html 文件。

nano app/index.html

将以下内容放入该文件。

~/compos-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 ,然后输入YENTER 来进行确认。

接下来,创建docker-compose.yml 文件。

nano docker-compose.yml

在你的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 的请求将被重定向到端口80web 容器,那里将运行Nginx。

volumes 指令将在主机和容器之间创建一个共享卷。这将与容器共享本地的app 文件夹,该卷将位于容器内的/usr/share/nginx/html ,然后它将覆盖Nginx的默认文档根。

保存并关闭该文件。

你已经设置了一个演示页面和一个docker-compose.yml 文件,创建了一个容器化的Web服务器环境,将为其服务。在下一步,你将用Docker Compose把这个环境带起来。

第3步 - 运行Docker Compose

有了docker-compose.yml 文件,你现在可以执行Docker Compose来启动你的环境了。下面的命令将下载必要的Docker镜像,为web 服务创建一个容器,并在后台模式下运行该容器化环境。

docker compose up -d

Docker Compose将首先在你的本地系统上寻找所定义的镜像,如果它不能找到该镜像,它将从Docker Hub下载该镜像。你会看到像这样的输出。

Output
Creating 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套接字的权限错误,这意味着你跳过了《如何在Rocky Linux 8上安装和使用Docker》的第二步。返回并完成该步骤,就可以在没有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 Demo Page

你在docker-compose.yml 文件中设置的共享卷使你的app 文件夹文件与容器的文件根同步。如果你对index.html 文件做任何修改,它们将被容器自动接收,从而在你重新加载页面时反映在你的浏览器上。

在下一步,你将看到如何用Docker Compose命令管理你的容器化环境。

第4步 - 熟悉Docker Compose命令

你已经看到了如何设置一个docker-compose.yml 文件,并通过docker compose up 将你的环境建立起来。现在你将看到如何使用Docker Compose命令来管理你的容器化环境并与之互动。

要检查Nginx容器产生的日志,你可以使用logs 命令。

docker compose logs

你会看到类似这样的输出。

Output
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  | 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
Output
Pausing compose-demo_web_1 ... done

来在发出暂停后恢复执行。

docker compose unpause
OutputUnpausing compose-demo_web_1 ... done

stop 命令将终止容器的执行,但它不会破坏与你的容器相关的任何数据。

docker compose stop
Output
Stopping compose-demo_web_1 ... done

如果你想删除与这个容器化环境相关的容器、网络和卷,可以使用down 命令。

docker compose down
Output
Removing compose-demo_web_1 ... done
Removing network compose-demo_default

请注意,这不会删除Docker Compose用来启动环境的基础镜像(在你的例子中,nginx:alpine )。这样,当你用docker compose up ,再次启动你的环境时,由于镜像已经在你的系统上,这个过程会快很多。

如果你想从你的系统中删除基本镜像,你可以使用。

docker image rm nginx:alpine
Output
Untagged: 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 Compose并建立一个基于Nginx网络服务器镜像的容器化环境。你还看到了如何使用Compose命令来管理这个环境。