13.Docker网络配置与调试
目录
Docker Network配置与调试
查看虚拟网卡
yum install -y bridge-utils
brctl show
ip link show
管理网络命名空间(docker 底层调用实现)
#查看是否有ip命令包
rpm -q iproute
#命名网络空间
ip netns add r1
ip netns add r2
#查看网络命名空间
ip netns list
#在命名空间中执行命令
ip netns exec r1 -a
ip netns exec r1 ipconfig
#创建虚拟网卡对
ip link add r1 veth1.1 type veth peer name veth1.2
#查看网卡
ip link show
#移动虚拟网卡至r1空间
ip link set dev veth1.2 netns r1
#查看本地主机host
ip link show
#查看r1空间内网络
ip netns exec r1 ipconfig -a
#修改r1内名称
ip netns exec r1 ip link set dev veth1.2 name eth0
#查看r1空间内网络
ip netns exec r1 ipconfig -a
#配置主机veth1.1网络
ifconfig veth1.1 10.1.0.1/24 up
#配置r1空间内网络
ip netns exec r1 ifconfig eth0 10.1.0.2/24 up
#查看r1空间内网络
ip netns exec r1 ipconfig
#测试(实现主机与命名空间r1互通)
ping 10.1.0.2
#移动veth1.1到r2命名空间
ip link set dev veth1.1 netns r2
#查看本地网络
ifconfig
#查看r2命名空间
ip netns exec r2 ipconfig -a
#激活r2
ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up
#查看r2命名空间
ip netns exec r2 ipconfig
#测试(实现命名空间r1与命名空间r2互通)
ip netns exec r2 ping 10.1.0.2
基础命令
#查看docker详细信息
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker container inspect web1
#查看docker网络
docker network COMMAND
docker network inspect bridge
未指定网络时、默认设置为bridge模式
命令(network) | 描述 | |
---|---|---|
connect | Connect a container to a network | 连接一个容器到网络 |
create | Create a network | 创建网络 |
disconnect | Disconnect a container from a network | 关闭一个容器的网络 |
inspect | Display detailed information on one or more networks | 查看docker网络信息描述 |
ls | List networks | 列出网络信息 |
prune | Remove all unused networks | 删除全部无用网络 |
rm | Remove one or more networks | 删除一个或多个网络 |
指定docker网络
命令(run commond) | 描述 |
---|---|
--name | 指定容器名称 |
--network | 指定容器网卡模式 |
--dns | 指定容器内部dns |
--dns-search | 指定容器dnssearch |
--add-host | 添加容器内部host解析 |
-h | 指定容器主机名 |
实例
#创建指定busybox
docker run --name nginxweb1 \ #指定容器名称
-it \ #交互式
--network bridge \ #指定容器网卡模式
--dns 114.114.114.114 \ #指定容器内部dns
--dns-search gms.io \ #指定容器dnssearch
-h web.gms.com \#指定容器主机名
--add-host www.gms.com:1.1.1.1 \ #添加容器内部host解析
--rm busybox:latest \ #退出后删除容器
暴露docker
查看容器暴露端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
暴露端口
docker run -p
随机映射
#暴露nginx_docker
docker run --name nginxweb1 \ #指定容器名称
-p 80 \ #暴露容器80端口、不指定host端口则随机一个host端口
gms/httpd:v1
指定主机地址映射
#暴露nginx_docker
docker run --name nginxweb1 \ #指定容器名称
-p 172.20.0.67::80 \ #暴露172.20.0.67主机8080:容器80端口
gms/httpd:v1
指定主机端口映射
#暴露nginx_docker
docker run --name nginxweb1 \ #指定容器名称
-p 8080:80 \ #暴露主机8080:容器80端口
gms/httpd:v1
指定主机地址&端口映射
#暴露nginx_docker
docker run --name nginxweb1 \ #指定容器名称
-p 172.20.0.67:8080:80 \ #暴露主机8080:容器80端口
gms/httpd:v1
设置进程隔离
利用join container,利用网络共享;相当于宿主机上两个进程(但有各自运行空间,但可进行通信)
设置network共享容器(join container)
#创建busybox1
docker run --name b1 -it --rm busybox
#同一主机上创建busybox2,并加入busybox1网络
docker run --name b2 --network container:b1 -it --rm busybox
本地服务容器化部署
利用host模式,将docker服务直接暴露在宿主机上;减少部署成本
设置host主机模式
docker run --name b2 --network host -it --rm busybox
/# ifconfig
/# echo "hello container" > /tmp/index.html
/# httpd -h /tmp
/# netstat -tnl
自定义docker0网桥属性
修改/etc/docker/daemon.json
{
"bip":"10.0.0.1/16", #即bridge ip用于指定docker桥网络,其它选项自动计算(除dns)
"fixed-cidr": "10.20.0.0/16", #强制docker运行时使用指定执行驱动器
"fixed-cidr-v6": "2001:db8::/64", #强制docker运行时使用指定ipv6执行驱动器
"mtu": 1500, #网络的最大传输单元
"default-gateway": "10.20.1.1", #网关
"default-gateway-v6": "2001:db8:abcd::89", #ipv6网关
"dns":["10.20.1.2","10.20.1.3"]
}
核心选项为bip,即bridge ip用于指定docker桥网络,其它选项自动计算(除dns)
启用远程docker.sock连接
修改/etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
}
连接远程主机查看docker容器
docker -H 172.20.0.67:2375 images ls
docker --host 172.20.0.67:2375 images ls
添加新docker网桥&指定驱动模式
添加一个新bridge网桥;还可添加overlay、macvlan网络
docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" gmsbr0
查看
docker network ls
修改名称
ip link set dev br-4e7fd8d225b7 down
ip link set dev br-4e7fd8d225b7 name docker1
ip link set dev docker1 up
busybox1加入docker1网络
docker run --name gmst1 -it --net docker1 busybox:latest
busybox2添加至docker0
docker run --name gmst2 -it --net bridge busybox:latest
测试是否互通
#查看是否开启内核IP地址转换
cat /proc/sys/net/ipv4/ip_forward
1
#被防火墙规则拦截
iptables -vnL