Docker RemoteAPI 与 网络管理
检查API是否一致
使用sudo docker version
查看
修改服务器端配置
修改Docker守护进程启动选项
-H tcp://host:port unix:///path/to/socket, fd://* or fd://socketfd
守护进程默认配置:
-H unix:///var/run/docker.sock
Ubuntu(192.168.56.102)服务器端/etc/default/docker
DOCKER_OPTS=" --label name=server -H tcp://0.0.0.0:2375 "
全0代表绑定自身的端口,通常是2375,修改完成要重启服务
sudo service docker restart ps -ef | grep # 查看配置是否生效
客户端访问
CentOS 客户端访问curl http://192.168.56.102:2375/info
从返回的json中可以看到"Labels":["name=server"]
接着在客户端使用docker
访问服务器的守护进程
# whoami at localhost.localdomain in [~] $ docker -H tcp://192.168.56.102:2375 info Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 17.12.0-ce 。。。。。。 Labels: name=server Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No swap limit support
可以看到同样有着name=server
的字样
客户端环境变量简化操作
声明一个环境变量:
export DOCKER_HOST="tcp://192.168.56.102:2375"
以后只要环境变量中存在着非空DOCKER_HOST
变量时,运行的docker
命令都会去访问运程的守护进程,在不需要与远程进行连接时,只需要将DOCKER_HOST
置空即可
export DOCKER_HOST=""
服务端守护进程接收多访问
服务端在接受客户端访问时,自身可能不能使用docker
命令,需要进一步设置自身接受多访问
DOCKER_OPTS=" --label name=server -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
Docker容器的网络基础
使用ifconfig
查看网络状态时,会发现多一个网络docker0
,而docker
守护进程正是通过该网络实现网络连接如下:
# whoami at localhost.localdomain in [~] $ ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet x.x.x.x netmask 255.255.0.0 broadcast x.x.x.x ether x:x:x:x:x:x txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
当然要在启动服务之后才能看到网络docker0
docker0虚拟网桥
通常网桥是一个纯数据链路层的概念,然而在Linux中虚拟网却不是这样的,它的特点如下:
Linux虚拟网桥的特点:
- 可以设置
IP
地址 - 相当于拥有一个
隐藏的虚拟
网卡
这样Linux虚拟网桥就跨越到了第三层了。Linux虚拟网桥是通用网络设备抽象的一种,通过IP可以查找得到它,本身就成为一张网卡(虚拟的)。
dockerO的地址划分
- IP: 172.17.x.x
- 子网掩码:255.255.0.0
- MAC: 02:42:ac:ll:00:00 到 02:42:ac:ll:ff:ff 总共提供了65534个地址
在一个容器启动时,docker0
需要创建网络的两端如下:
一端是在容器的网络设备,一端则是在运行容器的宿主机器上。这个过程验证如下:
可以Ubuntu中安装bridge-utils
以进行网桥管理
# whoami at iamwho in [~] $ brctl Usage: brctl [commands] commands: addbr <bridge> add bridge delbr <bridge> delete bridge addif <bridge> <device> add interface to bridge delif <bridge> <device> delete interface from bridge hairpin <bridge> <port> {on|off} turn hairpin on/off setageing <bridge> <time> set ageing time setbridgeprio <bridge> <prio> set bridge priority setfd <bridge> <time> set bridge forward delay sethello <bridge> <time> set hello time setmaxage <bridge> <time> set max message age setpathcost <bridge> <port> <cost> set path cost setportprio <bridge> <port> <prio> set port priority show [ <bridge> ] show a list of bridges showmacs <bridge> show a list of mac addrs showstp <bridge> show bridge stp info stp <bridge> {on|off} turn stp on/off
使用brctl show
查看docker0
如下:
# whoami at iamwho in [~] $ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242485afc84 no
运行一个容器:
docker run -it --name=nwt0 ubuntu /bin/bash
再使用ifconfig
(如果查找不到命令,执行apt-get update
,安装net-tools
)查看网络:
root@164c3f8e3438:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3889 errors:0 dropped:0 overruns:0 frame:0 TX packets:2911 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:25143014 (25.1 MB) TX bytes:162373 (162.3 KB)
退出交互式到守护式,使用brctl show
会看到在interfaces
中多了一个vethxxxx
的网络接口
# whoami at iamwho in [~] $ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242485afc84 no vethc7ff419
自定义docker0
修改dockerO地址:
示例如下:
$ sudo ifconfig dockerO 192.168.200.1 netmask 255.255.255.0
这样的修改似乎只能在临时创建的新容器中生效,重启服务失生效
更改docker守护进程的启动配置:
/etc/default/docker
中添加DOCKER_OPS
值-b = brO
其中
br0
为自定义的虚拟网桥,添加虚拟网桥的方式如下:sudo brctl addbr br0
同样使用
ifconfig
为新增网桥添加IP然后修改配置文件
/etc/default/docker
添加添加DOCKER_OPS
值-b = brO
重启服务以生效