我遇到了一个有趣的问题,在这个问题上,docker run命令和使用docker-compose似乎有区别。
我有两个Docker容器,一个是带有PHP的Apache,另一个是MySQL。我使用以下命令来运行容器:
网站:
docker run -p 8080:80 -d website_localMySQL:
docker run -e MYSQL_ROOT_PASSWORD=RamaLamaDingDong --name=mysql5725 -d mysql:5.7.25看看码头生态系统,我可以看到它们都在运行:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
849c421e750b website_local "/usr/sbin/apache2ct…" 19 minutes ago Up 19 minutes 0.0.0.0:8080->80/tcp pedantic_tesla
ccebba95693b mysql:5.7.25 "docker-entrypoint.s…" 23 minutes ago Up 23 minutes 3306/tcp, 33060/tcp mysql5725我使用MySQL Docker容器的名称设置了到数据库的PDO连接:
PHP:( USER和PASS是正确的,是的,我知道我不应该使用根的凭据)
try {
$dbh = new PDO('mysql:host=mysql5725;dbname=grocery;charset=utf8', USER, PASS);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo $e->getMessage();
$errorCode = $e->getCode();
}当试图连接到数据库时,我会得到以下错误:
SQLSTATEHY000 php_network_getaddresses: getaddrinfo失败:名称或服务未知
如果我用容器的Docker地址(172.17.0.3)替换连接字符串中的host,它将正确连接。
现在变得有趣了。如果我使用Docker来打开容器,请撰写:
version: '3'
services:
db:
image: mysql:5.7.25
container_name: mysql5725
environment:
MYSQL_ROOT_PASSWORD: RamaLamaDingDong
ports:
- "3306:3306"
web:
image: website_local:latest
container_name: website_local
depends_on:
- db
volumes:
- ./website/www:/var/www/html/
ports:
- "8080:80"PHP函数使用Docker容器(mysql5725)的名称正确连接,但不能使用Docker容器的IP地址连接。
很多时候,在测试环境中,我只想停止和重建某些容器,特别是在处理两个以上的Docker映像时。在建立连接时,我只需要使用资源的名称,因为无法保证网络每次都会将相同的IP地址分配给容器。
为何这两种码头货柜的下水方法会产生不同的结果呢?是否有一种方法来“正常化”这一点,所以不管容器是如何启动的,名称连接都能正常工作吗?
发布于 2019-04-12 12:33:35
码头人员组成自动为您建立网络
默认情况下,Compose为您的应用程序设置一个网络。服务的每个容器都加入了默认网络,并且可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名上被它们发现。
Docker在自己的不提供DNS上创建的默认网桥网络,因此不能使用它连接到使用名称的容器。您可能希望自己建立一个网络,例如:
docker network create mynetwork然后对它进行连接您的容器,例如:
docker network connect mynetwork mysql5725
docker network connect mynetwork php-container注意,Docker之间的这不是唯一的区别组成和手动运行容器。
https://stackoverflow.com/questions/55650960
复制相似问题