带有 vagrant、docker 和 git 的项目布局
Project layout with vagrant, docker and git
所以我最近发现了 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 "machines" 并正确设置数据库和源代码。
这是一个好方法吗?我仍在尝试弄清楚这在部署到生产方面将如何工作。
Is this a good approach?
是的,至少几个月以来它对我有用。
不同的是我还有一个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 允许我从我的 Vagrantfile 中外部化任何 docker 特性。因此,这个 Vagrantfile 可以在不做任何更改的情况下重新用于其他项目;您只需要提供一个不同的 docker-compose.yml
文件即可。
我做的另一件事是将 Vagrantfile
放在项目的根目录中(而不是在 vagrant
目录中),因为它是人类和工具的地方(一些 IDE) 希望找到它。 PyCharm 会,PhpStorm 可能会。
我还把我的 docker-compose.yml
文件放在我的项目的根目录下。
最后,为了开发,我只是转到我的项目目录并启动 vagrant,它告诉 docker-compose 到(然后最终构建)运行 docker 容器。
I'm still trying to figure out how this will work in terms of deployment to production.
为了部署到生产环境,常见的做法是将您的 docker 图像发布到 private docker registry. You can either host such a registry on your own infrastructure or use online services that provides them such as Docker Hub 上,从而将它们提供给运营团队。
同时向操作团队提供一个 docker-compose.yml
文件,该文件将定义如何 运行 容器和 link 它们。请注意,此文件不应使用 build:
指令,而应依赖 image:
指令。谁想在部署到生产环境时 build/compile 东西?
这个 Docker blog article 可以帮助弄清楚如何使用 docker-compose 和 docker-swarm 在集群上部署。
我建议也使用 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'
在您的 Docker 文件中,您可以指定 运行 您的 PHP 代码的依赖项。
此外,我建议将 my_database_image
和 my_machine_x_image
项目与它们的 Dockerfiles
分开,因为完全可以与其他项目一起使用。
如果您正在使用 Mac,您已经在使用名为 boot2docker
的虚拟机
希望对您有所帮助。
所以我最近发现了 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 "machines" 并正确设置数据库和源代码。
这是一个好方法吗?我仍在尝试弄清楚这在部署到生产方面将如何工作。
Is this a good approach?
是的,至少几个月以来它对我有用。
不同的是我还有一个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 允许我从我的 Vagrantfile 中外部化任何 docker 特性。因此,这个 Vagrantfile 可以在不做任何更改的情况下重新用于其他项目;您只需要提供一个不同的 docker-compose.yml
文件即可。
我做的另一件事是将 Vagrantfile
放在项目的根目录中(而不是在 vagrant
目录中),因为它是人类和工具的地方(一些 IDE) 希望找到它。 PyCharm 会,PhpStorm 可能会。
我还把我的 docker-compose.yml
文件放在我的项目的根目录下。
最后,为了开发,我只是转到我的项目目录并启动 vagrant,它告诉 docker-compose 到(然后最终构建)运行 docker 容器。
I'm still trying to figure out how this will work in terms of deployment to production.
为了部署到生产环境,常见的做法是将您的 docker 图像发布到 private docker registry. You can either host such a registry on your own infrastructure or use online services that provides them such as Docker Hub 上,从而将它们提供给运营团队。
同时向操作团队提供一个 docker-compose.yml
文件,该文件将定义如何 运行 容器和 link 它们。请注意,此文件不应使用 build:
指令,而应依赖 image:
指令。谁想在部署到生产环境时 build/compile 东西?
这个 Docker blog article 可以帮助弄清楚如何使用 docker-compose 和 docker-swarm 在集群上部署。
我建议也使用 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'
在您的 Docker 文件中,您可以指定 运行 您的 PHP 代码的依赖项。
此外,我建议将 my_database_image
和 my_machine_x_image
项目与它们的 Dockerfiles
分开,因为完全可以与其他项目一起使用。
如果您正在使用 Mac,您已经在使用名为 boot2docker
的虚拟机希望对您有所帮助。