Docker容器(宿主机应用)之间的相互访问和使用的网络模式有关。关于Docker的四种网络模式这里不做详细介绍,只选取个人常用的host模式以及bridge模式下进行容器之间的访问测试。
Bridge模式
容器间相互访问
容器生成时候默认的网络模式,以docker0为网桥进行连接。运行命令ifconfig -a查看IP,docker0一般为172.17.0.1。
启动两个容器。
docker run -dit --rm --name nginx -p 80:80 -p 443:443 nginx #创建一个bridge模式的nginx容器
docker run -dit --rm --name test1 -p 8088:80 alexwillbegood/test1
分别进入两个容器,查看ip地址(这里没有安装net-tools,所以直接查文件)
docker exec -it nginx /bin/bash
cat /etc/hosts
看到两个容器地址分别为172.17.0.3和172.17.0.4。
image.png
nginx容器能ping通test1容器。
image.png
因此在默认的bridge模式下面,可以通过容器IP相互访问,但是由于容器IP地址不固定,在实际使用比如nginx容器中配置反向代理位置,显然不合适。
server {
listen 6016 ;
server_name xxx.xxx.xxx;
ssl_certificate /data/publish/httpsCert/2789257__meten.com.pem;
ssl_certificate_key /data/publish/httpsCert/2789257__meten.com.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://172.17.0.4; #地址会改变
proxy_read_timeout 1800;
client_max_body_size 500m;
}
}
可以将两个容器添加到相同的网桥中,然后使用别名进行访问。
docker network create test-bridge #创建新网桥
docker network connect test-bridge nginx #将容器nginx加入test-bridge网桥
docker network connect test-bridge test1 #将容器test1加入test-bridge网桥
可以通过网络别名访问。
server {
listen 6016 ;
server_name xxx.xxx.xxx;
ssl_certificate /data/publish/httpsCert/2789257__meten.com.pem;
ssl_certificate_key /data/publish/httpsCert/2789257__meten.com.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://test1; #名字相对固定
proxy_read_timeout 1800;
client_max_body_size 500m;
}
}
容器访问宿主机应用
bridge网络模式下可以通过docker0地址进行访问,Linux一般为172.17.0.1.
server {
listen 6016 ;
server_name xxx.xxx.xxx;
ssl_certificate /data/publish/httpsCert/2789257__meten.com.pem;
ssl_certificate_key /data/publish/httpsCert/2789257__meten.com.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://172.17.0.1:8088; #地址也相对固定
proxy_read_timeout 1800;
client_max_body_size 500m;
}
}
Host模式
宿主机上使用host网络模式的应用比较典型就是nginx,在host模式下面,另外启动host网络模式的容器时候不需要映射端口,容器和宿主机共享一个网络。
docker run -dit --rm --network host --name nginx -v nginx-vol:/etc/nginx nginx #创建一个host模式的nginx容器(host模式下面仅仅只能有一个容器)
docker run -dit --rm --name test1 -p 8088:80 alexwillbegood/test1
可以直接使用地址http://localhost:8088访问到容器。
网友评论