【问题标题】:Docker multiple independent versions of the same docker-compose app on same VPS在同一 VPS 上 Docker 同一 docker-compose 应用程序的多个独立版本
【发布时间】:2020-04-04 14:37:09
【问题描述】:

我正在尝试构建这样的结构:

application-1/
├── docker/
│     ├── apache2
│     ├── php
│     ├── docker-compose.yml
├── src/
└── other-framework-files/

application-2/
├── docker/
│     ├── apache2
│     ├── php
│     ├── docker-compose.yml
├── src/
└── other-framework-files/   

每个应用程序都是相同代码的完全独立实例。我希望能够让我的应用程序生成两次,并且我可以在两个“盒子”上独立开发。

这种结构适用于一个实例。

假设在我的文件夹中我只有一个可以运行的应用程序:

cd application-1/
docker-compose up -d

这是我的 docker-compose.yml 文件

version: '3.7'
services:
  webapp:
    build:
      context: ./php/
      dockerfile: Dockerfile
    container_name: webapp
    image: php:7.4.2-fpm-alpine
    volumes:
      - ../:/srv/app
  apache2:
    build:
      network: host
      context: ./apache2/
      dockerfile: Dockerfile
    container_name: apache2
    image: httpd:2.4.39-alpine
    ports:
      - 8080:80
    volumes:
      - ../:/srv/app
  mysql:
    container_name: mysql
    image: mysql:latest
    ports:
      - 13306:3306
    volumes:
      - mysql:/var/lib/mysql:cached
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: content
      MYSQL_USER: content
      MYSQL_PASSWORD: content
  redis:
    container_name: redis
    image: redis:5.0.6-alpine
    ports:
      - 16379:6379
    volumes:
      - redis:/data:cached

volumes:
  mysql:
    driver: local
  redis:
    driver: local

这对于应用程序的一个实例非常有效。

当我去

http://123.123.123:8080 (my Digital Ocean droplet)

我可以看到我的网站,一切都很好。

但是,如果我想将它复制到应用程序 2 并从那里运行它,我无法让它工作。对于第二个应用程序,我尝试更改所有容器的名称,并且还更改了如下端口:

version: '3.7'
services:
  webapp2:
    build:
      context: ./php/
      dockerfile: Dockerfile
    container_name: webapp2
    image: php:7.4.2-fpm-alpine
    volumes:
      - ../:/srv/app
  apache2-2:
    build:
      network: host
      context: ./apache2/
      dockerfile: Dockerfile
    container_name: apache2-2
    image: httpd:2.4.39-alpine
    ports:
      - 8081:80
    volumes:
      - ../:/srv/app
  mysql2:
    container_name: mysql2
    image: mysql:latest
    ports:
      - 13309:3306
    volumes:
      - mysql:/var/lib/mysql:cached
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: content
      MYSQL_USER: content
      MYSQL_PASSWORD: content
  redis2:
    container_name: redis2
    image: redis:5.0.6-alpine
    ports:
      - 16380:6379
    volumes:
      - redis:/data:cached

volumes:
  mysql2:
    driver: local
  redis2:
    driver: local

通过这样做,我希望能够获得两个完全独立的多容器作曲家应用程序。这样两个开发人员就可以在同一个应用上分别工作。

但是当我尝试像这样访问它时

http://123.123.123:8081

它只是不加载任何东西。说网站不可用。它不会击中 apache 或任何东西。它只是行不通。

有人能在这里为我指明正确的方向吗?我不需要任何花哨的解决方案。这只是为了开发,只是为了开始,然后我可以尝试调整一些东西。

更新:

这是我的 apache2 配置。我已将 webapp 更改为 webapp2 作为第二个实例。

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so

<VirtualHost *:80>
    ServerName www.content.local
    ServerAlias content.local
    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://webapp:9000/srv/app/public/$1
    DocumentRoot /srv/app/public
    <Directory /srv/app/public>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

【问题讨论】:

  • 您能否再次检查所有目录名称是否正确(srcsrv 等等)?特别是如果两个 docker-compose.yml 文件都在名为 docker 的目录中,这会有所不同。
  • @DavidMaze - 嗯,/srv/app 在我的 docker 文件中定义为:WORKDIR /srv/app/。这是application1application2 文件夹所在的路径。在这些文件夹中,我有我的 symfony 应用程序。你觉得我在这里做错了吗?安装程序适用于端口 8080,但不适用于 8081。我是否认为这可能会这样工作?我也有 apache 代理配置,但我也在那里更新了容器名称。
  • 如果在这两种情况下docker-compose.yml 文件都位于名为docker 的目录中,则默认情况下,Compose 会认为它们“相同”,这会给您带来问题。 (但我的期望是第二个docker-compose.yml 将替换第一个,而不是它会默默地丢失。)您不需要指定container_name:; Compose 会自行选择一个唯一的名称。
  • @Robert 您对网络部分的更改是 100% 必需的。正如您在此处看到的:docs.docker.com/network/bridge,默认桥接网络上的容器只能通过 IP 地址相互访问,因此您需要使用用户定义的网络来使用 apache 配置中的 container_name 来联系应用程序。
  • @akazuko Docker Compose 为您创建一个名为default 的“用户定义”桥接网络;容器间网络正常工作,docker-compose.yml 文件中的任何地方都没有 networks: 部分。 Networking in Compose 有更多详情。

标签: php docker docker-compose apache2 devops


【解决方案1】:

最重要的是,除了外部(主机)端口之外,您实际上不需要重命名任何东西,并且应该能够通过使用命名空间重用相同的 docker-compose 文件。命名空间是通过 compose 中的 --project-name(或 -p)标志实现的。并用它编写命令如下:

docker-compose -p customprojectname1 up -d

在这里,您的 customprojectname1 基本上建立了命名空间 - 将其更改为您的第二个实例的其他名称等。同样,您仍然需要更改主机端口,因为它们会发生冲突,但其他任何事情都不应该。

关于重命名所有内容的原始解决方案 - 您的问题很可能是您忘记在 v2 中重命名的卷:

即对于 mysql,您在下面将挂载点设置为 mysql

mysql2:
container_name: mysql2
image: mysql:latest
ports:
  - 13309:3306
volumes:
  - mysql:/var/lib/mysql:cached

哪个是您的旧 mysql 卷 - 来自旧堆栈(未重命名)。与redis相同。所以需要mysql2和redis2。同样,不要这样做,而是使用我上面提到的命名空间解决方案。

最后,确保检查每个生成的容器的容器日志,以防它们有更多线索。

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 2020-08-12
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多