系列文章
Docker系列1 - CentOS7 安装Docker
Docker系列2 - Docker常用命令
Docker系列3 - Docker文件系统及搭建Docker私服
Docker系列4 - 在Docker中测试MySQL主从数据库
Docker系列5 - 在Docker中测试Redis集群
Docker系列6 - Dockerfile简介
Docker网络模式
Docker网络:容器IP变动时,可以通过服务名直接网络通信而不受到影响 (docker容器内部的IP是有可能会发生改变的)
docker network ls
#创建删除网络
docker network create test_network
docker network ls
#驱动默认是bridge
docker network inspect test_network
docker network rm test_network
常用的网络模式
- bridge:为每一个容器分配、设置IP等,并将容器连接到docker0(默认模式)
- host:虚拟器不会虚拟出自己的网卡,而是使用宿主机的IP和端口
- container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
Docker服务默认会创建一个docker0网桥,它在内核层连通了其它的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络
Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信
docker network inspect bridge
docker network inspect host
docker network inspect none
#关闭所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
#删除所有容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
#删除所有镜像(慎用)
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
#在主机上查看ip
ip addr
#veth和eth0配对(40<==>39, 42<==>41)
40: veth0a3e4a3@if39
42: vethee89f7d@if41
#在容器内部查看ip
docker exec -it tomcat81 /bin/bash
ip addr
39: eth0@if40
host模式
host模式直接使用宿主机的IP地址也外界进行通信,不再需要额外进行NAT转换
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
#docker启动时指定--network host 同时指定了-p映射端口,会有此警告,且通过-p设置的参数不会起作用;端口号会以主机端口号为主,重复时则递增
#WARNING: Published ports are discarded when using host network mode
docker ps
curl http://127.0.0.1:8080
docker rm -f tomcat83
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
#查看Networks中的IPAddress、Gateway
docker inspect tomcat83
docker inspect tomcat81
#host模式,在容器内部查看IP,和在主机中查看IP是一样的
docker exec -it tomcat83 /bin/bash
ip addr
none模式
none模式:禁用网络功用(不为Docker容器进行任何网络配置),只有lo标识(就是127.0.0.1表示本地回环)
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker inspect tomcat84 | tail -n 20
docker exec -it tomcat84 /bin/bash
ip addr
container模式
container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat85 billygoo/tomcat8-jdk8
#docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
#相当于tomcat86和tomcat85公用同一个ip同一个端口,导致端口冲突
docker rm -f tomcat85
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
#在alpine1、alpine2中查看ip(公用同一个ip)
ip addr
#停掉alpine1,查看alpine2的ip
docker stop alpine1
#在alpine2中查看ip,此时alpine2没有内网的ip地址了
ip addr
自定义网络
#删除所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
ip addr
#使用默认的网络
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 /bin/bash
ip addr
docker exec -it tomcat82 /bin/bash
ip addr
ping 172.17.0.3
ping 172.17.0.2
#无法使用服务名ping通
ping tomcat81
ping tomcat82
#创建自定义网络
docker network create test_network
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker run -d -p 8081:8080 --network test_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network test_network --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 /bin/bash
ip addr
docker exec -it tomcat82 /bin/bash
ip addr
ping 172.17.0.3
ping 172.17.0.2
#可以使用服务名ping通
ping tomcat81
ping tomcat82
#64 bytes from tomcat82.test_network (172.18.0.3)
结论:自定义网络本身就维护好了主机名和IP的对应关系