使用docker进行Symfony app部署

时间:2016-11-04 06:23:57

标签: symfony docker deployment web-deployment docker-compose

我来这里是因为我使用Symfony3开发了一个应用程序。我对应用程序的部署提出了一些问题。 实际上我使用的是docker-compose:

version: '2'

services:
    nginx:
        build: ./docker/nginx/
        ports:
            - 8081:80
        volumes:
            - .:/home/docker:ro
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
            - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
        networks:
            - default

    php:
        build: ./docker/php/
        volumes:
            - .:/home/docker:rw
            - ./docker/php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
        working_dir: /home/docker
        networks:
            - default
        dns_search:
            - php

    db:
        image: mariadb:latest
        ports:
            - 3307:3306
        environment:
            - MYSQL_ROOT_PASSWORD=collectionManager
            - MYSQL_USER=collectionManager
            - MYSQL_PASSWORD=collectionManager
            - MYSQL_DATABASE=collectionManager
        volumes:
            - mariadb_data:/var/lib/mysql
        networks:
            - default
        dns_search:
            - db

    search:
        build: ./docker/search/
        ports:
            - 9200:9200
            - 9300:9300
        volumes:
            - elasticsearch_data:/usr/share/elasticsearch/data
        networks:
            - default
        dns_search:
            - search

volumes:
    mariadb_data:
        driver: local
    elasticsearch_data:
        driver: local

networks:
    default:

nginx很清楚,引擎是带有一些扩展和编写器的PHP-FPM,db是MariaDB,用一些插件搜索ElasticSearch。

在我不使用Docker并部署我使用Megallanes或Deployer之前,我想部署webapp。

使用Docker我可以使用docker-compose文件并在服务器上重新创建图像和容器,我还可以将我的容器保存在图像和tar存档中并将其加载到服务器上。对于nginx和php-fpm来说没关系,但是弹性搜索和数据库呢?因为我需要保留数据以便将来更新代码。然后当我部署代码时,我需要执行一个Doctrine Migration和一些命令,Deployer可以完成其他一些有趣的事情。我如何使用Docker部署代码?我们可以同时使用吗?部署代码和Docker服务?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

首先,请尝试使用用户定义的网络,它们具有与嵌入式DNS等传统链接相比的附加功能。这意味着您可以使用应用程序中的名称调用同一网络上的其他容器。用户定义网络上的容器与另一个用户定义网络上的容器隔离。

创建用户定义的网络:

docker network create --driver bridge <networkname>

Dockerfile使用用户定义的网络示例:

search:
    restart: unless-stopped
    build: ./docker/search/
    ports:
        - "9200:9200"
        - "9300:9300"
    networks:
        - <networkname>

第二:我注意到你没有为你的DB和ElasticSearch使用数据量。 您需要在某些点安装卷以保留持久数据。

第三:导出容器时,它不包含已安装的卷。您需要备份卷数据并手动迁移它。

备份卷数据:

docker run --rm --volumes-from db -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

上面的命令将创建一个容器,从DB容器安装卷并将容器中的当前目录挂载为/backup,使用ubuntu imagetar命令创建{{1}的备份在容器中(考虑将其更改为您的dbdirectory)在从docker主机挂载的/dbdata中)。操作完成后,将删除瞬态容器(我们用于创建带/backup开关的备份的ubuntu容器)。

要恢复:

--rm存档复制到远程位置,并使用空的已安装卷创建容器。然后使用以下命令提取该卷中的tar存档。

tar