使用 Link 连接容器

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Docker 是一个强大的应用程序部署工具,但起初可能显得复杂。本挑战将引导你通过链接 Docker 容器来创建一个多容器应用程序。我们将从简单的示例开始,逐步过渡到更复杂的应用程序。即使你是 Docker 的新手,也应该能够轻松跟上。我们将探讨如何使容器之间相互通信,这是使用 Docker 构建健壮应用程序的基本方面。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/start -.-> lab-49351{{"使用 Link 连接容器"}} docker/exec -.-> lab-49351{{"使用 Link 连接容器"}} docker/images -.-> lab-49351{{"使用 Link 连接容器"}} docker/network -.-> lab-49351{{"使用 Link 连接容器"}} docker/build -.-> lab-49351{{"使用 Link 连接容器"}} end

使用 Dockerfile 创建镜像

在链接容器之前,我们需要至少有一个容器化的应用程序。在这一步中,你将为 my-app 镜像创建一个 Dockerfile。这个 Dockerfile 将定义容器内的环境和要运行的应用程序。

任务

本步骤的目标是为你的 my-app 镜像创建一个 Dockerfile。

要求

  • 你的机器上必须安装 Docker。
  • 你应该有一个希望容器化的现有 my-app 应用程序。

示例结果

  1. 为挑战创建必要的文件:

    /home/labex/project/ 路径下创建一个名为 Dockerfile 的新文件,内容如下:

    • 使用 python:3.7-slim 作为基础镜像。
    • 将工作目录设置为 /app
    • 将当前目录的内容复制到容器的 /app 目录中。
    • 安装所需的包。
    • 将端口 80 暴露给外部。
    • 定义一个环境变量(尽管在本示例中未使用,但保留该指令)。
    • 在容器启动时运行 app.py

    在你的项目目录 /home/labex/project/ 中创建一个名为 app.py 的文件,内容如下:

    import os
    
    os.system("wssh --address='0.0.0.0' --port=80")

    在你的项目目录 /home/labex/project/ 中创建一个名为 requirements.txt 的文件,内容如下:

    webssh==1.6.2
    labex:project/ $ pwd
    /home/labex/project
    labex:project/ $ ll
    total 12K
    -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py
    -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile
    -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt
  2. 使用 docker build 命令构建 my-app 镜像。

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
  3. 使用 my-app 镜像启动一个新容器,并注意端口映射。

    labex:project/ $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp
  4. 打开一个网页浏览器并导航到 http://localhost:8080,以验证你的应用程序是否正确运行。

    浏览器中运行的 Web 应用
✨ 查看解决方案并练习

链接两个 Docker 容器

现在我们已经有了一个容器化的应用程序,接下来让我们学习如何链接容器。在这一步中,我们将学习如何链接两个 Docker 容器,使它们能够相互通信。这一过程是创建 Docker 内多服务应用程序的关键。

任务

将一个 Apache Web 服务器容器与一个 MySQL 数据库容器链接起来。

要求

  • 你需要两个 Docker 容器:一个运行 Apache,另一个运行 MySQL。
  • 你的机器上必须安装 Docker。

提示

  • 记得打开一个新的终端来开始这一步,以避免与之前的容器冲突。

示例结果

从 Apache 容器访问 MySQL:

  1. 基于 httpd 镜像启动一个名为 my_apache 的 Apache 容器,将主机端口 80 映射到容器端口 80

    labex:project/ $ docker ps | grep my_apache
    a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp
  2. 启动一个名为 my_mysql 的 MySQL 容器,设置环境变量 MYSQL_ROOT_PASSWORDpassword,使用 mysql 镜像。

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
  3. 将 Apache 容器链接到 MySQL 容器。
    注意:这一步没有直接的命令输出,但链接将在容器的环境变量中可见。你可以使用命令 docker inspect my_apache 检查容器。

    labex:project/ $ docker ps | grep my_app
    859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app
  4. 使用 docker exec 命令从 my_app 容器访问 MySQL 命令行界面(如果你以不同的方式链接,则需要调整命令)。

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
✨ 查看解决方案并练习

链接多个 Docker 容器并使用环境变量

在前一步的基础上,我们现在将探索如何链接多个容器并利用环境变量进行配置。这一步展示了如何创建更复杂和灵活的多容器环境。

任务

启动三个容器:一个运行 Apache,一个运行 MySQL,一个运行自定义应用程序。自定义应用程序应能够访问 MySQL 和 Apache。

要求

  • 你需要三个 Docker 容器:Apache、MySQL 和自定义应用程序。
  • 你的机器上必须安装 Docker。

示例结果

  1. 按照步骤 2 中的描述启动 Apache 和 MySQL 容器。

  2. 启动一个名为 my_app2 的自定义应用程序容器,该容器可以访问 MySQL 和 Apache。

    labex:project/ $ docker ps | grep app2
    8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2
  3. 使用 curl 通过 Apache 容器访问自定义应用程序。

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
✨ 查看解决方案并练习

总结

在本挑战中,你学习了如何将 Docker 容器链接在一起以创建多容器应用程序。我们从单个容器开始,逐步过渡到链接的容器对,最后实现了一个三容器的配置。你现在已经掌握了如何利用容器链接和 docker exec 命令来实现不同服务之间的通信,从而能够构建更复杂的应用程序。继续实验,享受乐趣吧!