从Docker容器连接到MySQL数据库

5

我有一个Docker文件,它按预期工作。我有一个连接到本地MySQL的PHP应用程序。

# 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应用程序仍然指向本地主机。当我连接到“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?

这与此处提出的问题类似...

从主机连接到docker容器中的mysql

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


1
你的mysql连接配置是什么样子的?如果主机指向“localhost”,那就错了,应该是“mysql”。 - Artur Górski
2个回答

5

首先,如果您不想从主机机器调用mysql 3306端口,那么您不应该暴露它。其次,链接现在已被弃用。您可以使用网络代替。我不确定compose v.1,但在v.2中,所有通用docker-compose文件中的容器都在一个网络中(更多关于网络),并且可以通过名称解析彼此。以下是docker-compose v.2文件示例:

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容器内通过名称 mysql1 解析mysql容器。

有没有一种方法可以在web容器中设置某些内容,以便当PHP尝试连接到localhost时,它会自动将其“重定向”到mysql1容器? - Link14
3
@Link14 所有在localhost上的web容器内的调用都将仅针对web容器。如果您想调用mysql1容器,则需要调用mysql1主机。 - Cortwave

0

对我来说,名称解析从未发生。这是我的Docker文件,我希望从应用程序主机连接到MySQL,在那里名称为mysql并作为环境变量传递给其他容器-DB_HOST = mysql。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接