Mac 上装了Docker,但我的Docker服务怎么对外开放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mac 上装了Docker,但我的Docker服务怎么对外开放相关的知识,希望对你有一定的参考价值。

参考技术A 使Docker提供对外服务的网络配置(桥接与端口)
峰云,就她了。

前沿:
docker 启动容器后,如何对外服务? 希望大家看了这篇文章后有些帮助。
docker的有关网络问题没怎么搞清楚,请教 !
Docker生成的容器,一般会给你生成一个ip地址,这个ip地址是和docker0的地址是一个ip段的。
通过ip a命令 ,咱们可以看到docker0的ip和子网的范围 。 大家会发现除了docker0 还有一个vethc 数字的网卡,这个也算是虚拟网卡绑在桥接上的。

我们创建一个容器,并且暴露22端口。 这个22端口的意思是对外暴露了22端口,系统会从49000-49900端口范围内给你分配一个端口。
docker run 指明端口有两种的方式,一种是-P ,他是识别容器里的dockerfile声明的端口关系。 还有一个是-p 这个是小屁屁,他就可以直白点了。 比如 -p 6379,是对外暴露了6379。 6379:6379 是外面是6379,里面也是6379 。

root@dev-ops:~# docker run -d -p 22 --name="redis_test" rastasheep/ubuntu-sshd
ed7887b93aa452323ee96339d889bebc36ad25a479c660ba89e97d2c5869f105
root@dev-ops:~#
root@dev-ops:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed7887b93aa4 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 7 seconds ago Up 7 seconds 0.0.0.0:49153->22/tcp redis_test
root@dev-ops:~#

原来我以为docker是写了一个socker做了端口的映射功能,看文档才知道,他就是调用了一个 iptable的端口映射。
iptables -t nat -L

Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- localhost/16 !localhost/16

Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:49153 to:172.17.0.2:22
root@dev-ops:~#

有主机的ip,和容器的ip,那你还怕啥 ! 想映射什么,自己映射。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80

docker之间的容器默认是互通的,也就是两个容器可以互相的通信。 如果想控制容器之间的通信,可以利用 docker 的 --icc 属性控制。

好了,我们在说下桥接的方式。 如果你觉得麻烦,每次都需要做端口的映射,或者是修改映射,那你可以考虑下用桥接网卡的模式。 貌似一些论坛上的牛人不太推荐用桥接,估计是为了安全的问题。 毕竟nat的话,对外是安全的,对外的服务也只是暴露出端口而已。 而桥接的话,会暴露ip出去。

暂停docker服务
sudo service docker stop
用ip命令使docker0网卡down掉
sudo ip link set dev docker0 down
删除网卡
sudo brctl delbr docker0
创建一个网卡 名字是bridge0
sudo brctl addbr bridge0
ip地址和子网
ip addr add 192.168.5.1/24 dev bridge0
启动桥接网卡
sudo ip link set dev bridge0 up
写入配置
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
sudo service docker start
这样的桥接方式有个问题就是,他的ip是docker自己检测搞给你的,貌似不是dhcp获取空闲的,然后赋予给容器的。我昨天再次做测试的时候,有一个ip被占用的,但是他还是分喷给了一个被占用的ip地址。 这样的话就冲突了。 如果ip端和公司内部或者是线上重叠的话,可能会造成ip地址的冲突。 桥接后遇到ip地址冲突是个人结论 ,也可能是我这边环境导致的这类问题!

以上是关于Mac 上装了Docker,但我的Docker服务怎么对外开放的主要内容,如果未能解决你的问题,请参考以下文章

Mac 上装了Docker,但我的Docker服务怎么对外开放

mac装docker损害大吗

在redhat6上装1.8以下的docker

Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?

mac系统Docker安装Redis教程

如何在 mac 上将 docker 存储驱动程序更改为 devicemapper