docker - 如何使用隔离的网络正确连接使用多个docker-compose文件创建的容器

标签 docker docker-compose docker-networking

我正在尝试为虚拟机上的一些项目设置可扩展的docker生产环境。
我的设置如下:
前端:(这按预期工作:感谢Tevin Jeffery for this)

# ~/proxy/docker-compose.yml
version: '2'  
services:  
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - '/etc/nginx/vhost.d'
      - '/usr/share/nginx/html'
      - '/etc/nginx/certs:/etc/nginx/certs:ro' 
      - '/var/run/docker.sock:/tmp/docker.sock:ro'
    networks:
      - nginx
  letsencrypt-nginx-proxy:
    container_name: letsencrypt-nginx-proxy
    image: 'jrcs/letsencrypt-nginx-proxy-companion'
    volumes:
      - '/etc/nginx/certs:/etc/nginx/certs'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    volumes_from:
      - nginx-proxy
    networks:
      - nginx
networks:  
  nginx:
    driver: bridge
数据库:(计划添加postgres以支持Rails应用程序)
# ~/mysql/docker-compose.yml
version: '2'
services:
  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
#   ports:
#     - 3036:3036
    networks:
      - db
networks:
  db:
    driver: bridge
最后,一个WordPress博客来测试一切是否正常:
# ~/wp/docker-compose.yml
version: '2'
services:
  wordpress:
    image: wordpress
    # external_links:
    #   - mysql_db_1:mysql
    ports:
      - 8080:80
    networks:
      - proxy_nginx
      - mysql_db
    environment:
      # for nginx and dockergen
      VIRTUAL_HOST: gizmotronic.ca
      # wordpress setup
      WORDPRESS_DB_HOST: mysql_db_1 
#     WORDPRESS_DB_HOST: mysql_db_1:3036  
#     WORDPRESS_DB_HOST: mysql 
#     WORDPRESS_DB_HOST: mysql:3036  
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: wordpress
networks:
  proxy_nginx:
    external: true
  mysql_db:
    external: true
我的问题是Wordpress容器无法连接到数据库。尝试启动(docker-compose up)Wordpress容器时出现以下错误:
wordpress_1  | Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 22
wordpress_1  |
wordpress_1  | MySQL Connection Error: (2002) Connection refused
wp_wordpress_1 exited with code 1
更新:
我终于能够使它工作。我的主要问题是依赖于容器默认的环境变量。这样就创建了一个自动数据卷,没有数据库或用户无需按字。将显式环境变量添加到mysql和Wordpress容器后,删除了数据量并重新启动了两个容器。这迫使mysql容器重新创建数据库和用户。
~/mysql/docker-compose.yml:
environment:
  MYSQL_ROOT_PASSWORD: wordpress
  MYSQL_USER: wordpress
  MYSQL_PASSWORD: wordpress
  MYSQL_DATABASE: wordpress
~/wp/docker-compose.yml:
environment:
  # for nginx and dockergen
  VIRTUAL_HOST: gizmotronic.ca
  # wordpress setup
  WORDPRESS_DB_HOST: mysql_db_1
  WORDPRESS_DB_USER: wordpress
  WORDPRESS_DB_PASSWORD: wordpress
  WORDPRESS_DB_NAME: wordpress

最佳答案

docker-compose的一个问题是,尽管有时您的应用程序已链接到数据库,但该应用程序不会等待数据库启动并准备就绪。这是官方的Docker阅读:
https://docs.docker.com/compose/startup-order/

我遇到了一个类似的问题,我的测试应用程序将失败,因为它尚未启动并无法运行,因此无法连接到服务器。

我通过运行shell脚本来ping数据库的地址,直到可以使用为止,从而对上述链接中的文章进行了类似的解决。该脚本应该是应用程序中的最后一个CMD命令。

RESPONSE=$(curl --write-out "%{http_code}\n" --silent --output /dev/null "YOUR_MYSQL_DATABASE:3306")

# Until the mysql sends a 200 HTTP response, we're going to keep checking
until [ $RESPONSE -eq "200" ]; do
  sleep 2
  echo "MySQL is not ready yet.. retrying... RESPONSE: ${RESPONSE}"
  RESPONSE=$(curl --write-out "%{http_code}\n" --silent --output /dev/null "YOUR_MYSQL_DATABASE:3306")
done

# Once we know the server's up, we can start run our application 
enter code to start your application here

我不确定100%是否是您遇到的问题。调试问题的另一种方法是使用-d标志在分离模式下运行docker-compose,然后运行docker ps来查看数据库是否正在运行。如果正在运行,请运行docker logs $YOUR_DB_CONTAINER_ID以查看MySQL在启动时是否给您任何错误

关于docker - 如何使用隔离的网络正确连接使用多个docker-compose文件创建的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45014698/

相关文章:

ruby-on-rails - 找不到 gem rails

docker - 在Docker网络中跨容器连接

ubuntu - 主机重启时 Docker 容器数据丢失

docker - 如果设置了变量,如何配置 docker compose 以使用给定的子网,或者如果未设置,则为自己选择?

python - 为什么我在构建 docker 镜像时遇到这个错误?

python - “RUN pip install -rrequirements.txt”不起作用

docker - `docker-compose logs` 从哪里拉?

docker - 来自环境的动态docker-compose配置

docker - 如何在 docker swarm 模式下将发布的端口绑定(bind)到特定的 eth[x]

docker - 如何调出具有主机名和IP地址的容器,以便它们可以串行运行?