如何使用docker-compose yml文件进行生产?

时间:2018-10-10 01:06:11

标签: docker docker-compose dockerfile container-image

我在本地主机上有一个docker应用程序,可以正常工作。我在上面运行PHP,Nginx和Mariadb。

这是我正在使用的Docker样板:https://github.com/matchish/skeleton

上面的仓库只有一个docker-compose.yml文件,其中包含以下代码:

version: '3'

services:
    db:
      build:
        context: ./mariadb
      volumes:
          - "./.data/db:/var/lib/mysql"
          - "./logs/mariadb:/var/log/mysql"
      environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
          MYSQL_DATABASE: ${MYSQL_DATABASE}
          MYSQL_USER: ${MYSQL_USER}
          MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      networks:
        - default
    php-fpm:
      build:
          context: ./php7-fpm
          args:
              TIMEZONE: ${TIMEZONE}
      volumes:
          - ${APP_PATH}:/var/www/app
      environment:
          DB_HOST: db
          DB_PORT: 3306
          DB_DATABASE: ${MYSQL_DATABASE}
          DB_USERNAME: ${MYSQL_USER}
          DB_PASSWORD: ${MYSQL_PASSWORD}
      depends_on:
        - db
      networks:
        - default
    nginx:
      build:
        context: ./nginx
        args:
          - 'php-fpm'
          - '9000'
      volumes:
        - ${APP_PATH}:/var/www/app
        - ./logs/nginx/:/var/log/nginx
      ports:
        - "80:80"
        - "443:443"
      depends_on:
        - php-fpm
      networks:
        - default
networks:
  default:
    driver: bridge

起初我以为只需要一个compose文件,当我构建映像时,将其推到docker hub上,然后将该映像拉到生产服务器上,容器无法启动。

我读了一些书,有很多在线资源建议使用,从1到4个docker文件,并检查两个git分支..除其他外...

我知道我至少应该再创建一个名为docker-compose-prod.yml的文件,并且在该文件中,我应该省略volumes:port:属性,但是似乎没有明确的含义指南:

  1. 如何使docker在本地工作

  2. 确切地以及何时构建用于生产的容器。

有人可以帮我清理一下吗?

1 个答案:

答案 0 :(得分:7)

建议您使用Multiple Compose files

  

使用多个Compose文件,您可以针对不同的环境或不同的工作流程自定义Compose应用程序。

接下来是一个示例:

(注意:下一个省略撰写文件的某些元素)

docker-compose.yml:

web:
  image: example/my_web_app:latest

docker-compose.dev.yml:

web:
  ports:
    - 80:80
  • 执行docker-compose -f docker-compose.yml -d将没有端口映射。
  • 执行docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d将使docker-compose.dev.yml覆盖docker-compose.yml的某些目标值。

有关详细信息,请参阅docker doc,这是处理您的情况的官方建议,仅供参考。

已更新

您使用build: context: ./mariadb,因此无论在本地开发服务器还是产品服务器中,compose都可以始终在要构建的文件夹Dockerfile中找到mariadb

如上所述,将同时在devprod服务器上构建图像,这是您可以遵循的一种选择。

您在评论中说的另一种选择:

  

但是在prod服务器上,我只能拉并运行映像,并且该映像必须事先使用prod yml文件构建

所以您可能不想在prod服务器上再次构建映像?

然后,接下来是一个更新的解决方案,仅是一个示例:

docker-compose.yml:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default

docker-compose.dev.yml:

db:
  build:
    context: ./mariadb
  ports:
    - "xxx:xxx"

docker-compose.prod.yml:

db:
  otheroptions_special_for_prod_just_a_example: xxx

1)docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d

这将合并为下一个:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default
  build:
    context: ./mariadb
  ports:
    - "xxx:xxx"

按照docker-compose语法,如果负担build:context,则compose不会从docker注册表中提取docker镜像,只需在Dockerfile中找到context,最后构建一个镜像与您在image中指定的名称,这里是your_maridb_image_name:your_maridb_image_version

然后,您需要将其推入dockerhub,但是您确实需要停止本地容器。

2)docker-compose -f docker-compose.yml -f docker-compose.prod.yml -d

这将合并为下一个:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default
  otheroptions_special_for_prod_just_a_example: xxx

按照docker-compose语法,没有build:context,因此compose将直接从远程注册表(docker hub)中将docker pull镜像,记住在本地上完成开发后将图像推送到dockerhub开发服务器?因此,无需再次构建映像。