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
此模式與
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: eth0@if22: <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
? 查看網絡列表
[root@docker01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 19905a8a8c56 bridge bridge local 62d0c409c7ed host host local 0c03aaefad37 jiang bridge local f63205c97696 none null local
? 自定義網段設置網橋設備
[root@docker01 ~]# docker network create --driver bridge --subnet 192.168.86.0/24 --gateway 192.168.86.1 jiang01 1ed82064325b48a7fee3f0bfeb39e29d00e10334b438d344741a90e300eccce1
? 分配ip進入容器
[root@docker01 ~]# 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: eth0@if26: <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]
在其他機器上進行訪問測試
[root@gitlab ~]# 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 root@800308edcb1a:/usr/share/nginx/html# ls 50x.html index.html root@800308edcb1a:/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的卷
[root@docker01 ~]# 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
? 在宿主機上進行測試,訪問首頁:
[root@docker01 ~]# 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
[root@docker02 ~]# 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網絡與存儲