从 docker 容器连接到 mysql 数据库

sha*_*nuo 5 docker dockerfile docker-compose

我有这个 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"]
Run Code Online (Sandbox Code Playgroud)

当我尝试将数据库作为单独的容器运行时,我的 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
Run Code Online (Sandbox Code Playgroud)

我的 php 应用程序如何从另一个容器连接到 mysql?

这类似于这里提出的问题......

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

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

Cor*_*ave 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Link14 在 `localhost` 上的 `web` 内的所有调用都将仅指向 `web` 容器。如果你想调用`mysql1`容器那么你需要调用`mysql1`主机 (3认同)