使用docker-compose.yml

时间:2019-04-30 06:55:24

标签: docker docker-compose dockerfile docker-machine

不知道这是否将是一个重复的问题,但是我试图找出一些东西,但是不确定我是否和其他人一样。 因此,我是docker的新手,并尝试为小型网站设置部署。

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

  
      
  1. index.html-具有基本的html

  2.   
  3. Dockerfile-具有

  4.   
FROM ubuntu:16.04
COPY . /var/www/html/
  
      
  1. docker-compose.yml-具有
  2.   
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。

这是正确的方法还是我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

执行此操作的标准方法是将代码复制到图像中。不要绑定挂载包含代码的主机文件夹;而是使用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映像的构建顺序,则可能有一个更简单的安装和部署系统,可以直接在主机上运行服务器。