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

Posted

tags:

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

使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地址冲突是个人结论 ,也可能是我这边环境导致的这类问题!
参考技术A 没太明白什么意思,docker容器不是映射到宿主机的端口吗?这不就对外开放了吗?

在redhat6上装1.8以下的docker

因为目前1.8以上的docker最低要求是3.10的Linux内核,而我的内核版本远低于此。

1 [[email protected] home]# uname -r
2 2.6.32-754.11.1.el6.x86_64

鉴于我的vm上有一堆的dependency,并且没有太多的时间来把内核升级,所以只能咬牙在redhat6的环境下装docker,先把不能把代码mount到另外一台ubuntu上跑unittest这个事情给解决了(这里我想吐槽管杀不管埋的IT一百遍)。

docker主要依赖于CE(社区版,一般已经很够用了),它的主要依赖包如下:(这个是1.7版本的,从网上看到的)

lxc-libs-1.0.9-1.el6.x86_64.rpm
lua-alt-getopt-0.7.0-1.el6.noarch.rpm
lua-filesystem-1.4.2-1.el6.x86_64.rpm
lua-lxc-1.0.9-1.el6.x86_64.rpm
lxc-1.0.9-1.el6.x86_64.rpm
docker-io-1.7.1-2.el6.x86_64.rpm

device-mapper-libs-1.02.117-12.el6.i686.rpm
device-mapper-libs-1.02.117-12.el6.x86_64.rpm

但是我想用yum下载并安装,所以为了以防万一,我先装了个epel-release。EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.

 1 [[email protected] Downloads]# yum -y install epel-release 
2 Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
3 Updating certificate-based repositories.
4 Unable to read consumer identity
5
epel | 4.7 kB 00:00
6 itaas | 2.0 kB 00:00
7 itaas-extras | 1.8 kB 00:00
8 itaas-optional | 2.0 kB 00:00
9 itaas-supplementary | 2.0 kB 00:00
10 Setting up Install Process
11 Package epel-release-6-8.noarch already installed and latest version
12 Nothing to do

安装成功后,yum的源可以看到

 1 [[email protected] Downloads]# yum repolist  
2
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
3
Updating certificate-based repositories.
4 Unable to read consumer identity
5 repo id repo name status
6 epel Extra Packages for Enterprise Linux 6 - x86_64 12,503
7 itaas itaas 20,720
8 itaas-extras itaas extras yum repo 97
9 itaas-optional itaas optional yum repo 11,997
10 itaas-supplementary itaas supplementary yum repo 896 11 repolist: 46,213

查找docker相应的依赖包

 1 [[email protected] etc]# yum search docker
 2 Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
 3 Updating certificate-based repositories.
 4 Unable to read consumer identity
 5 ============================================================================================== N/S Matched: docker ===============================================================================================
 6 docker-io-fish-completion.x86_64 : fish completion files for docker
 7 docker-io-logrotate.x86_64 : cron job to run logrotate on docker containers
 8 docker-io-vim.x86_64 : vim syntax highlighting files for docker
 9 docker-io-zsh-completion.x86_64 : zsh completion files for docker
10 fedora-dockerfiles.x86_64 : Example dockerfiles to assist standing up containers quickly
11 golang-github-docker-libtrust-unit-test.x86_64 : Unit tests for golang-github-docker-libtrust package
12 golang-github-docker-spdystream-unit-test.x86_64 : Unit tests for golang-github-docker-spdystream package
13 golang-github-fsouza-go-dockerclient-devel.noarch : Client for the Docker remote API
14 golang-github-fsouza-go-dockerclient-unit-test.x86_64 : Unit tests for golang-github-fsouza-go-dockerclient package
15 imagefactory-plugins-Docker.noarch : Cloud plugin for Docker
16 python-docker-py.x86_64 : An API client for docker written in Python
17 python-docker-registry-core.noarch : Core package for docker-registry (drivers) developers
18 python-dockerfile-parse.noarch : Python library for Dockerfile manipulation
19 docker.x86_64 : KDE and GNOME2 system tray replacement docking application
20 docker-io.x86_64 : Automates deployment of containerized applications
21 docker-io-devel.x86_64 : A golang registry for global request variables (source libraries)
22 golang-github-docker-libcontainer.x86_64 : Configuration options for containers
23 golang-github-docker-libcontainer-devel.x86_64 : Configuration options for containers
24 golang-github-docker-libtrust-devel.noarch : Library for managing authentication and authorization
25 golang-github-docker-spdystream-devel.noarch : A multiplexed stream library using spdy
26 
27   Name and summary matches only, use "search all" for everything.

安装docker必须的依赖包,以为有些依赖包之间也存在依赖关系,所以有些装完,被依赖的包也就顺便一起装了。

1 [[email protected] etc]# yum install -y docker
2 [[email protected] etc]# yum install -y lua-lxc.x86_64
3 [[email protected] etc]# yum install -y lxc.x86_64
4 [[email protected] etc]# yum install -y docker-io.x86_64
5 [[email protected] etc]# yum install -y device-mapper-libs.i686
6 [[email protected] etc]# yum install -y device-mapper-libs.x86_64

然后把docker的service打开,确认docker是否装上了

1 [[email protected] docker]# service docker start
2 Starting docker:                                       [  OK  ]
3 [[email protected] docker]# docker info

这里需要注意一下,因为是redhat6,所以只有service,没有systemctl。这里还关系到另外一个问题,就是尽量不要把docker的存储位置迁移。

目前网上所教的方法,有如下几种:

1. 是把/var/lib/docker整个路径下的文件都拷贝到其他位置,然后再软链接回来。

2.是把/var/lib/docker整个路径下的文件都拷贝到其他位置,然后修改docker.service,

  • --graph=/data/docker:docker新的存储位置
  • --storage-driver=overlay : 当前docker所使用的存储驱动

虽然这俩方法都挺好的,但是redhat6的service写法于redhat7不同,并且我们这里装的docker版本比较低,软链接回来,有些路径依旧不对,docker pull会不起作用,并且明面上不会有报错。所以最好不迁移。

 

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

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

mac装docker损害大吗

在redhat6上装1.8以下的docker

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

mac系统Docker安装Redis教程

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