【问题标题】:Project layout with vagrant, docker and git带有 vagrant、docker 和 git 的项目布局
【发布时间】:2015-04-24 15:03:54
【问题描述】:

所以我最近发现了 docker 和 vagrant,并且我正在开始一个新的 Php 项目,我想在其中使用两者:

Vagrant 是为了拥有一个所有开发人员都可以使用的可互换环境。

Docker 用于生产,但也在 vagrant 机器内部,因此开发环境尽可能地类似于生产环境。

第一种方法是将所有定义文件与源代码一起放在具有此布局的同一存储库中:

/docker
   /machine1-web_server
       /Dockerfile
   /machine2-db_server
       /Dockerfile
   /machineX
       /Dockerfile
/src
   /app
   /public
   /vendors
/vagrant
   /Vagrantfile

因此,vagrant 机器在配置时会运行所有 docker“机器”并正确设置数据库和源代码。

这是一个好方法吗?我仍在尝试弄清楚这将如何在部署到生产中发挥作用。

【问题讨论】:

    标签: php git docker vagrant


    【解决方案1】:

    这是一个好方法吗?

    是的,至少几个月以来它对我有用。

    不同的是我还有一个docker-compose.yml文件。

    在我的Vagrantfile 中,有一个安装 docker、pip 和 docker-compose 的第一个配置部分:

    config.vm.provision "shell", inline: <<-SCRIPT
        if ! type docker >/dev/null; then
            echo -e "\n\n========= installing docker..."
            curl -sL https://get.docker.io/ | sh
            echo -e "\n\n========= installing docker bash completion..."
            curl -sL https://raw.githubusercontent.com/dotcloud/docker/master/contrib/completion/bash/docker > /etc/bash_completion.d/docker
            adduser vagrant docker
        fi
        if ! type pip >/dev/null; then
            echo -e "\n\n========= installing pip..."
            curl -sk https://bootstrap.pypa.io/get-pip.py | python  
        fi
        if ! type docker-compose >/dev/null; then
            echo -e "\n\n========= installing docker-compose..."
            pip install -U docker-compose
            echo -e "\n\n========= installing docker-compose command completion..."
            curl -sL https://raw.githubusercontent.com/docker/compose/$(docker-compose --version | awk 'NR==1{print $NF}')/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
        fi
    SCRIPT
    

    最后是触发 docker-compose 的配置部分:

    config.vm.provision "shell", inline: <<-SCRIPT
        cd /vagrant 
        docker-compose up -d 
    SCRIPT
    

    other ways 可以从 vagrant 构建和启动 docker 容器,但是使用 docker-compose 允许我将任何 docker 特性从我的 Vagrantfile 外部化。因此,这个 Vagrantfile 可以在不改变的情况下用于其他项目;你只需要提供一个不同的docker-compose.yml 文件。

    我做的另一件不同的事情是将Vagrantfile 放在项目的根目录中(而不是放在vagrant 目录中),因为这是人类和工具(某些IDE)期望找到它的地方。 PyCharm 有,PhpStorm 可能有。

    我还将docker-compose.yml 文件放在我的项目的根目录下。

    最后,为了进行开发,我只需转到我的项目目录并启动 vagrant,它会告诉 docker-compose(最终随后构建)运行 docker 容器。


    我仍在尝试弄清楚这将如何在部署到生产中发挥作用。

    为了部署到生产环境,一种常见的做法是通过将 docker 镜像发布到 private docker registry 上,将它们提供给运维团队。您可以在自己的基础架构上托管此类注册表,也可以使用提供它们的在线服务,例如 Docker Hub

    还为操作团队提供docker-compose.yml 文件,该文件将定义如何运行容器并链接它们。请注意,此文件不应使用build: 指令,而应依赖image: 指令。谁想在部署到生产环境时构建/编译东西?

    这个Docker blog article 可以帮助弄清楚如何使用 docker-compose 和 docker-swarm 在集群上进行部署。

    【讨论】:

    • 很好的答案,非常感谢。只是一个额外的小问题:在 Vagrant 中,你使用的是盒子还是 docker 提供者?
    • 我使用phusion/ubuntu-14.04-amd64 框。我尝试了 vagrant docker provider,但对结果不满意。那是几个月前的事了,所以现在可能效果更好,但是使用盒子 + 配置 docker 可以让您掌控一切。我的 Vagrantfile 可在github.com/thomasleveil/vagrant-phusion-docker/blob/master/… 获得
    【解决方案2】:

    我建议也使用 docker 进行开发,以便完全复制依赖项。 Docker Compose 是关键工具。

    您可以使用这样的策略:

    docker-compose.yml

    db:
      image: my_database_image
      ports: ... 
    
    machinex:
      image: my_machine_x_image
    
    web:
      build: .
      volumes:
        - '/path/to/my/php/code:/var/www'
    

    在您的 Dockerfile 中,您可以指定运行 PHP 代码的依赖项。

    另外,我建议将my_database_imagemy_machine_x_image 项目与其Dockerfiles 分开,因为完全可以与其他项目一起使用。

    如果您使用的是 Mac,则您已经在使用名为 boot2docker 的虚拟机

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多