从 docker 容器连接到 mysql 数据库
connect to mysql database from docker container
我有这个 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 应用程序仍然指向本地主机。当我连接到 "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 中,所有共同的容器 docker-compose 文件都在一个网络中 (more about networks),并且可以通过名称相互解析。 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 容器。
对我来说,名称解析永远不会发生。这是我的 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
我有这个 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 应用程序仍然指向本地主机。当我连接到 "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 中,所有共同的容器 docker-compose 文件都在一个网络中 (more about networks),并且可以通过名称相互解析。 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 容器。
对我来说,名称解析永远不会发生。这是我的 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