使用docker-compose在生产环境中部署docker容器

时间:2020-09-15 02:29:56

标签: docker docker-compose

我创建了以下docker-compose.yml文件来为Django应用构建Docker容器:

version: "2.4"

services:
  db:
    image: postgres:11
    env_file:
      - .env_prod_db
    volumes:
      - db:/var/lib/postgresql/data/
    networks:
      - net
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "10m"

  web:
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - .env_prod_web
    command: gunicorn roster_project.wsgi:application --disable-redirect-access-to-syslog --error-logfile '-' --access-logfile '-' --access-logformat '%(t)s [GUNICORN] %(h)s %(l)s %(u)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' --workers 3 --bind 0.0.0.0:8000
    volumes:
      - static:/roster/webserver/static/
    networks:
      - net
    expose:
      - 8000
    depends_on:
      - db
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "10m"

  nginx:
    build: ./nginx
    ports:
      - 80:80
    volumes:
      - static:/roster/webserver/static/
    networks:
      - net
    depends_on:
      - web
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "10m"

networks:
  net:
    enable_ipv6: true
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: fd02::/64
          gateway: fd02::1

volumes:
  db:
  static:

如果我的应用程序的潜在用户首先从Github下载所有源代码,则可以使用此文件来部署我的应用程序。但是,我希望他们能够仅通过使用docker-compose下载我存储在Docker Hub存储库中的Docker映像来部署应用程序。

如果我将Docker映像上传到Docker Hub仓库,是否需要创建一个额外的docker-compose.yml来引用仓库镜像,以便其他人可以在自己的Docker主机上部署我的应用程序?或者我可以以某种方式将构建和部署要求组合到一个docker-compose.yml文件中?

1 个答案:

答案 0 :(得分:1)

运行docker-compose命令时可以use multiple Compose files。最简单的方法是拥有一个列出标准(通常是面向生产)设置的docker-compose.yml主文件和一个覆盖其设置的docker-compose.override.yml文件。

例如,基本docker-compose.yml文件看起来像:

version: "2.4"

services:
  db:
    image: postgres:11
    volumes:
      - db:/var/lib/postgresql/data/

  web:
    image: me/web
    depends_on:
      - db

  nginx:
    image: me/nginx
    ports:
      - 80:80
    depends_on:
      - web

volumes:
  db:

请注意,我已经删除了所有特定于部署的设置(日志记录配置,手动IP覆盖,环境文件);我正在使用Compose提供的default网络;我避免用Docker卷中的旧内容覆盖静态资产;甚至为我在本地构建的内容提供一个image:名称。

此生产设置与“实际”生产设置之间的差异可以放在单独的docker-compose.production.yml文件中:

version: "2.4"

services:
  db:
    # Note, no image: or other similar settings here;
    # they come from the base docker-compose.yml
    env_file:
      - .env_prod_db
    logging:
      driver: "json-file"
      options:
        max-file: "5"
        max-size: "10m"
  web: # similarly
  db: # similarly

networks:
  default:
    enable_ipv6: true
    # and other settings as necessary

另一方面,对于开发,您需要提供build:信息。 docker-compose.development.yml可以包含:

version: "2.4"

services:
  web:
    build: .
  nginx:
    build: ./nginx

然后,您可以使用符号链接将其中一个作为当前替代文件

ln -sf docker-compose.production.yml docker-compose.override.yml

下游部署者将需要基础docker-compose.yml,其中提到了Docker Hub映像。他们可以使用您认为合适的生产值,也可以使用其他设置。他们不需要其余的应用程序源代码或Dockerfile(尽管它们可能全部都在同一个GitHub存储库中)。