V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiboshi
V2EX  ›  Docker

怎么才是 docker 最佳实践

  •  
  •   hiboshi · 2019-03-08 10:32:45 +08:00 · 5694 次点击
    这是一个创建于 2092 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目是 php-fpm + nginx

    我第一次将 docker 用在生产环境,也是使用 jenkins 构建的。

    我先说下我的流程 jenkins

    1.在 jenkins 执行 shell 2.docker build -t php-fpm:v1 . docker build -t nginx:v1 . 3.推送到私有仓库。docker push 4.jenkins 发送 docker-compse.yml 到远程服务器( service 里面的 image 使用的是最新版本的 image ) 5.远程执行 docker-compose up -d

    现在遇到下面几个问题 1.由于 php-fpm+nginx 是两个容器需要打两个 Image 是否有办法打包一个容器?(除了共用容器) 2.由于是打包的镜像,没有挂载磁盘,日志问题怎么解决的( graylog,elk?) 3.以上是否是正常的实现流程,有没有更好的流程?

    11 条回复    2019-05-27 16:01:11 +08:00
    yanaraika
        1
    yanaraika  
       2019-03-08 10:45:45 +08:00   ❤️ 3
    1. 正确做法就是两个容器。每个容器只干一件事情
    2. docker 有 log driver,可以接 rsyslog/logstash
    3. nginx 用官方镜像,配置文件单独拿出来,同时发送配置文件 + docker-compose.yml 到远程服务器,在 docker-compose 里面用 volume 挂进去

    4. build 的 tag 不要用一样的 pho-fpm:v1,使用 my-project-php:commit_hash 或者 git tag 作为标记,每次不一样
    hiboshi
        2
    hiboshi  
    OP
       2019-03-08 10:58:04 +08:00
    @yanaraika 好的非常感谢。
    您说的第二点我没有看的太明白,你的意思是 volume 挂载 nginx_vhost.conf 配置文件还是 nginx 容器和 php-fpm 容器里面的项目挂载?

    目前我的做的是 php-fpm+nginx 打包两个镜像 每次更新都是两个。nginx 配置文件我是 build 的时候 copy 过去的,nginx 我也是用的官方的镜像。谢谢。
    hiboshi
        3
    hiboshi  
    OP
       2019-03-08 10:58:38 +08:00
    @hiboshi 说错了 是第三点
    yanaraika
        4
    yanaraika  
       2019-03-08 11:07:41 +08:00
    @hiboshi
    项目是否打包到容器里没有公认的标准,一般我这边的做法是需要从官方镜像安装依赖的(例如 php 容器)把代码拷贝进去。对于挂进去就能用的(例如 nginx )容器直接用官方镜像,把静态文件和 vhost.conf 都通过 volume 挂进去。
    fxxkgw
        5
    fxxkgw  
       2019-03-08 11:37:36 +08:00
    借楼问一下 实践上有什么减少镜像大小的方法呢 感觉随便加点东西就多了好几百 M
    操作中也尽量把 RUN 的操作用 && 连接了
    yum 操作也 clean all 了 但是效果还是不明显
    hiboshi
        6
    hiboshi  
    OP
       2019-03-08 13:03:18 +08:00
    @fxxkgw 用 alpine 镜像
    dilu
        7
    dilu  
       2019-03-08 13:07:20 +08:00
    @fxxkgw 首先选用一个比较小的镜像例如 Alpine,其次 Dockerfile 同级目录不要有别的文件,因为会被一起当成 Content 发给 Docker Deamon 处理,一起打包进镜像里面。

    其次用什么装什么,不要多装,能映射出来代码的就不要放到容器内部。

    尽量缩小 Dockfiel 中的指令条数,因为每一条指令都在在原来的基础上覆盖新的一层。
    fxxkgw
        8
    fxxkgw  
       2019-03-08 15:49:10 +08:00
    @hiboshi
    @dilu
    谢谢两位 ;)
    tomczhen
        9
    tomczhen  
       2019-03-08 15:58:14 +08:00
    @dilu .dockerignore 了解一下。
    dilu
        10
    dilu  
       2019-03-08 20:20:07 +08:00 via Android
    @tomczhen 虽然你说的都对,可我就是不听啊,杠精了解一下🤓
    BruceWang
        11
    BruceWang  
       2019-05-27 16:01:11 +08:00
    @hiboshi

    Alpine 的 UID 和 Debian、Ubuntu 以及 macOS 都不一样。volume 到 host 之后文件权限一团糟。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2873 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:16 · PVG 23:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.