04-Docker网络与链接

Docker 容器的网络、数据卷决定了 Docker 如何外外部提供服务,并共享、存储数据。

Docker的网络模式

Docker 的网络设置直接决定可我们如何向外暴露服务。使用 --publish 将容器内的端口映射到主机上(Docker 默认的 bridge 模式),使用–net设置网络模式。Docker 的网络模式设置有四种:

  • host模式:使用--net=host指定。
  • container模式:使用--net=container:NAME_or_ID指定。
  • none模式:使用--net=none指定。
  • bridge模式:使用--net=bridge指定。

Docker Daemon启动后会在服务器上创建一个名为Docker0的虚拟网桥,让我们通过一系列的命令查看Docker0网桥的IP地址设置、路由设置。

Note: Docker Ubuntu 镜像如果没有 ifconfig 以及 ping 命令,则进入到容器的伪终端,执行下面命令安装:

apt-get update
// ifconfig
apt install net-tools
// ping
apt install iputils-ping

如果没有brctl命令,则可以使用下面命令安装:

apt-get install bridge-utils

可以通过 ifconfig 查看 Docker0 的网卡设置(Mac 版没有改虚拟显卡,具体可以查 docker 官网文档描述),它被分配到一个172.17.42.1/16 的 ip 地址,而 172.17.0.0/16 的整个私有网络IP段将保留给主机上创建的容器使用,默认的网络模式为bridge的容器在启动后都会有一个该网段IP地址的网卡:

ifconfig Docker0
# 输出信息

如果使用 host 模式,name 容器将和主机公用一个 Network Namespace,不会虚拟自己的网卡、配置自己的 IP 地址等,而是保持与主机一致。

现在用 host 模式启动一个容器,通过 ifconfig 查看网卡信息会发现与外部主机一模一样。

$ docker run -dit --net=host ubuntu:latest /bin/bash
# 输出 container id
dfffc16f8a3f235097fa57ab3549831a615d9f5e9bda5565779a25b2e563b81f
$ docker attach dfffc16f

进入虚拟终端,使用 ifconfig 查看网卡信息:

root@moby:/# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:1d:bf:d5:0d  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01
          inet addr:192.168.65.2  Bcast:192.168.65.255  Mask:255.255.255.0
          inet6 addr: fe80::e233:ddec:12c2:1da0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:33 errors:0 dropped:0 overruns:0 frame:0
          TX packets:45 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3352 (3.3 KB)  TX bytes:4776 (4.7 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:36 (36.0 B)  TX bytes:36 (36.0 B)

我们在容器内部安装一个 SSHd,之后启动服务:

root@moby$: apt-get install openssh-server
root@moby$: ssh start # 或者service ssh start ,但是发现没有service命令
root@moby$: ps -ef | grep ssh
root      3458     1  0 15:27 ?        00:00:00 /usr/sbin/sshd #说明启动成功了
root      3465     1  0 15:28 pts/0    00:00:00 grep --color=auto ssh

编辑 /etc/ssh/sshd_config 文件,将容器上的sshd服务的端口改为 1234,重新启动 sshd:

root@moby$: /etc/init.d/ssh restart
 * Restarting OpenBSD Secure Shell server sshd    [ OK ]
root@moby$: ps -ef | grep ssh
root      3620     1  0 15:38 ?        00:00:00 /usr/sbin/sshd

现在可以使用主机上的 eth0 网卡 IP 地址通过 1234 端口登录容器了。

contain 模式与 host 模式类似,但它不予主机共享 Network NameSpace 地址空间,而是与指定的一个容器共享。

none 模式有自己的 Network NameSpace,但部位容器进行任何网络配置,需要用户自行添加。

pipework管理网络

veth pair

pipework

容器链接与数据卷

容器链接

数据卷

点击量:21

发表评论