1. 程式人生 > >Docker網絡與存儲

Docker網絡與存儲

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: 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網絡與存儲