Docker Compose 文件结构

Docker Compose 文件通常使用 YAML 格式,下面是一个完整的 Compase 示例:

# 版本声明
version: '3.8'

# 服务定义
services:
  # 一个容器,即一个服务
  web:
    build:
      context: .
      dockerfile: Dockerfile.web
    ports:
      - "8080:80"
    depends_on:
      - db
      - cache
    environment:
      - DB_HOST=db
      - CACHE_HOST=cache
      - APP_ENV=production
    networks:
      - mynetwork

  # 一个容器,即一个服务
  db:
    image: postgres:13
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - mynetwork

  # 一个容器,即一个服务
  cache:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - cache_data:/data
    networks:
      - mynetwork

# 定义数据卷
volumes:
  db_data:
  cache_data:

# 定义网络
networks:
  mynetwork:
    driver: bridge

下面将对 Docker Compose 的各个部分进行详细介绍。

版本声明

Docker Compose 中需要指定版本信息,在文件开头,使用 version 进行版本声明。例如:

version: '3'

目前,常用的版本是 “3.x”,它引入了一些新的功能和语法改进。

服务定义

使用 services 进行服务定义,服务定义用来定义应用程序中的各个服务。每个服务都是一个独立的容器,具有自己的配置,如:镜像、端口映射、环境变量等。例如:

# 定义服务
services:
  # 定义一个服务
  web:
    image: nginx
    ports:
      - "80:80"
  # 定义另一个服务
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password

在上面的例子中,定义了两个服务:“web” 和 “db”:

  • web  服务使用 Nginx 镜像,将容器的 80 端口映射到宿主机的 80 端口。

  • db  服务使用 MySQL 镜像,并设置了环境变量 MYSQL_ROOT_PASSWORD 为“password”。

服务配置选项

每个服务可以有多个配置选项,如网络、数据卷、依赖等,例如:

# 服务定义
services:
  # 一个容器,即一个服务
  web:
    # 容器构建信息
    build:
      context: .
      dockerfile: Dockerfile.web
    # 容器的端口映射
    ports:
      - "8080:80"
    # 容器的依赖
    depends_on:
      - db
      - cache
    # 容器的环境变量
    environment:
      - DB_HOST=db
      - CACHE_HOST=cache
      - APP_ENV=production
    # 容器的网络配置
    networks:
      - mynetwork

一个服务定义可以包括以下常见的选项:

image(镜像)

使用 image 指定当前服务使用的镜像名称。可以是本地镜像、Docker Hub 上的镜像或私有仓库中的镜像。

build(源码构建镜像)

如果服务需要从源代码构建镜像,可以使用 build 选项指定构建上下文和 Dockerfile 的路径。例如:

# 服务定义
services:
  # 一个容器,即一个服务
  web:
    build:
      context: .
      dockerfile: Dockerfile.web

在上面的例子中,“web” 服务将从当前目录(上下文为 “.”)中的 Dockerfile 构建镜像。

ports(端口映射)

使用 ports 定义容器与宿主机之间的端口映射。格式为 “宿主机端口:容器端口”。例如:“8080:80” 表示将宿主机的 8080 端口映射到容器的 80 端口。例如:

# 服务定义
services:
  # 一个容器,即一个服务
  web:
    # ...
    # 容器的端口映射
    ports:
      - "8080:80"

如果要映射多个端口,如下:

# 服务定义
services:
  # 一个容器,即一个服务
  web:
    # ...
    # 容器的端口映射
    ports:
      - "8080:80"
      - "8082:82"

environment(设置环境变量)

使用 environment 设置环境变量,可以是一个字典或一个数组。例如:

db:
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: mydatabase

上例中定义了一个名为 db 的服务,其中:

  • MYSQL_ROOT_PASSWORD: password  这是为 MySQL 数据库设置根用户的密码为 password。在实际使用中,应使用强密码以确保数据库的安全性。

  • MYSQL_DATABASE: mydatabase  这是指定在 MySQL 数据库中创建一个名为 mydatabase 的数据库。当容器启动时,如果该数据库不存在,MySQL 会自动创建它。

volumes(挂载卷)

使用 volumes 实现挂载卷,可以是宿主机目录或数据卷。例如:

web:
  volumes:
    - ./app:/app
    - web_data:/usr/share/nginx/html

以下是对这段配置的解释:

  • ./app:/app  将主机上当前目录下的 app 目录挂载到容器内的 /app 路径。这种方式可以方便地在开发过程中让容器访问主机上的应用代码,以便进行实时的开发和调试。例如,在主机上修改代码后,容器可以立即看到这些变化,无需重新构建容器。

  • web_data:/usr/share/nginx/html  将名为 web_data 的卷挂载到容器内的 /usr/share/nginx/html 路径。如果 web_data 卷不存在,Docker Compose 启动时会自动创建它。这个卷可以用于存储网站的静态文件,确保数据的持久性。

depends_on(定义依赖)

使用 depends_on 指定服务之间的依赖关系。例如:

web:
  # 定义依赖
  depends_on:
    - db

以下是对这段配置的解释:

  • depends_on: - db  表示 web 服务依赖于名为 db 的服务。这意味着在启动 web 服务之前,Docker Compose 会确保 db 服务已经启动并处于运行状态。这样可以避免在数据库服务尚未准备好时,web 服务尝试连接数据库而导致的错误。

定义数据卷

在 Docker Compose 中,使用 volumes 定义数据卷。数据卷可以在多个服务之间共享数据。例如:

# 定义数据卷
volumes:
  # 定义名为 myvolume 的数据卷
  myvolume:
    # 指定驱动类型
    driver: local
    # 指定驱动选项参数
    driver_opts:
      # 指定数据卷类型
      type: none
      # 指定主机上的位置
      device: /path/to/host/directory
      # 指定使用方式
      o: bind

这段配置是在定义一个名为 myvolume 的数据卷,并指定了一些参数来控制这个数据卷的行为。详细说明如下:

  • driver 参数:

    • driver: local  表示使用本地驱动来创建这个数据卷。在 Docker 中,不同的驱动可以用于不同的存储后端,而 local 驱动通常表示使用本地文件系统来存储数据卷的数据。

  • driver_opts 参数:

    • type: none  这里明确指定了数据卷的类型为 none。结合 local 驱动,这通常意味着直接使用主机的文件系统,而不经过特定的存储后端类型的处理。

    • device: /path/to/host/directory  指定了主机上的具体目录路径。这个路径将作为数据卷在主机上的存储位置。容器中挂载这个数据卷时,实际上就是访问这个主机目录下的内容。

    • o: bind  这个参数表示使用绑定挂载(bind mount)的方式。绑定挂载允许将主机上的一个目录直接挂载到容器中,使得容器可以访问主机目录中的文件和目录,并且容器中的修改也会反映到主机目录中(如果权限允许的话)。

总的来说,这段配置定义了一个名为 myvolume 的数据卷,使用本地驱动和绑定挂载的方式,将主机上的 /path/to/host/directory 目录与容器中的特定路径进行关联,实现数据的共享和持久化。这样可以方便地在容器和主机之间共享文件,并且确保数据在容器被删除或重新创建时仍然得以保留。

定义网络

在 Docker Compose 中,使用 networks 定义网络,可以让服务在同一个网络中进行通信。例如:

# 定义网络
networks:
  # 定义名为 mynetwork 的网络
  mynetwork:
    # 指定网络的驱动类型
    driver: bridge

这段配置定义了一个名为 mynetwork 的网络。参数详细说明:

  • driver: bridge  指定了网络的驱动类型为 bridge。这是 Docker 中一种常见的网络驱动,它创建一个虚拟的以太网桥接网络。使用 bridge 驱动的网络具有以下特点:

    • 容器隔离:每个容器连接到这个网络时,会在容器内部创建一个虚拟网络接口,与其他容器在网络层面上进行隔离。这有助于提高安全性和避免网络冲突。

    • 容器间通信:尽管容器在网络层面上是隔离的,但连接到同一个 bridge 网络的容器可以通过容器名称或 IP 地址相互通信。这样可以方便地在不同的服务之间进行网络通信,而无需暴露容器的端口到主机上。

    • 与主机网络隔离:bridge 网络与主机的网络是隔离的,容器在这个网络中的 IP 地址通常是由 Docker 分配的私有 IP 地址范围。这可以避免容器与主机上的其他服务发生 IP 地址冲突。

总之,Docker Compose 文件结构清晰,易于理解和维护。通过定义多个服务和它们的配置选项,可以轻松地管理多容器应用程序的部署和运行。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号