点击数:8
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,但部位容器进行任何网络配置,需要用户自行添加。