Docker RemoteAPI 与 网络管理

检查API是否一致

使用sudo docker version查看

Docker RemoteAPI 与 网络管理Docker RemoteAPI 与 网络管理

修改服务器端配置

修改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

Docker RemoteAPI 与 网络管理

从返回的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虚拟网桥

Docker RemoteAPI 与 网络管理

通常网桥是一个纯数据链路层的概念,然而在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需要创建网络的两端如下:

Docker RemoteAPI 与 网络管理

一端是在容器的网络设备,一端则是在运行容器的宿主机器上。这个过程验证如下:

可以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 RemoteAPI 与 网络管理
这样的修改似乎只能在临时创建的新容器中生效,重启服务失生效
  • 更改docker守护进程的启动配置:

    /etc/default/docker 中添加DOCKER_OPS-b = brO

    其中br0为自定义的虚拟网桥,添加虚拟网桥的方式如下:

    sudo brctl addbr br0

    同样使用ifconfig为新增网桥添加IP

    然后修改配置文件/etc/default/docker添加添加DOCKER_OPS-b = brO

    重启服务以生效

Docker容器的互联

允许所有容器互联

拒绝容器间互联

允许特定容器间的连接

相关推荐