从docker容器连接到mysql数据库

从docker容器连接到mysql数据库,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有这个docker文件,它正在按预期工作。我有一个php应用程序可以连接到本地主机上的mysql # cat Dockerfile FROM tutum/lamp:latest RUN rm -fr /app ADD crm_220 /app/ ADD crmbox.sql / ADD mysql-setup.sh /mysql-setup.sh EXPOSE 80 3306 CMD ["/run.sh"] 当我尝试将数据库作为单独的容器运行时,我的php应用程序仍然指向localhost。

我有这个docker文件,它正在按预期工作。我有一个php应用程序可以连接到本地主机上的mysql

# cat Dockerfile
FROM tutum/lamp:latest
RUN rm -fr /app
ADD crm_220 /app/
ADD crmbox.sql /
ADD mysql-setup.sh /mysql-setup.sh
EXPOSE 80 3306
CMD ["/run.sh"]
当我尝试将数据库作为单独的容器运行时,我的php应用程序仍然指向localhost。当我连接到“web”容器时,我无法连接到“mysql1”容器

# cat docker-compose.yml
web:
  build: .
  restart: always
  volumes:
    - .:/app/
  ports:
    - "8000:8000"
    - "80:80"
  links:
    - mysql1:mysql

mysql1:
  image: mysql:latest
  volumes:
    - "/var/lib/mysql:/var/lib/mysql"
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: secretpass
我的php应用程序如何从另一个容器连接到mysql

这与这里的问题相似


我不想从主机连接到mysql,我需要从另一个容器连接。

如果不想从主机调用mysql 3306端口,首先不应该公开它。第二,现在不推荐使用链接。你可以改用网络。我不确定compose v.1,但在v.2中,common docker compose文件中的所有容器都位于一个网络()中,并且可以通过名称彼此解析。docker compose v.2文件示例:

# cat docker-compose.yml
web:
  build: .
  restart: always
  volumes:
    - .:/app/
  ports:
    - "8000:8000"
    - "80:80"
  links:
    - mysql1:mysql

mysql1:
  image: mysql:latest
  volumes:
    - "/var/lib/mysql:/var/lib/mysql"
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: secretpass
version: '2'
services:
  web:
    build: .
    restart: always
    volumes:
      - .:/app/
    ports:
      - "8000:8000"
      - "80:80"
  mysql1:
    image: mysql:latest
    volumes:
      - "/var/lib/mysql:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: secretpass

通过这种配置,您可以在web容器中通过名称解析mysql容器。

对我来说,名称解析永远不会发生。这是我的docker文件,我希望从app host连接到mysql,其中名称为mysql,并作为一个env变量传递给另一个容器-DB_host=mysql

# cat docker-compose.yml
web:
  build: .
  restart: always
  volumes:
    - .:/app/
  ports:
    - "8000:8000"
    - "80:80"
  links:
    - mysql1:mysql

mysql1:
  image: mysql:latest
  volumes:
    - "/var/lib/mysql:/var/lib/mysql"
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: secretpass
version: "2"
services:

  app:
    build:
      context: ./
      dockerfile: /src/main/docker/Dockerfile
    image: crossblogs
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
    ports:
      - 8080:8080
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7.20
    environment:
      - MYSQL_USER=root
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=crossblogs
    ports:
      - 3306:3306
    command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8 --explicit_defaults_for_timestamp

您的mysql连接配置看起来如何?如果主机指向
localhost
,那就错了,它应该是
mysql
。有没有办法在
web
容器中设置一些内容,这样当PHP尝试连接
localhost
时,它会“重定向”它会自动发送到
mysql1
容器?@Link14在
localhost
上的
web
内的所有调用将仅发送到
web
容器。如果要调用
mysql1
容器,则需要调用
mysql1
主机