我希望能够在多台计算机上复制开发环境。我认为 Docker 是一个很好的工具,但我遇到了困难。
我有一个应用程序使用:
- 带有一些扩展的 apache
- PHP FPM
- MySQL
- 作曲家
- Compass(重新编译 SASS 文件)
- 格伦特与鲍尔
所有文件都应保留在主机上,并可供服务使用。
因此我创建了一个 Dockerfile,用于配置并启动 Apache。太棒了!
不幸的是,我只是想不通从这里该如何继续。
如何配置 PHP FPM、MySQL 和 Compass?我知道我应该在单独的容器中运行每个进程,然后将它们链接在一起(而不是在同一个容器内启动多个服务)。
本能地,我会创建几个 Dockerfile,每个服务一个,然后使用 docker-compose 启动每个文件。但这看起来不是解决问题的办法,我不知道正确的想法是什么。
我发现了很多自定义镜像,但我更希望用自己的配置亲自创建每个容器。这可能吗?
或者我最好只是在 Vagrant 中或直接在 VirtualBox 上配置并运行完整的 VM?
谢谢!
答案1
Docker Compose 一直是一个很好的工具,在这种情况下,您将拥有小型微服务,而不是将一个大型单片应用程序转储到单个 Docker 映像中。如果您不想拥有大量的 Dockerfile,您可以随时构建自己的 Docker 映像并进行必要的打包以使其变得简单。
示例:您可以构建自己的 Ubuntu Docker 映像并进行必要的打包,而无需提取官方的 Ubuntu Docker 映像。这将减少您对拥有大量 Dockerfile 的困惑。但请注意,每次您想要进行任何更改时,这都会带来构建新 Docker 映像的开销,并且不建议在开发环境中这样做。
以下是 docker-compose.yml 文件的片段这链接非常容易理解,不包含单独的 Dockerfile,并且可以根据您的要求轻松定制:
version: '3'
services:
web:
image: nginx
volumes:
- "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
- "./etc/ssl:/etc/ssl"
- "./web:/var/www/html"
- "./etc/nginx/default.template.conf:/etc/nginx/conf.d/default.template"
ports:
- "8000:80"
- "3000:443"
environment:
- NGINX_HOST=${NGINX_HOST}
command: /bin/bash -c "envsubst '$$NGINX_HOST' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
restart: always
depends_on:
- php
- mysqldb
php:
image: nanoninja/php-fpm
restart: always
volumes:
- "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
- "./web:/var/www/html"
composer:
image: "composer"
volumes:
- "./web/app:/app"
command: install
myadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "8080:80"
environment:
- PMA_ARBITRARY=1
- PMA_HOST=${MYSQL_HOST}
restart: always
depends_on:
- mysqldb
mysqldb:
image: mysql
container_name: ${MYSQL_HOST}
restart: always
env_file:
- ".env"
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "8989:3306"
volumes:
- "./data/db/mysql:/var/lib/mysql"
答案2
你肯定走在正确的道路上。 Docker-compose就是你想要的。
每个“服务”要么是 Docker 镜像,要么是构建的本地 Dockerfile。您可以在 Compose 文件中指定不同的文件路径和文件名,以简化操作。然后使用 Docker 链接将所有容器绑定在一起。