容器數據持久化及容器互聯
- 一、Docker容器的數據管理
- 1.1、什么是數據卷
- 1.2、數據卷特點
- 1.3、數據卷使用
- 二、Docker的數據卷容器
- 2.1、什么是數據卷容器
- 2.2、掛載數據卷容器方法
- 三、Docker數據卷的備份和還原
- 3.1、數據備份方法
- 3.2、數據還原方法
- 四、Docker容器互聯
- 4.1、docker 容器的網絡基礎
- 4.2、docker 容器的互聯
- 五、Docker容器的網絡模式
- 5.1、None模式
- 5.2、Container模式
- 5.3、Bridge模式
- 5.4、Host模式
一、Docker容器的數據管理
1.1、什么是數據卷
- 數據卷是經過特殊設計的目錄,可以繞過聯合文件系統(UFS),為一個或者多個容器提供訪問,數據卷設計的目的,在于數據的永久存儲,它完全獨立于容器的生存周期。
- 因此,docker不會在容器刪除時刪除其掛載的數據卷,也不會存在類似的垃圾收集機制,對容器引用的數據卷進行處理,同一個數據卷可以只支持多個容器的訪問。
1.2、數據卷特點
- 數據卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數據,這些數據會被拷貝到新初始化的數據卷中
- 數據卷可以在容器之間共享和重用
- 可以對數據卷里的內容直接進行修改
- 數據卷的變化不會影像鏡像的更新
- 卷會一直存在,即使掛載數據卷的容器已經被刪除
1.3、數據卷使用
【1】為容器添加數據卷
docker run -v 宿主機目錄:/容器目錄 -it centos /bin/bash # 目錄沒有會自動創建
# Eg:
docker run -v /datavolume:/data -it centos /bin/bash
docker run --name volume1 -v ~/datavolume1:/data:ro -itd centos /bin/bash
# 添加只讀權限之后在docker容器的/data目錄下就不能在創建文件了,為只讀權限;在宿主機下的/datavolume1下可以創建東西
【2】使用dockerfile構建包含數據卷的鏡像
# dockerfile指令:volume[“/data”]cat dockerfile
FROM centos
VOLUME ["/datavolume3","/datavolume6"]
CMD /bin/bash# 使用如下構建鏡像
docker build -t="volume" .# 啟動容器
docker run --name volume-dubble -it volume
# 會看到這個容器下有兩個目錄,/datavolume3和/datavolume6
二、Docker的數據卷容器
2.1、什么是數據卷容器
命名的容器掛載數據卷,其他容器通過掛載這個容器實現數據共享,掛載數據卷的容器,就叫做數據卷容器
2.2、掛載數據卷容器方法
docker run --volumes-from [container name]
# 舉例:
# 1、運行容器(volume這個鏡像是上面創建的帶兩個數據卷/datavolume3和/ddatavolume6的鏡像)
docker run --name data-volume -itd volume
# 2、進入容器,創建文件后退出容器
docker exec -it data-volume /bin/bash #(進入到容器中)
touch /datavolume6/lucky.txt
# 3、創建一個新容器掛載剛才data-volume這個容器創建的數據卷
docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
# 4、進入到新創建的容器
docker exec -it data-volume2 /bin/bash
# 5、查看容器的/datavolume6目錄下是否新創建了lucky.txt文件
cd /datavolume6
三、Docker數據卷的備份和還原
3.1、數據備份方法
docker run --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]
舉例:
docker run --volumes-from data-volume2 \
-v /root/backup:/backup \
--name datavolume-copy centos \
tar zcvf /backup/data-volume2.tar.gz /datavolume6
# 將容器中的/datavolume6 備份到/backup下,命名為data-volume2.tar.gz
3.2、數據還原方法
docker run --volumes-from [container name] -v $(pwd):/backup centos tar xzvf /backup/backup.tar.gz [container data volume]
舉例:
# 進入容器,刪除文件
docker exec -it data-volume2 /bin/bash
cd /datavolume6
rm -rf lucky.txt
# 創建容器,將之前備份的文件拷貝解壓到/datavolume6
docker run --volumes-from data-volume2 \
-v /root/backup/:/backup \
centos tar zxvf /backup/data-volume2.tar.gz -C /datavolume6
# 可以看到還原后的數據
docker exec -it data-volum2 /bin/bash
cd /datavolum6
四、Docker容器互聯
4.1、docker 容器的網絡基礎
1】、docker0:
安裝docker的時候,會生成一個docker0的虛擬網橋
2】、Linux虛擬網橋的特點:
可以設置ip地址
相當于擁有一個隱藏的虛擬網卡
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:28:ae:c0:42 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
inet6 fe80::42:28ff:feae:c042/64 scope link
每運行一個docker容器都會生成一個veth設備對,這個veth一個接口在容器里,一個接口在物理機上。
3】、安裝網橋管理工具:
yum install bridge-utils -y
brctl show
可以查看到有一個docker0的網橋設備,下面有很多接口,每個接口都表示一個啟動的docker容器,因為我在docker上啟動了很多容器,所以interfaces較多,如下所示:
4.2、docker 容器的互聯
下面用到的鏡像的dockerfile文件如下:
cd dockerfile/inter-image
vim dockerfile
FROM centos
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD /bin/bash[root@xianchaomaster1]# docker build -t="inter-image" .
允許所有容器間互聯(也就是訪問)
第一種方法:
#(1)基于上面的inter-image鏡像啟動第一個容器test1
docker run --name test1 -itd inter-image
#進入到容器里面啟動nginx:
/usr/sbin/ngnx#(2)基于上面的inter-image鏡像啟動第二個容器test2
docker run --name test2 -itd inter-image#(3)進入到test1容器和test2容器,可以看兩個容器的ip,分別是172.17.0.20和172.17.0.21
docker exec -it test2 /bin/bash
ping 172.17.0.20 # 可以看見能ping同test1容器的ipcurl http://172.17.0.20 # 可以訪問到test1容器的內容
上述方法假如test1容器重啟,那么在啟動就會重新分配ip地址,所以為了使ip地址變了也可以訪問可以采用下面的方法
第二種方法: docker link設置網絡別名
可以給容器起一個代號,這樣可以直接以代號訪問,避免了容器重啟ip變化帶來的問題
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]
# 1.啟動一個test3容器
docker run --name test3 -itd inter-image /bin/bash# 2.啟動一個test5容器,--link做鏈接,那么當我們重新啟動test3容器時,就算ip變了,也沒關系,我們可以在test5上ping別名webtest
docker run --name test5 -itd --link=test3:webtest inter-image /bin/bash# 3.test3和test5的ip分別是172.17.0.22和172.17.0.24# 4.重啟test3容器
docker restart test3 # 發現ip變成了172.17.0.25# 5.進入到test5容器
docker exec -it test5 /bin/bashping test3容器的ip別名webtest可以ping通,盡管test3容器的ip變了也可以通
五、Docker容器的網絡模式
docker run創建Docker容器時,可以用–net選項指定容器的網絡模式,Docker有以下4種網絡模式:
? bridge模式:使–net =bridge指定,默認設置;
? host模式:使–net =host指定;
? none模式:使–net =none指定;
? container模式:使用–net =container:NAME orID指定。
5.1、None模式
Docker網絡none模式是指創建的容器沒有網絡地址,只有lo網卡。
--privileged=true
開啟容器特權模式
[root@xianchaomaster1 ~]# docker run -itd --name none --net=none --privileged=true centos
[root@xianchaomaster1 ~]# docker exec -it none /bin/bash
[root@05dbf3f2daaf /]# ip addr
# 只有本地lo地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever# 可以自己分配ip,而不是動態分配ip
5.2、Container模式
Docker網絡container模式是指,創建新容器的時候,通過–net container參數,指定其和已經存在的某個容器共享一個 Network Namespace。如下圖所示,右方黃色新創建的container,其網卡共享左邊容器。因此就不會擁有自己獨立的 IP,而是共享左邊容器的 IP 172.17.0.2,端口范圍等網絡資源,兩個容器的進程通過 lo 網卡設備通信。
#和已經存在的none容器共享網絡
[root@xianchaomaster1 ~]# docker run --name container2 --net=container:none -it --privileged=true centos[root@05dbf3f2daaf /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
5.3、Bridge模式
默認選擇bridge的情況下,容器啟動后會通過DHCP獲取一個地址
#創建橋接網絡
[root@xianchaomaster1~]# docker run --name bridge -it --privileged=true centos bash[root@a131580fb605 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
64: eth0@if65: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.13/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
5.4、Host模式
Docker網絡host模式是指共享宿主機的網絡
#共享宿主機網絡
[root@xianchaomaster1~]# docker run --name host -it --net=host --privileged=true centos bash