Docker网络与存储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker网络与存储相关的知识,希望对你有一定的参考价值。
第1章 docker网络类型
1.1 docker共有四种网络类型:
类型 | 说明 |
None | 不为容器配置任何网络功能,没有网络 --net=none 只有一个环回地址 |
Container | 与另一个运行中的容器共享Network Namespace,--net=container:containerID |
Host | 与主机共享Network Namespace,--net=host |
Bridge | Docker设计的NAT网络模型(默认类型) bridge默认docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个 docker容器分配网络命名空间,并且把容器ip桥接到物理机的虚拟网桥上 |
1.1 none网络
此模式下不会为任何容器配置任何网络参数,通常应用于本地应用服务的场景下使用
docker run -it --network none busybox / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever
1.2 与其它容器共享网络配置---> container
此模式与host相似,但此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身不会配置网络和端口,创建此模式容器进去之后,会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其他是互相隔离的,如进程
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2293dac38edc nginx "nginx -g 'daemon of…" 27 seconds ago Up 25 seconds 0.0.0.0:80->80/tcp wizardly_hopper 0dea7902d0a1 registry "/entrypoint.sh /etc…" 44 minutes ago Up 26 minutes 0.0.0.0:5000->5000/tcp registry docker run -it --network container:2293dac38edc busybox:latest /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 21: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
1.3 使用宿主机网络
此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个网络命名空间,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的
docker run -it --network host busybox:latest /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:0b:ad:d4 brd ff:ff:ff:ff:ff:ff inet 10.0.0.70/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe0b:add4/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:0b:ad:de brd ff:ff:ff:ff:ff:ff
1.4 自定义网络
? 创建网桥
docker network create --driver bridge jiang 0c03aaefad371f7de42151b5128d8a4e78373648b54900c10aa6e49462cdc2e7
? 查看网络列表
[[email protected] ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 19905a8a8c56 bridge bridge local 62d0c409c7ed host host local 0c03aaefad37 jiang bridge local f63205c97696 none null local
? 自定义网段设置网桥设备
[[email protected] ~]# docker network create --driver bridge --subnet 192.168.86.0/24 --gateway 192.168.86.1 jiang01 1ed82064325b48a7fee3f0bfeb39e29d00e10334b438d344741a90e300eccce1
? 分配ip进入容器
[[email protected] ~]# docker run -it --network jiang01 --ip 192.168.86.100 busybox / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 25: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:c0:a8:56:64 brd ff:ff:ff:ff:ff:ff inet 192.168.86.100/24 brd 192.168.86.255 scope global eth0
1.5 利用pipework工具为docker容器分配ip
? 安装pipework:
wget https://github.com/jpetazzo/pipework/archive/master.zip unzip master.zip cp pipework-master/pipework /usr/local/bin/ chmod +x /usr/local/bin/pipework
? 配置桥接网卡
安装桥接工具
yum install bridge-utils.x86_64 -y
修改网卡配置实现桥接:
修改eth0网卡,让br0实现桥接
cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.bak} vim /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=br0 vim /etc/sysconfig/network-scripts/ifcfg-br0 TYPE=Bridge BOOTPROTO=static NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=10.0.0.70 NETMASK=255.255.255.0 GATEWAY=10.0.0.254 DNS1=223.5.5.5 /etc/init.d/network restart
运行容器指定ip地址
pipework br0 $(docker run -it -d -p 80:80 nginx) 10.0.0.80/[email protected]
在其他机器上进行访问测试
[[email protected] ~]# curl 10.0.0.80 -I HTTP/1.1 200 OK Server: nginx/1.13.12 Date: Fri, 27 Apr 2018 04:27:49 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT Connection: keep-alive ETag: "5acb8e45-264" Accept-Ranges: bytes
1.6 容器间基于DNS通信:只有用户自定义的网络可以使用
docker run -it --network=jiang01 --name=test busybox / # / # ping test1
? 在启动一个容器
docker run -it --network=jiang01 --name=test1 busybox / # / # ping test
1.7 macvlan实现跨主机通信:
? 创建网络
docker network create --driver macvlan --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 macvlan_1 6a461f1e8320bfb1e9f33636ce19a97ca830dceb3e65644a1a64d61a88d5a74b
? 设置网卡为混杂模式
ip link set eth0 promisc on
? 创建使用macvlan网络容器
docker run -it --network=macvlan_1 --ip=10.1.0.1 nginx /bin/sh
第1章 docker存储
1.1 挂载时创建卷
? 进入容器中查看挂载前的数据是否存在
docker run -it nginx bash [email protected]:/usr/share/nginx/html# ls 50x.html index.html [email protected]:/usr/share/nginx/html# tail index.html working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
? 修改挂载首页文件
vim /tmp/index.html nihao
? 我这里容器已经运行起来了,所以要关闭一下
docker container stop 1882ab7b9e7e docker run -d -p 80:80 -v /tmp/:/usr/share/nginx/html nginx 2d2367bc9bbfeb7550560c4939d451d28f185992970808361db059aab18a23b7 curl 10.0.0.70 nihao
? 查看卷列表:
docker volume ls DRIVER VOLUME NAME
注意:指明挂载目录,不会对容器中的数据进行改变,
1.2 创建卷后挂载:
? 创建一个名为jiang的卷
[[email protected] ~]# docker volume create jiang jiang
? 查看所有卷:
docker volume ls
? 查看卷路径:
docker volume inspect jiang [ { "CreatedAt": "2018-04-27T14:03:19+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/jiang/_data", "Name": "jiang", "Options": {}, "Scope": "local" } ]
? 指定卷启动一个容器:
docker run -d -p 80:80 -v jiang:/usr/share/nginx/html nginx 968f03aa0b9965a82b86a7e2c17f5e9dcf530838d8ed4dd075845017e75ab74b
? 在宿主机上进行测试,访问首页:
[[email protected] ~]# curl 10.0.0.70 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
? 修改首页文件中的内容
echo hello world >/var/lib/docker/volumes/jiang/_data/index.html
? 再次访问
curl 10.0.0.70 hello world
1.2.1 多个容器共享卷
? 启动容器时,和其他容器共享卷:
docker run -d -P --volumes-from 968f03aa0b99 nginx:latest
? 进行测试:
curl 10.0.0.70:32768 hello world curl 10.0.0.70:80 hello world
第2章 关于docker的一些注意事项
2.1 重启docker服务,容器全部退出的解决办法:
? 在启动时指定自动重启
docker run –restart=always
? 修改docker配置文件
1. 添加一下信息即可
“live-restore”: true
2. docker server配置文件/etc/docker/daemon.json
[[email protected] ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"], "graph": "/opt/mydocker", # 修改数据的存放目录到/opt/mydocker/,原/var/lib/docker/ "insecure-registries": ["10.0.0.100:5000"], "live-restore": true }
? 重启生效,只对再次之后启动的容器生效
systemctl restart docker.service
2.2 使用容器的建议:
1. 不要拆分方式进行应用程序发布
2. 不要创建大型镜像
3. 不要在单个容器中运行多个进程
4. 不要再镜像内保存凭证,不要依赖IP地址
5. 以非root用户运行程序
6. 不要使用最新标签
7. 不要利用运行中的容器创建镜像
8. 不要使用单层镜像
9. 不要将数据存放在容器内
2.3 关于docker容器的监控
? 容器的基本信息
包括容器的数量,ID;名称;镜像;启动命令;端口信息
? 容器的运行状态
统计各状态的容器的数量,包括运行中,暂停,停止及异常退出
? 容器的用量信息
统计容器的cpu使用率,内存使用量,块设备IO使用量,网络使用情况等资源使用情况
以上是关于Docker网络与存储的主要内容,如果未能解决你的问题,请参考以下文章
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段