远程连接 docker -H 10.0.0.5:2375 images
dockerd守护进程的C/S,其默认仅监听Unix SOcket格式的地址,/var/run/docker.sock;如果使用TCP套接字,
/etc/docker/daemon.json:
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
docker 容器网络
•Docker关注两种类型的网络:
•单主机虚拟网络
•提供容器隔离
•多主机网络
•提供一个覆盖层,参与主机上的任何容器都可以从网络中的任何其他容器拥有自己的可路由IP地址
•默认的本地Docker网络拓扑和两个附加容器
四种网络容器原型
桥接容器
•桥接式容器一般拥有两个接口:一个环回接口和一个连接至主机上某
桥设备的以太网接口
•docker daemon启动时默认会创建一个名为docker0的网络桥,并且创建
的容器为桥接式容器,其以太网接口桥接至docker0
•--net bridge即为将容器接口添加至docker0桥
•docker0桥为NAT桥,因此,桥接式容器可通过此桥接口访问外部网络
,但防火墙规则阻止了一切从外部网络访问桥接式容器的请求
• ~]# docker run --rm --net bridge busybox:latest ifconfig -a
#可以为docker run命令使用
# “--hostname HOSTNAME”选项为容器指定主机名,例如
[root@localhost ~]# docker run --rm --net bridge --hostname bbox.magedu.com busybox:latest nslookup bbox.magedu.com
# “--dns DNS_SERVER_IP”选项能够为容器指定所使用的dns服务器地址,例如
[root@localhost ~]# docker run --rm --dns 172.16.0.1 busybox:latest nslookup docker.com
# “--add-host HOSTNAME:IP”选项能够为容器指定本地主机名解析项,例如
[root@localhost ~]# docker run --rm --dns 172.16.0.1 --add-host "docker.com:172.16.0.100" busybox:latest
nslookup docker.com
Opening inbound communication
•Docker0为NAT桥,因此容器一般获得的是私有网络地址
•可以把容器想像为宿主机NAT服务背后的主机
•如果开放容器或其上的服务为外部网络访问,需要在宿主机上为其定
义DNAT规则,例如
•对宿主机某IP地址的访问全部映射给某容器地址
• 主机IP 容器IP
• -A PREROUTING -d 主机IP -j DNAT --to-destination 容器IP
•对宿主机某IP地址的某端口的访问映射给某容器地址的某端口
• 主机IP:PORT 容器IP:PORT
• -A PREROUTING -d 主机IP -p {tcp|udp} --dport 主机端口 -j DNAT --to-destination 容器IP:容
器端口
•为docker run命令使用-p选项即可实现端口映射,无须手动添加规则
•-p选项的使用格式
•-p
• 将指定的容器端口映射至主机所有地址的一个动态端口
•-p
• 将容器端口
•-p
• 将指定的容器端口
•-p
• 将指定的容器端口
• “动态端口”指随机端口,具体的映射结果可使用docker port命令查看
•“-P”选项或“--publish-all”将容器的所有计划要暴露端口全部映射至
主机端口
•计划要暴露的端口使用使用--expose选项指定
•例如
• ~]# docker run -d -P --expose 2222 --expose 3333 --name web busybox:latest /bin/httpd -p
2222 -f
•查看映射结果
• ~]# docker port web
•如果不想使用默认的docker0桥接口,或者需要修改此桥接口的网络属
性,可通过为docker daemon命令使用-b、--bip、--fixed-cidr、--
default-gateway、--dns以及--mtu等选项进行设定
内联式容器
•联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟
内的各容器共享使用;因此,联盟式容器彼此间完全无隔离,例如
•创建一个监听于2222端口的http服务容器
• ~]# docker run -d -it --rm -p 2222 busybox:latest /bin/httpd -p 2222 -f
•创建一个联盟式容器,并查看其监听的端口
• ~]# docker run -it --rm --net container:web --name joined busybox:latest netstat -tan
•联盟式容器彼此间虽然共享同一个网络名称空间,但其它名称空间如User、Mount
等还是隔离的
•联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需
要程序loopback接口互相通信、或对某已存的容器的网络属性进行监控时才使用此
种模式的网络模型
Closed containers
•不参与网络通信,运行于此类容器中的进程仅能访问本地环回接口
•仅适用于进程无须网络通信的场景中,例如备份、进程诊断及各种离
线任务等
• ~]# docker run --rm --net none busybox:latest ifconfig -a
Open containers
•开放式容器共享主机网络名称空间的容器,它们对主机的网络名称空
间拥有全部的访问权限,包括访问那些关键性服务,这对宿主机安全
性有很大潜在威胁
•为docker run命令使用“--net host”选项即可创建开放式容器,例如:
• ~]# docker run -it --rm --net host busybox:latest /bin/sh
实验手动创建网络命名空间,可以被容器共享
#创建网络命名空间 n1 n2
[root@localhost ~]# ip netns add n1
[root@localhost ~]# ip netns add n2
[root@localhost ~]# ip netns list
n2
n1
# 查看n1中的网卡情况
[root@localhost ~]# ip netns exec n1 ifconfig
[root@localhost ~]# ip netns exec n1 ifconfig -a
lo: flags=8 mtu 65536
loop txqueuelen 1000 (Local Loopback)
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
# 不同的连接方式
TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
bridge | bond | team | ipoib | ip6tnl | ipip | sit | vxlan |
gre | gretap | ip6gre | ip6gretap | vti | nlmon | team_slave |
bond_slave | ipvlan | geneve | bridge_slave | vrf | macsec }
# 创建了veth 类型的网卡
[root@localhost ~]# ip link add name eth0 type veth peer name eth1
#可以看到eth0@eth1和eth1@eth0
[root@localhost ~]# ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:b9:6f:a6 brd ff:ff:ff:ff:ff:ff
3: docker0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:17:35:07:c0 brd ff:ff:ff:ff:ff:ff
16: eth1@eth0: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 6e:e9:90:94:04:83 brd ff:ff:ff:ff:ff:ff
17: eth0@eth1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 2e:13:1f:98:dc:a6 brd ff:ff:ff:ff:ff:ff
# 将网卡连接到命名空间中
[root@localhost ~]# ip link set dev eth0 netns n1
[root@localhost ~]# ip netns exec n1 ifconfig -a
eth0: flags=4098 mtu 1500
ether 2e:13:1f:98:dc:a6 txqueuelen 1000 (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
lo: flags=8 mtu 65536
loop txqueuelen 1000 (Local Loopback)
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
# 设置宿主机IP和命名空间中的IP,并测试网络
[root@localhost ~]# ip netns exec n1 ifconfig eth0 192.168.1.1/24 up
[root@localhost ~]# ifconfig eth1 192.168.1.2/24 up
[root@localhost ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.162 ms
^C
--- 192.168.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.162/0.162/0.162/0.000 ms
# 可以通过操作将这对网卡随意切换到不同的命名空间或者宿主机模拟不同的网络情况
[root@localhost ~]# ip netns exec n1 ifconfig eth0 down
[root@localhost ~]# ip netns exec n1 ip link set dev eth0 name eth2
[root@localhost ~]# ip netns exec n1 ifconfig -a
eth2: flags=4098 mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
ether 2e:13:1f:98:dc:a6 txqueuelen 1000 (Ethernet)
RX packets 11 bytes 838 (838.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11 bytes 838 (838.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=8 mtu 65536
loop txqueuelen 1000 (Local Loopback)
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
#创建桥
[root@localhost ~]# docker network create -d bridge --subnet "192.168.0.1/24" --gateway "192.168.0.1" mybr0
[root@localhost ~]# ifconfig br-3291c2f3f6eb down && ip link set dev br-3291c2f3f6eb docker1
# 自定义docker0桥的网络属性信息:/etc/docker/daemon.json文件
#核心选项为bip,即bridge ip之意,用于指定docker0桥自身的IP地址;其它选项可自动通过此地址计算得出
{
"bip": "10.20.0.0/16",
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
总结:
bridge模式:桥接docker0
--net=bridge
Host模式:与主机共享网络命名空间
--net=host
Container模式:与容器共享网络命名空间
--net=container:nginx
Node模式:没有网络
--net=none
资料:https://www.cnblogs.com/yy-cxd/p/6553624.html
docker 数据管理
Volumes
•Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
•如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会
从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制
•关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会全部丢失
•存在的问题
•存储于联合文件系统中,不易于宿主机访问;
•容器间数据共享不便
•删除容器其数据会丢失
•解决方案:“卷(volume)”
• “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定(关联)
Data volumes
•Data volumes provide several useful features for persistent or shared data
•Volume于容器初始化之时即会创建,由base image提供的卷中的数据会于此期间完成复制
•数据卷可以在容器之间共享和重用
•直接更改数据卷
•更新镜像时不包括对数据卷的更改
•即使容器本身被删除,数据卷也会保持不变
•Volume的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时既不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作;
•卷为docker提供了独立于容器的数据管理机制•可以把“镜像”想像成静态文件,例如“程序”,把卷类比为动态内容,例如”;于是,镜像可以重用,而卷可以共享;
•卷实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和“制作镜像”分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境
Volume types
•Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在
宿主机上的位置有所不同;
•绑定装载卷
•指向主机文件系统上用户指定位置的卷
•Docker管理的卷
•Docker守护进程在Docker拥有的主机文件系统的一部分中创建托管卷
在容器中使用Volumes
#为docker run命令使用-v选项即可使用Volume
# docker管理的数据卷
[root@localhost ~]# docker run -it -name bbox1 –v /data busybox
[root@localhost ~]# docker inspect -f {{.Mounts}} bbox1
# 查看bbox1容器的卷、卷标识符及挂载的主机目录
# 绑定指定数据卷
[root@localhost ~]# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
[root@localhost ~]# docker inspect -f {{.Mounts}} bbox2
# 共享卷
#有两种方法可以在容器之间共享卷
#多个容器的卷使用同一个主机目录,例如
[root@localhost ~]# docker run –it --name c1 -v /docker/volumes/v1:/data busybox
[root@localhost ~]# docker run –it --name c2 -v /docker/volumes/v1:/data busybox
#复制使用其它容器的卷,为docker run命令使用--volumes-from选项
[root@localhost ~]# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox
[root@localhost ~]# docker run -it --name bbox2 --volumes-from bbox1 busybox
EXPOSE
• 用于为容器打开指定要监听的端口以实现与外部通信
• EXPOSE
•
• EXPOSE指令可一次指定多个端口,例如 • EXPOSE 11211/udp 11211/tcp
EXPOSE 80/tcp 22/tcp (需要使用 -P 对外暴露)
ENV
• 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令 (如ENV、ADD、COPY等)所调用
• 调用格式为{variable_name}
• ENV
• ENV
• 第一种格式中,
• 第二种格式可用一次设置多个变量,每个变量为一个"
• 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
ENV DOC_ROOT=/data/web/ \
WEB_SERVER_PACKGE="nginx-1.15.2"
COPY index.html ${DOC_ROOT:-/data/web/} (:-设置默认值)
WORKDIR /usr/local/
ADD ${WEB_SERVER_PACKGE}.tar.ge ./src/