docker中两个容器间的互访

本文介绍如何在Docker容器中实现两个容器间的MySQL数据库互访,包括配置和解决常见问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前几篇文章中,我们讨论了如何在Ubuntu14.04(64位)中安装docker,以及如何在docker中部署一个apache服务器并在外部电脑中访问该服务器,和在docker中部署

一个mysql数据库并在外部电脑中访问这个数据库。

下面来讨论下docker的容器间的互访,主要以两个容器间的mysql数据库互访为例。


有时候,两个启动的容器之间是需要交流的,比如我们在一个容器中运行了一个apache服务器,上面有一个网站,然后网站的数据库我们就可以部署在另外一个容器中。或者两个容器都部署了数据库,然后这两个数据库之间需要交流。

下面我们以一个容器访问另一个容器的mysql数据库为例。

容器间的访问主要是通过—link参数来进行的。

首先按照前面的教程在一个镜像中安装好xampp。

然后启动这个镜像,并将启动的容器命名为server,作为mysql服务器:

sudo docker run –i –t –P –-name=server ubuntu2 /bin/bash

(注意P是大写)

进入到容器server的命令行后,启动mysql

/opt/lampp/lampp start

在本机电脑中打开另一个命令行终端,运行另外一个容器,作为mysql客户端,并访问容器server中的mysql数据库:

sudo  docker run –i –t –P  --link=server:db –name=client ubuntu2 /bin/bash

(注意P是大写)

--link=server:db表示把刚才的server容器重新命名成db,然后你就可以在上面的client容器中访问到server容器了。

在容器client命令行中,启动mysql:

/opt/lampp/lampp  start
接着访问server容器中的mysql数据库
mysql  -h db –u root

(注意-h后面的值要对应link=server:db中的值)

到这里就,client就连接上了server容器的mysql数据库了。

看有哪些数据库:

show databases;

然后新建一个数据库:

create  database hehe;

然后回到server容器中的命令行,进入msyql:

mysql –u root

查看有哪些数据库:

show databases;

此时应该可以看到hehe。表明client容器中连接上的确实是server中的mysql数据库。


到这里,对容器间的交流就结束了。


常见问题:

1. 出现 lost connection to mysql server的错误:

解决方法:

首先进入到目录(如果你的mysql是通过xampp安装的)/opt/lampp/etc:


cd /opt/lampp/etc

然后用vim 打开my.cnf,找到这一行:

bind-address = 127.0.0.1

将它注释掉,如果没有这行则忽略。

然后找到[mysqld]部分的参数,在配置后面建立一个新行,添加下面这个参数:

skip-name-resolve
保存并退出。

接着重启xampp:

/opt/lampp/lampp restart

到这里应该就解决了。

如果你的Mysql不是通过xampp安装的,则my.cnf一般在一般只会存放在/etc/my.cnf或者/etc/mysql/my.cnf下;

对my.cnf的修改跟上面的一样,然后重启mysql:

/etc/init.d/mysql restart

2. Host ip is not allowed to connet to this mysql server之类的错误

解决方法:

进入mysql:

mysql -u root

然后对其他用户授权:


GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

到这里应该就解决了。

如果还解决,请参考这里:http://joinyo.iteye.com/blog/1489380


<think>我们正在讨论Docker容器的网络互通问题,以避免出现连接被拒绝的情况。根据用户提供的引用内容,我们可以总结出三种Docker容器互访的方式:虚拟IP访问、link方式以及创建bridge网络(引用[1])。同时,引用[4]中提到了在容器访问宿主机的特殊DNS名称`host.docker.internal`,但请注意,这主要用于容器访问宿主机上的服务,而不是容器通信。为了解决容器网络互通问题,我们将重点介绍bridge网络方式(这是最推荐的方式)和link方式(已不推荐,但为了完整性仍提及)。步骤:1.**创建自定义bridge网络**创建一个自定义的bridge网络,这样连接到同一个bridge网络的容器可以通过容器名称相互解析。```bashdockernetworkcreatemy-bridge-network```2.**启动容器并连接到自定义网络**在运行容器时,使用`--network`参数指定自定义网络,并使用`--name`为容器命名。```bashdockerrun-d--namecontainer1--networkmy-bridge-networkimage1dockerrun-d--namecontainer2--networkmy-bridge-networkimage2```3.**容器通过容器名称通信**在container2中,你可以使用`container1`这个名称来访问container1,例如:```bash#在container2中执行curlhttp://container1:8000```4.**使用link方式(不推荐,仅作了解)**如果使用旧式的link方式,可以在运行容器时使用`--link`参数:```bashdockerrun-d--namecontainer1image1dockerrun-d--namecontainer2--linkcontainer1image2```这样,在container2中,可以通过`container1`这个主机名访问container1。但请注意,link方式已不推荐使用,因为自定义网络已经提供了更好的服务发现机制。5.**检查网络连通性**你可以进入容器内部,使用ping或curl命令测试连通性:```bashdockerexec-itcontainer2pingcontainer1```6.**注意端口映射**如果容器内的服务监听的是容器内的端口(如8000),那么其他容器直接访问该端口即可(如上面例子中的`http://container1:8000`)。但请注意,容器内的服务应该绑定到`0.0.0.0`,而不是`127.0.0.1`,否则只能接受容器内部的请求,不能接受来自其他容器的请求。7.**关于宿主机网络模式**还有一种方式是使用宿主机网络模式(`--networkhost`),这样容器会共享宿主机的网络命名空容器内启动的服务直接绑定到宿主机的端口上。此时,在容器内可以通过`localhost`访问宿主机上的其他服务,但要注意端口冲突问题。8.**容器访问宿主机服务**如果容器需要访问宿主机上的服务(比如宿主机上运行了一个数据库),可以使用特殊DNS名称`host.docker.internal`(在DockerforWindows和Mac上支持,Linux下默认不支持)。对于Linux,可以通过以下方式之一解决:-在运行容器时添加参数`--add-host=host.docker.internal:host-gateway`,这样在容器内就可以用`host.docker.internal`来访问宿主机。-或者直接使用宿主机的IP地址(注意:宿主机IP可能会变动)。9.**查看bridge网络信息**使用`dockernetworkinspectmy-bridge-network`可以查看网络详情,包括连接的容器及其IP地址。10.**多个容器使用同一个bridge网络**所有需要互相通信的容器都连接到同一个自定义bridge网络即可。根据引用[2],我们还可以知道容器通过vethpair连接到bridge(如docker0)上。自定义bridge网络会创建一个新的网桥,而不是使用默认的docker0。最后,为了避免连接被拒绝,请确保:-容器内的服务已经正确启动并监听在正确的地址和端口上(监听0.0.0.0)。-容器通过容器名称或自定义的别名进行访问。-防火墙设置:如果使用了自定义网络,通常不需要额外的防火墙设置,因为Docker会自动处理。但如果宿主机防火墙开启,需要确保DOCKER链的规则允许。如果问题依然存在,可以进入容器内部检查服务状态和网络连通性。下面,我们将用一个示例来演示如何配置两个容器(一个运行vLLM服务,另一个运行OpenWebUI)使其能够通信。示例步骤:1.创建自定义网络:```bashdockernetworkcreateai-network```2.启动vLLM容器(假设使用vLLM的Docker镜像):```bashdockerrun-d--namevllm-service\--networkai-network\--gpusall\-p8000:8000\vllm/vllm-openai:latest\--modelyour-model--port8000```注意:这里将容器的8000端口映射到了宿主机的8000端口(方便宿主机访问),但容器通信并不需要这个映射,因为它们在同一个网络中。这里为了同时让宿主机能访问,所以做了映射。3.启动OpenWebUI容器:```bashdockerrun-d--nameopenwebui\--networkai-network\-p3000:8080\--add-host=host.docker.internal:host-gateway\-eOPENAI_API_BASE_URL=http://vllm-service:8000/v1\ghcr.io/open-webui/open-webui:main```说明:-`--networkai-network`:连接到同一个自定义网络。-`-eOPENAI_API_BASE_URL=http://vllm-service:8000/v1`:这里使用了vLLM容器的名称(vllm-service)作为主机名,端口为8000(容器内的端口)。-`--add-host=host.docker.internal:host-gateway`:可选,如果OpenWebUI需要访问宿主机上的其他服务,可以通过这个设置。这样,OpenWebUI容器就可以通过`http://vllm-service:8000/v1`访问vLLM服务了。如果你不使用Docker运行vLLM,而是直接在宿主机上运行,那么OpenWebUI容器访问宿主机上的vLLM服务,可以使用:```bashOPENAI_API_BASE_URL=http://host.docker.internal:8000/v1```最后,生成相关问题。</think> ### Docker容器网络互通解决方案 针对容器网络连接被拒绝的问题,以下是三种推荐配置方法: #### 1. 自定义Bridge网络(推荐)💻[^1][^2] ```bash # 创建自定义网络 docker network create my-bridge # 运行容器并加入网络 docker run -d --name container1 --network my-bridge my-image docker run -d --name container2 --network my-bridge my-image # 容器通过名称互相访问 docker exec container2 curl http://container1:8000/v1/models ``` 📌 **优势**: - 容器通过容器名自动DNS解析 - 支持广播、多播通信 - 自动IP地址分配管理 - 网络隔离更安全[^2] #### 2. Host网络模式(简单场景)🏠[^2] ```bash # 共享宿主机网络命名空 docker run -d --network host --name container1 my-image docker run -d --network host --name container2 my-image # 容器通过localhost访问 docker exec container2 curl http://localhost:8000/v1/models ``` ⚠️ **注意**:此模式取消网络隔离,存在安全隐患,适用于测试环境。 #### 3. 容器直接连接🔗[^1][^3] ```bash # 先启动第一个容器 docker run -d --name container1 -p 8000:8000 my-image # 启动第二个容器并连接 docker run -d --name container2 --link container1:app my-image # 在container2中访问 docker exec -it container2 curl http://app:8000/v1/models ``` 📍 **适用场景**:简单一对一连接,老版本Docker兼容方案。 --- ### 排查步骤🔍 当出现`connection refused`错误时: 1. **检查容器网络连接**: ```bash docker exec -it container1 ping container2 docker exec -it container2 curl -v http://container1:8000 ``` 2. **验证端口监听**: ```bash # 在服务容器内执行 docker exec container1 netstat -tuln | grep 8000 ``` 3. **检查防火墙规则**: ```bash docker exec container1 iptables -L -n ``` 4. **查看Docker网络配置**: ```bash docker network inspect my-bridge ``` --- ### 高级技巧⚙️ 1. **跨主机容器通信**: ```bash # 创建overlay网络 docker network create -d overlay my-overlay ``` 2. **固定容器IP**: ```bash docker run -d --net my-bridge --ip 172.18.0.100 my-image ``` 3. **容器访问宿主机服务**[^4]: ```bash # 在容器内使用特殊域名 curl http://host.docker.internal:8000/v1/models ``` > 📌 **关键配置**:确保服务绑定到`0.0.0.0`而非`127.0.0.1`,否则只能接受本地访问请求 --- ### 配置验证✅ 成功配置后应返回: ```json { "object": "list", "data": [{ "id": "model-name", "object": "model" }] } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值