首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker同一个docker的多个独立版本-在相同的VPS上编写应用程序

Docker同一个docker的多个独立版本-在相同的VPS上编写应用程序
EN

Stack Overflow用户
提问于 2020-04-04 22:37:10
回答 1查看 137关注 0票数 0

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

代码语言:javascript
复制
application-1/
├── docker/
│     ├── apache2
│     ├── php
│     ├── docker-compose.yml
├── src/
└── other-framework-files/

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

其中每个应用程序都是相同代码的完全独立的实例。我想要达到这样的地步,我可以让我的应用程序产生两次,并且我可以在两个“盒子”上独立开发。

这种结构对于一个实例来说工作得很好。

这么说吧,在我的文件夹中,我只有一个运行时使用的应用程序:

代码语言:javascript
复制
cd application-1/
docker-compose up -d

这是我的docker-compose.yml文件

代码语言:javascript
复制
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

这对于应用程序的一个实例来说工作得很好。

当我转到

代码语言:javascript
复制
http://123.123.123:8080 (my Digital Ocean droplet)

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

然而,如果我想把它复制到应用程序2并从那里运行它,我就不能让它工作。对于第二个应用程序,我尝试更改所有容器的名称,并像这样更改端口:

代码语言:javascript
复制
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

通过这样做,我希望我可以得到两个完全独立的多容器composer应用程序。以便两个开发人员可以在同一个应用程序上单独工作。

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

代码语言:javascript
复制
http://123.123.123:8081

它就是不加载任何东西。说网站不可用。它不会击中阿帕奇或者其他什么。它就是不起作用。

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

更新:

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

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

发布于 2020-04-06 21:59:31

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

代码语言:javascript
复制
docker-compose -p customprojectname1 up -d

在这里,您的customprojectname1实质上建立了名称空间-将其更改为其他名称空间用于您的第二个实例,等等。同样,您仍然必须更改主机端口,因为这些端口将发生冲突,但其他任何事情都不应该发生。

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

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

代码语言:javascript
复制
mysql2:
container_name: mysql2
image: mysql:latest
ports:
  - 13309:3306
volumes:
  - mysql:/var/lib/mysql:cached

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61029701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档