【问题标题】:Symfony app deployment with docker使用 docker 部署 Symfony 应用程序
【发布时间】:2016-11-04 06:23:57
【问题描述】:

我来这里是因为我用 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加一些扩展和composer,db是MariaDB,搜索ElasticSearch加一些插件。

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

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

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    创建用户定义的网络:

    docker network create --driver bridge <networkname>
    

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

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

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

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

    备份卷数据:

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

    上述命令将创建一个容器,从 DB 容器挂载卷并将容器中的当前目录挂载为 /backup ,使用 ubuntu imagetar 命令在容器中创建 /dbdata 的备份(考虑更改此到您的 dbdirectory)在从您的 docker 主机安装的 /backup 中)。操作完成后,临时容器将被删除(我们用于使用 --rm 开关创建备份的 ubuntu 容器)。

    恢复:

    您将tar 存档复制到远程位置,并创建带有空挂载卷的容器。然后使用以下命令提取该卷中的 tar 存档。

    docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
    

    【讨论】:

    • 您好,感谢您的帮助,我已经为 ElasticSearch 和 Mariadb 进行了卷挂载。但我不明白第一点,用户定义的网络?
    • 用更多信息编辑了答案。
    • 我已经编辑了我的代码并使用了网络和卷。但我真的不知道如何处理我的源代码:/
    • 酷,现在您应该将源代码挂载到 nginx document root。看看你的nginx config。找到document root,然后像使用nginx.conf 文件一样将源代码目录挂载到nginx 容器。
    • 是的,我在开发中这样做,当我编辑我的代码时,它直接使用。但是我搜索了一种将其部署到生产中的方法。 (只是测试,不是真正的生产)。但我在某处读到该项目的源代码可能在一个容器中,有人说相反。
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多