Docker - Docker Compose


Docker Compose 简介

Docker Compose 是一个由 Docker 官方开发的开源工具,用于定义和运行多容器的 Docker 应用。如果你想要一次启动多个容器,并且这些容器之间有依赖关系或者需要协同工作,那么 Docker Compose 是一个理想的工具。

Docker - Docker Compose_第1张图片


基本概念

  • Compose 项目: Compose 的目标是处理“项目”。一个项目对应于一个“docker-compose.yml”文件,该文件描述了一组相关的容器和它们的属性。

  • 服务: 在 Compose 中,服务是由 Docker 容器实例化的。一个服务对应于 Docker Compose 配置中的一个“服务定义”。一个服务可能由多个容器组成,这些容器都是从同一个镜像实例化的。

  • 项目: 一个项目是由 Compose 管理的一组容器。这些容器是在同一网络上运行的,由同一个“docker-compose.yml”文件定义的。


✍️ 核心思想

使用 Docker Compose,你可以通过一个 YAML 文件定义多容器应用的服务、网络和卷。然后,使用一个简单的命令,就可以从这个文件启动所有的服务。


常见用途

  1. 开发环境: 开发者可以在本地定义和运行与生产环境相同或类似的环境,无需额外配置。
  2. 持续集成: 在 CI 流程中,可以自动化地启动和停止服务,进行测试。
  3. 生产环境: 通过 Compose 和其他工具(如 Swarm)进行多容器应用的部署。

如何工作

Compose 与 Docker CLI 以及 Docker Engine API 交互,以管理和运行应用的服务。通过 Compose,你可以启动、停止、构建服务,查看服务的日志等。


docker-compose.yml

这是 Docker Compose 的核心。在这个文件中,你定义了所有的服务、网络和卷。这个文件是用 YAML 格式编写的,使得它既简单又易读。

例如, 你可能会有一个 Web 服务、一个后端数据库和一个负载均衡器。每个服务都定义在 docker-compose.yml 文件中,然后可以一次性启动所有服务。


Docker Compose v2 简介

Docker Compose v2 是 Docker Compose 的最新版本,与早期的 Python 版本相比,它带来了许多新功能和优化。最大的变化是它现在是用 Go 语言编写的,并且已经集成到了 Docker CLI 中,作为一个子命令。


主要特点

  1. 集成到 Docker CLI: 与 Docker CLI 更紧密地集成,为用户提供了更流畅的体验。你不再需要单独的 docker-compose 命令,只需使用 docker compose 即可。

  2. Go 语言重写: 使用 Go 语言重写意味着性能的提升和更好的跨平台兼容性。

  3. 新功能和优化: 带来了一些新功能和对旧功能的优化,使得定义和管理多容器应用更加简单和高效。


✍️ 如何使用

  1. 安装: 根据 Docker 官方文档的指引安装 Compose v2。

  2. 替换命令: 早期版本的 Docker Compose 使用 docker-compose 命令,而在 Compose v2 中,你只需使用 docker compose(注意没有“-”)。

  3. 常用命令: 大部分常用的命令和参数与早期版本保持一致。例如,docker compose up 用于启动服务,docker compose down 用于停止服务。


转换注意事项

  • 如果你有脚本或工具依赖于早期版本的 docker-compose 命令,你可能需要更新它们以适应新的命令语法。
  • 虽然 Compose v2 旨在与早期版本兼容,但在迁移过程中仍然可能遇到一些小问题。建议在生产环境中部署前进行充分的测试。

Docker Compose 安装与卸载指南


Docker Compose 简介

Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。通过 Compose,你可以使用 docker-compose.yml 文件来配置应用程序的服务,然后使用一个命令来启动和停止所有服务。


安装方法

  1. 预装在 Docker Desktop:

    • 适用平台: macOS, Windows 10
    • 使用方法: 如果你已经安装了 Docker Desktop,你可以直接使用 docker-compose,因为它已经包含在里面。
      $ docker-compose --version
      docker-compose version 1.27.4, build 40524192
      
  2. 二进制包安装:

    • 适用平台: Linux
    • 使用方法: 从 GitHub 上下载预编译的二进制文件。
      $ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
      $ sudo chmod +x /usr/local/bin/docker-compose
      
  3. PIP 安装:

    • 适用平台: 所有支持 Python 和 pip 的系统,特别是 ARM 架构(如树莓派)。
    • 使用方法: 使用 Python 包管理器 pip 安装。
      $ sudo pip install -U docker-compose
      
  4. bash 补全命令:

    • 为了使使用 docker-compose 更方便,可以安装 bash 补全命令。
      $ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
      

卸载方法

  1. 二进制包安装的卸载:

    $ sudo rm /usr/local/bin/docker-compose
    
  2. PIP 安装的卸载:

    $ sudo pip uninstall docker-compose
    

注意: 选择哪种安装方法取决于你的操作系统和使用习惯。在大多数情况下,二进制包安装是最简单和推荐的方法。但如果你正在使用 ARM 架构(如树莓派)或者喜欢使用 pip,那么 pip 安装也是一个不错的选择。


⚡️ Docker Compose 使用指南


术语解释

  • 服务 (service): 它是一个应用容器。而一个服务可以运行多个使用相同镜像的容器实例。
  • 项目 (project): 一个由多个关联的应用容器组成的完整业务单元。在 Compose 中,管理的基本单位是项目,而一个项目可以包括多个服务。

常见使用场景

构建一个 web 网站,这个网站能够记录并显示页面被访问的次数。这样的一个简单项目通常会包括 web 服务(显示页面)和一个数据库或缓存服务(记录访问次数)。

  1. Web 应用:

    a. 新建一个文件夹并进入该文件夹。

    b. 在此目录中创建 app.py:

    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    
  2. Dockerfile:

    创建一个 Dockerfile 来指定如何构建 web 应用的容器:

    FROM python:3.6-alpine
    ADD . /code
    WORKDIR /code
    RUN pip install redis flask
    CMD ["python", "app.py"]
    
  3. Compose 文件:

    创建一个 docker-compose.yml 文件,这是 Compose 的核心,它定义了项目中的所有服务:

    version: '3'
    services:
    
      web:
        build: .
        ports:
         - "5000:5000"
    
      redis:
        image: "redis:alpine"
    
  4. 运行 Compose 项目:

    使用以下命令启动 Compose 项目:

    $ docker-compose up
    

    然后,访问 http://localhost:5000。每次刷新页面,你会看到计数增加。


小结: 使用 Docker Compose,你可以很容易地定义和管理多容器应用。在这个简单的示例中,我们创建了一个 Flask web 应用和一个 Redis 服务,两者通过 Compose 文件定义并关联起来。


Docker Compose 命令详解


基本格式

Compose 的命令结构为 docker-compose [-f=...] [options] [COMMAND] [ARGS...],其中 COMMAND 是 Compose 提供的具体命令,如 updownlogs 等。


命令选项

  1. -f, --file FILE:

    • 用途: 指定要使用的 Docker Compose 模板文件。
    • 默认: 如果未指定,将使用 docker-compose.yml
    • 示例:
      # 使用特定的模板文件启动服务
      docker-compose -f docker-compose.prod.yml up
      
      形象化解释: 这就像你有多个配置文件,并且你想使用其中一个特定的配置启动应用。
  2. -p, --project-name NAME:

    • 用途: 指定项目的名称。
    • 默认: 如果未指定,将使用当前目录的名称作为项目名称。
    • 示例:
      # 使用特定的项目名称启动服务
      docker-compose -p myproject up
      
      形象化解释: 这就像给你的项目或任务一个特定的名字,使其更容易识别。
  3. --verbose:

    • 用途: 输出更多的调试信息。
    • 示例:
      docker-compose --verbose up
      
      形象化解释: 这就像你在查找问题时需要更详细的日志或信息,这个选项会给你更多的内部信息。
  4. -v, --version:

    • 用途: 显示 Docker Compose 的版本信息。
    • 示例:
      docker-compose --version
      
      形象化解释: 这就像检查你手机或电脑上的应用程序版本。

常见命令

1. build

  • 用途: 用于构建或重建服务。
  • 用法:
    docker-compose build [options] [SERVICE...]
    
  • 参数:
    • --force-rm: 删除构建过程中的临时容器。
    • --no-cache: 构建过程中不使用缓存。
    • --pull: 始终尝试通过 pull 更新镜像。
  • 示例:
    docker-compose build --no-cache web
    
    此命令将构建名为“web”的服务,同时不使用任何缓存。
  • 形象化解释: 想象您正在搭建一座房子,build命令就是告诉工人开始建造,并指明是否使用之前保存的材料(缓存)。

2. config

  • 用途: 校验 Compose 文件并查看配置。
  • 用法:
    docker-compose config
    
  • 参数: 无。
  • 示例:
    docker-compose config
    
    此命令将显示并验证当前目录下的 docker-compose.yml 文件。
  • 形象化解释: 就像检查建筑图纸是否符合规范。

3. down

  • 用途: 停止并移除容器、网络、卷以及镜像。
  • 用法:
    docker-compose down [options]
    
  • 参数:
    • --volumes or -v: 同时移除与项目关联的数据卷。
  • 示例:
    docker-compose down --volumes
    
    此命令将停止并删除所有容器,并移除数据卷。
  • 形象化解释: 就像拆除房子并清除所有与它相关的设施。

4. exec

  • 用途: 在正在运行的容器内执行命令。
  • 用法:
    docker-compose exec [options] SERVICE COMMAND
    
  • 参数:
    • -d: 后台运行。
    • -u: 指定用户。
  • 示例:
    docker-compose exec -u root web bash
    
    此命令将以 root 用户身份在正在运行的“web”服务容器内启动 bash shell。
  • 形象化解释: 就像进入一个正在运行的房子并进行某种操作。

5. images

  • 用途: 列出 Compose 项目使用的镜像。
  • 用法:
    docker-compose images [SERVICE...]
    
  • 示例:
    # 列出项目中的所有使用的镜像。
    docker-compose images
    
  • 形象化解释: 像检查你的冰箱,看看你有什么食材(镜像)可以用来做饭。

6. kill

  • 用途: 强制停止服务容器。
  • 用法:
    docker-compose kill [options] [SERVICE...]
    
  • 参数:
    • -s SIGNAL: 指定发送的信号。
  • 示例:
    # 使用 SIGINT 信号来停止“web”服务容器。
    docker-compose kill -s SIGINT web
    
  • 形象化解释: 像紧急关机按钮,立刻停止一个正在运行的机器(容器)。

7. logs

  • 用途: 查看服务的输出。
  • 用法:
    docker-compose logs [options] [SERVICE...]
    
  • 参数:
    • --no-color: 不使用颜色输出。
  • 示例:
    # 显示“web”服务的输出,但不使用颜色。
    docker-compose logs --no-color web
    
  • 形象化解释: 就像查看一本书的目录,帮助你了解书的内容。

8. pause

  • 用途: 暂停服务容器。

  • 用法:

    docker-compose pause [SERVICE...]
    
  • 示例:

    # 暂停“web”服务容器。
    docker-compose pause web
    

    在此命令执行后,所有与“web”服务相关的容器都会被暂停,但它们的状态并未被终止,可以随时恢复。

    形象化解释: 就像你暂停了一个正在播放的视频,虽然视频暂停了,但你可以随时点击播放按钮继续观看。


9. port

  • 用途: 打印服务的公共端口。
  • 用法:
    docker-compose port [options] SERVICE PRIVATE_PORT
    
  • 参数:
    • --protocol=proto: 指定端口协议,tcp(默认值)或者 udp。
  • 示例:
    # 显示“web”服务的 8080 端口映射到主机的哪个端口。
    docker-compose port web 8080
    
  • 形象化解释: 类似于你家的门牌号,告诉你进入某个房间(服务)的门是哪一个。

10. ps

  • 用途: 列出项目中的所有容器,显示容器的状态、端口等信息。

  • 用法:

    docker-compose ps [options] [SERVICE...]
    
  • 参数:

    • -q: 只打印容器的 ID 信息。
  • 示例:

    # 查看所有服务的容器状态
    docker-compose ps
    

    执行此命令将会显示项目中所有容器的列表,包括其名称、命令、状态、端口等信息。

    形象化解释: 就像查看一个管理面板,列出当前项目中运行的所有任务及其状态。


11. pull

  • 用途: 拉取服务所依赖的镜像。

  • 用法:

    docker-compose pull [options] [SERVICE...]
    
  • 参数:

    • --ignore-pull-failures: 在拉取过程中忽略错误。
  • 示例:

    # 拉取“web”服务所依赖的镜像
    docker-compose pull web
    

    执行此命令将会从 Docker Hub 或其他配置的镜像仓库中拉取“web”服务在 docker-compose.yml 文件中指定的镜像。

    形象化解释: 就像你从一个云存储服务下载文件,pull 命令允许你从镜像仓库下载所需的镜像到本地。


12. push

  • 用途: 将服务镜像推送到 Docker Hub。
  • 用法:
    docker-compose push [options] [SERVICE...]
    
  • 参数:
    • --ignore-push-failures: 在推送过程中忽略错误。
  • 示例:
    # 将“web”服务的镜像推送到 Docker Hub。
    docker-compose push web
    
  • 形象化解释: 就像把你做的蛋糕(镜像)放到商店里卖。

13. restart

  • 用途: 重新启动指定的服务。
  • 用法:
    docker-compose restart [options] [SERVICE...]
    
  • 参数:
    • -t, --timeout TIMEOUT: 在重启前停止容器的超时(默认为 10 秒)。
  • 示例:
    # 重新启动“web”服务
    docker-compose restart web
    
  • 形象化解释: 就像你重启一个正在运行的应用或电脑,这个命令重启服务。

14. rm

  • 用途: 删除项目中已停止的容器。
  • 用法:
    docker-compose rm [options] [SERVICE...]
    
  • 参数:
    • -f, --force: 不询问直接删除。
    • -s: 停止和删除。
    • -v: 同时删除与容器相关的数据卷。
  • 示例:
    # 删除已停止的“web”容器
    docker-compose rm web
    
    • 形象化解释: 如果你的桌面上有许多不再使用的文件,你可能会选择删除它们以释放空间。同样,此命令删除不再需要的容器。

15. run

  • 用途: 在指定的服务上执行一次性命令。
  • 用法:
    docker-compose run [options] SERVICE [COMMAND]
    
  • 参数:
    • --name NAME: 为容器指定一个名字。
    • -d: 后台运行。
    • --rm: 命令完成后自动删除容器。
    • ...: 还有许多其他参数。
  • 示例:
    # 在“web”服务容器上执行`ls`命令
    docker-compose run web ls
    
  • 形象化解释: 就像你在电脑上打开命令行窗口执行一个命令,这个命令让你在服务容器内执行特定命令。

16. scale

  • 用途: 设置指定服务的容器数量。
  • 用法:
    docker-compose scale SERVICE=NUM
    
  • 示例:
    # 将“web”服务的容器数量设置为3
    docker-compose scale web=3
    
  • 形象化解释: 像你有一家餐厅,当顾客多时,你可能需要增加更多的员工。这个命令就是告诉Docker你需要多少个“员工”或容器来运行服务。

17. start

  • 用途: 启动已停止的服务容器。
  • 用法:
    docker-compose start [SERVICE...]
    
  • 示例:
    # 启动已停止的“web”服务容器
    docker-compose start web
    
  • 形象化解释: 就像你有一个停止工作的机器,这个命令可以启动这个机器,让它再次工作。

18. stop

  • 用途: 停止正在运行的服务容器。
  • 用法:
    docker-compose stop [options] [SERVICE...]
    
  • 参数:
    • -t, --timeout TIMEOUT: 指定停止容器前的超时时间(默认为 10 秒)。
  • 示例:
    # 停止“web”服务
    docker-compose stop web
    
  • 形象化解释: 就像你关闭一个正在运行的应用或设备,这个命令会停止服务。

19. top

  • 用途: 显示运行在指定服务容器中的进程。
  • 用法:
    docker-compose top [SERVICE...]
    
  • 示例:
    # 显示“web”服务容器中的进程
    docker-compose top web
    
  • 形象化解释: 就像你查看任务管理器来看哪些程序正在运行,这个命令让你看到容器内部正在运行的进程。

20. unpause

  • 用途: 恢复已暂停的服务。
  • 用法:
    docker-compose unpause [SERVICE...]
    
  • 示例:
    # 恢复暂停的“web”服务
    docker-compose unpause web
    
  • 形象化解释: 如果你暂停了音乐或视频,这个命令就像按下播放按钮,使音乐或视频继续播放。

21. up

  • 用途: 启动并运行整个应用。
  • 用法:
    docker-compose up [options] [SERVICE...]
    
  • 参数:
    • -d: 在后台运行。
    • --no-color: 不使用颜色输出。
    • --no-deps: 不启动服务的依赖。
    • --force-recreate: 强制重新创建容器。
    • --no-recreate: 不重新创建容器。
    • --no-build: 不自动构建镜像。
    • -t, --timeout TIMEOUT: 指定停止容器前的超时时间。
  • 示例:
    # 启动并运行“web”服务
    docker-compose up web
    
  • 形象化解释: 这就像启动你的电脑并打开所有你需要的应用程序,这个命令启动并运行你在 docker-compose.yml 文件中定义的所有服务。

22. version

  • 用途: 显示 Docker Compose 的版本信息。
  • 用法:
    docker-compose version
    
  • 示例:
    docker-compose version
    
  • 形象化解释: 这就像检查你手机或电脑的软件版本,这个命令告诉你正在使用的 Docker Compose 的版本。

Compose 模板文件

Docker Compose 模板文件是 Docker Compose 的核心,它定义了一组容器及其配置,使用户能够一次性启动和停止一组相关的容器。下面是关于 Compose 模板文件的一些关键说明和指令的详细描述:

  • 模板文件:这是 Docker Compose 使用的配置文件,默认为 docker-compose.yml
  • 版本:指示 Docker Compose 模板的版本,例如 version: "3".
  • 服务:定义了一个容器的配置,如镜像、端口、环境变量等。

读取变量

Docker Compose 提供了一种动态地从系统环境变量和当前目录下的 .env 文件中读取变量的能力,从而为配置增添了灵活性。这意味着,你可以根据不同的环境或需求来调整配置,而无需直接修改 Compose 文件。

如何工作?

  1. 从环境变量直接读取:

    • 你可以在 Compose 文件中使用 ${VARIABLE_NAME} 的格式来引用环境变量。例如,以下的 Compose 文件:

      version: "3"
      services:
        db:
          image: "mongo:${MONGO_VERSION}"
      
    • 执行以下命令:

      MONGO_VERSION=3.2 docker-compose up
      

      Compose 会使用环境变量的值替换 ${MONGO_VERSION},从而使用 mongo:3.2 镜像启动容器。

  2. .env 文件读取:

    • 如果 Compose 文件所在的目录下有一个 .env 文件,Compose 会自动从这个文件中读取环境变量。这为配置提供了一个方便的方式,尤其是当有多个要设置的环境变量或不希望在命令行中显示这些值时。

    • 例如,.env 文件内容如下:

      # 支持 # 号注释
      MONGO_VERSION=3.6
      

      当你执行 docker-compose up 时,Compose 会读取 .env 文件并使用 mongo:3.6 镜像启动容器。

形象化解释:

想象 Compose 文件就像一个️ 菜单,而环境变量或 .env 文件就像是客人的 特殊要求。当你为客人准备食物时,你会根据这些特殊要求来调整食谱,确保满足客人的需求。这样,你不需要为每个客人的特殊要求都准备一个单独的菜单,只需调整现有的菜单即可。


主要指令

1. build:

  • 用途: 指定 Dockerfile 的路径。Compose 会使用它来自动构建这个镜像,然后使用这个镜像。
  • 示例:
    version: '3'
    services:
      webapp:
        build: ./dir
    
    形象化解释: 就像手工制作一个食谱,然后按照食谱准备食物。

2. image:

  • 用途: 指定要使用的容器镜像。
  • 示例:
    image: ubuntu
    
    形象化解释: 就像从菜单中选择一个预先制作的食物。

3. ports:

  • 用途: 定义容器的端口映射。
  • 示例:
    ports:
      - "3000:3000"
    
    形象化解释: 就像为客户提供从外部访问店内的门。

4. environment:

  • 用途: 定义容器内的环境变量。
  • 示例:
    environment:
      - RACK_ENV=development
    
    形象化解释: 就像设置餐厅的氛围或温度。

5. volumes:

  • 用途: 指定数据卷的挂载路径。
  • 示例:
    volumes:
      - /var/lib/mysql
      - cache/:/tmp/cache
    
    形象化解释: 就像为餐厅指定存放食材的冷藏室或储藏室。

6. links:

  • 用途: (已弃用,不推荐)链接到其他服务容器。
  • 示例:
    links:
      - db
    
    形象化解释: 就像连接餐厅的不同部分或区域。

7. depends_on:

  • 用途: 指定容器的启动依赖关系。
  • 示例:
    depends_on:
      - db
      - redis
    
    形象化解释: 例如,在打开餐厅前确保所有食材和工具都已准备好。

8. networks:

  • 用途: 指定容器连接的网络。
  • 示例:
    networks:
      - frontend
      - backend
    
    形象化解释: 就像为餐厅设置不同的通讯频道或区域。

9. command:

  • 用途: 覆盖容器启动后默认执行的命令。
  • 示例:
    command: echo "hello world"
    
    形象化解释: 就像改变餐厅开门后的第一首播放的歌曲。

10. cap_add, cap_drop:

  • 用途: 指定容器的内核能力(capacity)。
  • 示例:
    cap_add:
      - ALL
    cap_drop:
      - NET_ADMIN
    
    形象化解释: 就像为员工分配或撤销某些权限或职责。

11. env_file:

  • 用途: 从文件中导入环境变量。
  • 示例:
    env_file:
      - ./common.env
      - ./apps/web.env
    
    形象化解释: 就像从多个食谱书中找到所需的食材。

12. environment:

  • 用途: 设置环境变量。
  • 示例:
    environment:
      RACK_ENV: development
      SESSION_SECRET:
    
    形象化解释: 就像为餐厅设置氛围或主题。

13. expose:

  • 用途: 暴露端口但不在宿主机上映射它们。
  • 示例:
    expose:
      - "3000"
    
    形象化解释: 就像一个专供员工使用的门,客人看不到。

14. external_links:

  • 用途: 链接到 Compose 文件外部的容器。
  • 示例:
    external_links:
      - redis_1
      - project_db_1:mysql
    
    形象化解释: 就像与餐厅外部的供应商建立联系。

15. healthcheck:

  • 用途: 检查容器是否健康运行。
  • 示例:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
    
    形象化解释: 就像定期检查食材是否新鲜。

16. image:

  • 用途: 指定容器的镜像。
  • 示例:
    image: ubuntu:latest
    
    形象化解释: 就像选择餐厅的主菜。

17. labels:

  • 用途: 添加容器的元数据标签。
  • 示例:
    labels:
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
    
    形象化解释: 就像给餐厅的每个区域贴上说明标签。

18. network_mode:

  • 用途: 设置网络模式。
  • 示例:
    network_mode: "bridge"
    
    形象化解释: 就像选择餐厅的内部通信方式。

19. networks:

  • 用途: 配置容器连接的网络。
  • 示例:
    networks:
      some-network:
      other-network:
    
    形象化解释: 就像为餐厅的各个房间设置专门的通信线路。

20. pid:

  • 用途: 共享主机系统的进程命名空间。
  • 示例:
    pid: "host"
    
    形象化解释: 就像让餐厅的员工能在所有房间之间自由移动。

21. ports:

  • 用途: 映射容器的端口到宿主机上。
  • 示例:
    ports:
      - "8000:8000"
    
    形象化解释: 就像为餐厅的大门安装一个门牌号。

22. secrets:

  • 用途: 存储敏感数据。
  • 示例:
    secrets:
      db_password:
        file: ./db_password.txt
    
    形象化解释: 就像餐厅有一个保险箱来存放重要文件。

23. security_opt:

  • 用途: 设置容器的安全选项。
  • 示例:
    security_opt:
      - seccomp:unconfined
    
    形象化解释: 就像设置餐厅的安全措施。

24. stop_signal:

  • 用途: 设置一个信号来停止容器。
  • 示例:
    stop_signal: SIGUSR1
    
    形象化解释: 就像一个特定的哨声来通知餐厅员工下班。

25. sysctls:

  • 用途: 设置容器的内核参数。
  • 示例:
    sysctls:
      net.ipv4.ip_forward: 1
    
    形象化解释: 调整餐厅的内部设置以满足特定需求。

26. ulimits:

  • 用途: 设置容器的 ulimits 选项。
  • 示例:
    ulimits:
      nproc: 65535
    
    形象化解释: 就像为餐厅设置最大客户数量。

27. volumes:

  • 用途: 设置数据卷挂载的路径。
  • 示例:
    volumes:
      - /data:/data
    
    形象化解释: 就像在餐厅的储藏室里为食材和酒找到一个地方。

28. entrypoint:

  • 用途: 指定容器启动后执行的入口文件。
  • 示例:
    entrypoint: /code/entrypoint.sh
    
    形象化解释: 就像当你进入餐厅时,有一个迎宾员来欢迎你。

29. user:

  • 用途: 指定容器中运行应用的用户名。
  • 示例:
    user: nginx
    
    形象化解释: 就像在餐厅里,有个员工负责特定任务。

30. working_dir:

  • 用途: 指定容器中的工作目录。
  • 示例:
    working_dir: /code
    
    形象化解释: 就像在餐厅里为厨师指定一个特定的工作区域。

31. domainname, hostname, mac_address:

  • 用途: 指定容器中的搜索域名、主机名、MAC 地址等。
  • 示例:
    domainname: your_website.com
    hostname: test
    mac_address: 08-00-27-00-0C-0A
    
    形象化解释: 就像为餐厅取个名字,分个区域,并给每个区域一个编号。

32. privileged:

  • 用途: 允许容器中运行一些特权命令。
  • 示例:
    privileged: true
    
    形象化解释: 就像给餐厅的某些员工特权,允许他们进入特定的区域。

33. restart:

  • 用途: 指定容器的重启策略。
  • 示例:
    restart: always
    
    形象化解释: 就像每次餐厅关闭后,第二天都会重新开放。

34. read_only:

  • 用途: 以只读模式挂载容器的 root 文件系统。
  • 示例:
    read_only: true
    
    形象化解释: 就像有些餐厅的房间只允许特定的员工进入,不允许客人进入。

35. stdin_open, tty:

  • 用途: 打开标准输入,并模拟一个伪终端。
  • 示例:
    stdin_open: true
    tty: true
    
    形象化解释: 就像餐厅有一个服务台,客户可以直接和员工交谈。

Docker 网络问题


问题描述


  • 在使用 Docker Compose 部署服务时,遇到网络通信问题。
  • 不能通过 127.0.0.1 加端口号访问其他容器。
  • 需要通过虚拟 IP 地址进行容器间通信。
  • 希望能通过本机 IP 地址实现容器间通信。

解决方案


  1. 内部网络通信:

    • 使用 Docker Compose 默认创建的内部网络。
    • 服务可以使用其他服务的名称进行通信。
    • 例如,服务 A 可以通过名称 B 连接到服务 B
  2. 端口映射:

    • 确保正确配置了端口映射。
    • 通过主机 IP 和映射端口访问服务。
    • docker-compose.yml 中配置,如 ports: - "5000:5000"
  3. 桥接网络使用:

    • docker-compose.yml 设置 network_modebridge
    • 允许容器通过虚拟桥接器通信。
    • 容器可以通过主机 IP 和映射端口访问。
  4. 主机网络模式:

    • network_mode 设置为 host
    • 容器共享主机的网络堆栈。
    • ⚠️ 注意: 这可能会带来安全风险。

相关 Docker 命令:

  • 查看所有容器 IP 地址:

    # 查看所有容器的 IP 地址
    docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
    
  • 提取特定容器 IP:

    # 提取特定容器的 IP 地址
    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_id>
    
  • 容器部署和管理:

    # 清理并复制新的配置文件
    rm -rf /root/mall4cloud/
    cp -R /mnt/d/Ubuntu/mall4cloud/ /root/mall4cloud
    cp /mnt/d/Ubuntu/mall4cloud/docker-compose.yaml /root/mall4cloud/docker-compose.yaml
    chmod -R 777 /root/mall4cloud/
    
    # 启动 Docker Compose 服务
    docker-compose up -d --build
    
    # 停止并移除容器
    docker-compose down
    
    # 查看容器日志
    docker-compose logs -f
    

你可能感兴趣的:(Docker,docker,容器,运维)