热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用docker-composeyml文件进行生产?》经验,为你挑选了1个好方法。

我在localhost上有一个docker应用程序,工作正常.我正在运行PHP,Nginx和Mariadb.

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

上面的repo只有一个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

起初我以为只需要一个撰写文件,当我构建图像时,将其推送到docker hub,然后在生产服务器上拉出该图像,容器无法启动.

我做了一些阅读,并有许多在线资源建议使用,从1到4泊坞文件,并检查两个git分支......等等...

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

    如何让docker在本地工作

    究竟何时以及如何构建生产容器.

有人可以帮我解决这个问题吗?



1> atline..:

建议你使用Multiple Compose files:

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

接下来是一个例子:

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

泊坞窗,compose.yml:

web:
  image: example/my_web_app:latest

泊坞窗,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 -ddocker-compose.dev.yml覆盖某些值docker-compose.yml,使你的目标.

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

更新:

你使用build: context: ./mariadb,所以compose总是可以Dockerfile在文件夹中找到mariadb,无论是在本地开发服务器还是prod服务器上.

只是上面会有影像生成上都devprod服务器,这是你跟着一个选项.

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

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

所以你可能不想再在prod服务器上构建图像?

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

泊坞窗,compose.yml:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default

泊坞窗,compose.dev.yml:

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

泊坞窗,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注册表的图片,只需找到Dockerfilein 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)的图片,还记得你在本地开发服务器上完成开发后将图像推送到dockerhub吗?所以不需要再次构建图像​​.


推荐阅读
author-avatar
骁炉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有