Docker:对多个容器感到困惑

Docker:对多个容器感到困惑

我希望能够在多台计算机上复制开发环境。我认为 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 链接将所有容器绑定在一起。

相关内容