如何安装和使用 Docker Compose

卡拉先生
发布于 2020年07月19日 | 上次编辑:2020年07月19日

Docker Compose的使用教程
Docker Compose的使用教程

前言

Docker 是容器的管理软件,容器类似于虚拟机,但它更小巧快捷、对资源友好。虚拟机启动起来就是GB级别,而Docker承载的容器只需要MB甚至KB容量即可。所以同时启动几千个容器也很常见。

对于依赖多种服务的应用程序来说,需要将它们所需的容器编排在一起。当需要使用时,我们得手动一个一个来启动,非常麻烦。对于这个问题,我们可以使用 Docker Compose 来解决,它是用于设置和运行多个容器的 Docker 容器管理工具,通过 Compose ,我们可以使用 YAML 文件来配置多容器应用程序的环境。

在本教程中,我们将学习到如何在 Ubuntu 20.04 服务器上安装 Docker Compose 以及如何使用这个工具。

准备工作

如要跟随本教程学习,首先我们要有一台安装好 Ubuntu 20.04 的服务器:

第一步:安装 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+XYENTER 三步来进行保存退出。

接下来,我们创建 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 定义开始。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的应用
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

我们在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 官方文档

扩展阅读:Docker系列教程

© 2020, 卡拉搜索, Built with ❤️ in San Francisco + Beijing

京ICP备15049164号-3