【问题标题】:Deploy with docker-compose.yml使用 docker-compose.yml 部署
【发布时间】:2019-04-30 06:55:24
【问题描述】:

不确定这是否是一个重复的问题,但我试图找出一些东西,但不确定我是否有与其他人类似的情况。 所以我是 docker 新手,正在尝试为一个小型网站设置部署。

到目前为止,我有一个包含 3 个文件的文件夹。

  1. index.html - 有基本的 html

  2. Dockerfile - 有

FROM ubuntu:16.04
COPY . /var/www/html/
  1. docker-compose.yml - 有
version: '2.1'
services:
    app:
        build: .
        image: myname/myapp:1.0.0
    nginx:
        image: nginx
        container_name: nginx
        volumes:
            - ./host-volumes:/cont-volumes
        network_mode: "host"
    phpfpm56:
        image: php-fpm:5.6
        container_name: phpfpm56
        volumes:
            - ./host-volumes:/cont-volumes
        network_mode: "host"
    mysql:
        image: mysql:5.7
        container_name: mysql
        ports:
            - "3306:3306"
        volumes:
            - mysql:/var/lib/mysql
volumes:
    mysql:

现在我正在使用 jenkins 来创建构建,将我的所有代码放入主机卷以使其可用于容器,然后我将运行

docker-compose build

现在它创建了一个图像,我将它推送到docker hub

然后我登录到远程服务器并拉取图像并运行。但这不起作用,因为我仍然需要在容器内运行 docker-compose up。

这是正确的方法还是我在这里遗漏了什么?

【问题讨论】:

  • 你只想在远程服务器上运行镜像吗?还是以 docker compose 的方式运行镜像?
  • 好吧,我可以运行图像,但这不会做任何事情。对?因为它除了 index.html、Dokcerfile 和 docker-compose.yml 之外什么都没有。所以直到并且除非我运行 docker-compose up 它没有用。 - 这是我的想法顺便说一句。此外,如果我想运行 docker-compose,我需要先运行映像,然后登录到该容器,然后运行 ​​dockerc-compose。你认为整个设置是正确的还是我应该采用不同的方法。
  • 如果 index.html 文件将使用 docker compose 中的其他内容,则不能只在远程服务器中运行新图像。
  • 不对,docker compose 只是帮你设置图片的链接。所以在容器里面运行dokcer-compose是不对的。
  • 那我该怎么办?就像使用 Dockerfile 创建一个镜像并运行它一样。没有码头工人撰写。或者不需要创建图像,只需将整个代码复制到服务器,然后运行 ​​docker-compose。没有 Dockerfile。

标签: docker docker-compose dockerfile docker-machine


【解决方案1】:

执行此操作的标准方法是将您的代码复制到图像中。不要绑定挂载包含您的代码的主机文件夹;相反,使用 Dockerfile COPY 指令复制应用程序代码(在编译语言中,使用 RUN 命令来构建它)。例如,您的 PHP 容器可能有一个对应的 Dockerfile,看起来像(引用 this base Dockerfile

FROM php-fpm:5.6
# Base Dockerfile defines a sensible WORKDIR
COPY . .
# Base Dockerfile sets EXPOSE 9000
# Base Dockerfile defines ENTRYPOINT, CMD

那么你的docker-compose.yml 会说,部分

version: '3'
service:
  phpfpm56:
    build: .
    image: me/phpfpm56:2019-04-30
    # No other settings

然后你的 nginx 配置会说,部分(使用 Docker Compose 服务名称作为主机名)

fastcgi_pass phpfpm56:9000

如果你在生产中使用它,你需要注释掉我认为的 build: 行。

如果您对没有除localhost 以外的主机名的工作流程非常敏感,并且您不需要重新构建 Docker 映像来更新代码,那么您至少需要在您完成之后重新启动(某些)容器'已经完成了代码推送。

docker-compose stop app phpfpm56
docker-compose up -d

您可能会研究像 Ansible 或 Chef 这样的系统自动化工具来自动化代码推送机制。同样的工具也可以只安装 nginx 和 PHP,如果你想避免 Docker 镜像构建顺序,你可能有一个更简单的安装和部署系统,直接在主机上运行服务器。

【讨论】:

  • 但在这种情况下,如果我不挂载/绑定卷,我的 nginx 将无法查看文件。这将导致错误。
【解决方案2】:

docker-compose up 不应在容器内运行,而应在 docker 主机上运行。因此,这可以通过 sh 在主机上运行,​​但无论您在何处运行该命令,您都需要能够访问 composefile。

【讨论】: