docker网络的配置

目的

如题,大致记录了解到的docker中关于网络的配置

为什么docker中要有网络

每个container其实就像现实中的计算机,
为了让他们互相通信,有时尤其是为了让他们模拟出在一个局域网下的效果,
需要定义一些连接的方式.

目前我了解的,两个container互相通信的方式

  • 都使用 -p 暴露接口,通过接口访问
  • 启动c2时使用 -link 参数指定要连接c1
  • 使用自定义网络

使用link的方式

1
2
docker run -it --rm --name busybox1 busybox sh # 启动c1
docker run -it --rm --name busybox2 --link busybox1:b1 busybox sh # 启动c2

此处busybox2使用link参数指定了需要链接busybox1.语法: <container~name~>:<alias>
具体表现为在busybox2中可以使用

1
2
3
4
ping b1 -c 2                # 可以ping通
ping busybox1 -c 2 # 可以ping通
arp # 出现"b1"对应的ip,mac
env # 比没有设置link参数的多出一些结果

注意link是单方向的,从busybox1无法ping通busybox2,busybox1的arp表也不会出现busybox2

使用自定义网络

docker中网络相关的命令有

1
2
3
4
5
docker network ls   # 查看网络
docker network create -d bridge my-net # 创建网络
docker run -it --rm --name busybox1 --network my-net busybox sh # 加入网络
docker run -it --rm --name busybox2 --network my-net busybox sh # 加入网络
docker network rm my-net # 删除网络

其中创建网络时通过 -d 指定网络的类型,有 bridgeoverlay, 其中常用的是 bridge.
overlay 则是在 swarm mode 中常用的.

加入同一个网络的两个container可以互相ping通,同时arp表中会出现类似下面的内容

1
busybox2.my-net (172.27.0.3) at 02:42:ac:1b:00:03 [ether]  on eth0

配置hostname与DNS

使用 docker run 时可以分别用参数指定hostname与DNS

1
docker run -it --rm --name busybox1 -h b1 --dns=8.8.8.8 busybox sh

效果如下(在docker内执行)

1
2
3
hostname             # b1
cat /etc/hostname # b1
cat /etc/resolv.conf # nameserver 8.8.8.8

如果不指定,则默认hostname为随机字符串,DNS为host机的DNS
同时也可以在docker的daemon配置文件中指定默认的DNS服务器

参考

  1. 一个比较系统的docker解说