日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker数据卷备份恢复以及配置桥接网络

發布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker数据卷备份恢复以及配置桥接网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

25.9 數據卷備份恢復

備份:

如果數據卷容器的共享目錄已經掛載到了本地宿主機的磁盤上,那么就無需進行數據卷備份。沒有進行掛載到本地,而是作為共享目錄的數據卷容器,就得定期將數據卷進行一個備份,不然如果數據卷被刪除的話,數據也會丟失。

假設數據卷容器共享的目錄是data,由于是作為一個共享目錄的數據卷容器,那么就會與普通容器進行目錄的關聯。這樣我們可以在本地磁盤上創建一個backup目錄,在新建容器的時候,把容器的backup目錄映射到本地宿主機的backup目錄上,之后需要備份data目錄的數據時,只需要把data目錄打包到backup目錄下即可,這樣就會寫入到本地磁盤的backup中。

示意圖:

實現如下:

1.在本地磁盤上創建一個backup目錄:

mkdir /data/backup

2.新建容器,把容器的backup目錄映射到本地宿主機的backup目錄上,并將data目錄打包到backup目錄下:

docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/

說明:首先我們需要使用testvol數據卷新開一個容器,同時我們還需要把本地的/backup/目錄掛載到該容器的/backup下,這樣在容器中/backup目錄里面新建的文件,我們就可以直接在/data/backup/目錄中看到了。 然后再把/data/目錄下面的文件打包到成data.tar文件放到/backup目錄下面,這樣就實現了一個簡單的備份。

恢復:

恢復則是反其道而行之,先新建一個數據卷容器,再新建一個新的容器并掛載該數據卷容器,然后再把打包的tar包解包。

1.新建數據卷容器:

docker run -itd -v /data/ --name testvol2 centos bash

2.掛載數據卷新建容器,并解包:

docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar

25.10 docker網絡模式

我們平時使用的VMware、VirtualBox等虛擬機軟件,都有不同的網絡模式,例如:NAT模式、橋接模式、僅主機模式等。而docker也是一種虛擬技術,所以自然也有不同的網絡模式,docker有四種網絡模式。

host模式,使用docker run時使用 --net=host 指定。docker使用的網絡實際上和宿主機一樣,在容器內看到的網卡ip是宿主機ip。

container模式,使用 --net=container:container_id/container_name 來指定。多個容器使用共同的網絡,看到的ip是一樣的。例如容器A和容器B使用共同的網絡,那么它們兩個看到的ip就是一樣的。

none模式,使用 --net=none 指定,這種模式下,不會配置任何網絡。

bridge模式,使用 --net=bridge 指定默認模式,不用指定默認就是這種網絡模式。這種模式會為每個容器分配一個獨立的Network Namespace。類似于vmware的nat網絡模式。同一個宿主機上的所有容器會在同一個網段下,相互之間是可以通信的。


外部訪問容器:

以上簡單介紹了幾種docker的網絡模式,我們也知道docker模式使用的是bridge模式,可以與宿主機以及該宿主機上的其他容器進行通信。但是,如果想要在宿主機外部訪問該容器,則是無法訪問的。

解決這個問題的方法,就是我們可以將容器端口映射到宿主機上,那么訪問宿主機的端口即可,下面我們來用一個小例子進行一個簡單的演示:

1.進入到一個運行中的容器,或者從現有的鏡像新建一個容器,進入容器后安裝nginx,安裝完后退出容器:

[root@server ~]# docker exec -it f7774d bash [root@f7774d6447ca /]# yum -y install epel-release [root@f7774d6447ca /]# yum -y install nginx [root@f7774d6447ca /]# exit

2.然后把該容器導成一個新的鏡像,接著再使用新鏡像創建容器,并指定端口映射:

[root@server ~]# docker commit -m "install nginx" -a "author" f7774d centos_with_nginx # 導出為鏡像 sha256:1c56209c7a2775755af07e6b8f6005aed2936e7922f381ee648582e696196901 [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_with_nginx latest 1c56209c7a27 18 seconds ago 389MB [root@server ~]# docker run -itd -p 8088:80 centos_with_nginx bash # 創建容器時指定端口映射 6289ec878420dcd27218334fb7933216e8a04c2eff839ae699ae75e7c7625957 [root@server ~]#

-p 可以指定端口映射,本例中將容器的80端口映射為本地的8088端口。


25.11 opration not permitted錯誤

以上我們已經完成了nginx的安裝以及導出鏡像,并且也創建好了容器。但是新建的容器,如果啟動nginx或者httpd這類服務的時候會報如下錯誤:

Failed to get D-Bus connection: Operation not permitted

例如,我進入到剛剛創建的容器下啟動nginx服務:

[root@server ~]# docker exec -it 6289ec8 bash [root@6289ec878420 /]# systemctl start nginx Failed to get D-Bus connection: Operation not permitted [root@6289ec878420 /]# exit

如上,可以看到報錯了。

這是因為dbus-daemon沒有啟動,解決該問題的方法如下:

啟動容器時,要加上--privileged -e "container=docker" ,并且最后面的命令改為/usr/sbin/init

例如,我們刪除之前的容器,重新創建:

[root@server ~]# docker rm -f 6289ec8 # 刪除之前的容器 6289ec8 [root@server ~]# docker run -itd --privileged -e "container=docker" -p 8088:80 centos_with_nginx /usr/sbin/init 5814019a5395d165cbf77e1921936698b78a6d62abd94e7b4aa6d718ebecebee [root@server ~]# [root@server ~]# docker exec -it 5814019 bash [root@dea214b5c1c5 /]# systemctl start nginx # 這時啟動nginx就沒有報錯了 [root@dea214b5c1c5 /]# ps aux |grep nginx root 93 0.0 0.1 122928 2252 ? Ss 18:33 0:00 nginx: master process /usr/sbin/nginx nginx 94 0.0 0.1 123392 3136 ? S 18:33 0:00 nginx: worker process nginx 95 0.0 0.1 123392 3136 ? S 18:33 0:00 nginx: worker process nginx 96 0.0 0.1 123392 3140 ? S 18:33 0:00 nginx: worker process nginx 97 0.0 0.1 123392 3140 ? S 18:33 0:00 nginx: worker process root 99 0.0 0.0 9048 664 pts/1 S+ 18:33 0:00 grep --color=auto nginx [root@dea214b5c1c5 /]# netstat -lntp |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 93/nginx: master pr tcp6 0 0 :::80 :::* LISTEN 93/nginx: master pr [root@dea214b5c1c5 /]# curl localhost

如上,可以看到,容器里的nginx已經啟動了,并且也映射了本地宿主機的8088端口,那么我們來從瀏覽器上訪問宿主機的8088端口,看看是否能訪問到這個nginx服務:

沒問題,從瀏覽器上訪問成功。以上我們就解決了外部網絡訪問容器服務以及在容器內啟動nginx服務報opration not permitted錯誤的問題。


25.12 配置橋接網絡

為了使本地網絡中的機器和Docker容器更方便的通信,我們經常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,我們只要將Docker容器和宿主機的網卡橋接起來,也就是需要配置一個橋接網絡,然后再給Docker容器配上IP就可以了,實現步驟如下:

1.首先在宿主機上進入到網卡配置文件的目錄下,并拷貝網卡配置文件:

[root@server ~]# cd /etc/sysconfig/network-scripts/ [root@server /etc/sysconfig/network-scripts]# cp ifcfg-eno16777728 ifcfg-br0

2.然后編輯網卡配置文件:

[root@server /etc/sysconfig/network-scripts]# vim ifcfg-br0 TYPE=Bridge # 將Ethernet修改為Bridge,并將以下幾個字段的值修改為br0 NAME=br0 DEVICE=br0

3.編輯宿主機的網卡配置文件,并重啟網卡:

[root@server /etc/sysconfig/network-scripts]# vim ifcfg-eno16777728 # 將 UUID、DNS1、DNS2、IPADDR、PREFIX、GATEWAY 等字段都注釋掉 BRIDGE=br0 # 然后在文件末尾加上這一句 [root@server /etc/sysconfig/network-scripts]# systemctl restart network

4.重啟網卡成功后,使用ifconfig查看網卡信息如下:

[root@server ~]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.77.130 netmask 255.255.255.0 broadcast 192.168.77.255inet6 fe80::20c:29ff:fef1:912c prefixlen 64 scopeid 0x20<link>ether 00:0c:29:f1:91:2c txqueuelen 0 (Ethernet)RX packets 661 bytes 111914 (109.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 177 bytes 26544 (25.9 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500ether 00:0c:29:f1:91:2c txqueuelen 1000 (Ethernet)RX packets 833 bytes 173138 (169.0 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 179 bytes 29840 (29.1 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 0 (Local Loopback)RX packets 5241 bytes 2612196 (2.4 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 5241 bytes 2612196 (2.4 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@server ~]#

如上,可以看到,br0已經被識別了,并且將原本是eno16777728網卡的ip分給了br0網卡,而且正常的情況下eno16777728是沒有ip的。

5.安裝pipwork工具:

[root@server ~]# git clone https://github.com/jpetazzo/pipework [root@server ~]# cd pipework/ [root@server ~/pipework]# ls docker-compose.yml doctoc LICENSE pipework pipework.spec README.md [root@server ~/pipework]# cp pipework /usr/local/bin/

6.開啟一個容器,并進入到該容器中:

[root@server ~]# docker run -itd --net=none --name test_bridge_centos centos_with_nginx bash 9724781ac393a3c3caf0b92145aa442aac0009249dbf21619a9a40c4008ff6ab [root@server ~]# docker exec -it 9724781 bash [root@9724781ac393 /]# ifconfig # 可以看到該容器中只有一個本地網卡 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 0 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@9724781ac393 /]# exit

7.使用pipework工具給這個容器分配ip:

# 192.168.77.125為容器的ip,@后面的ip為虛擬機的網關ip [root@server ~]# pipework br0 test_bridge_centos 192.168.77.125/24@192.168.77.2 [root@server ~]# docker exec -it 9724781 bash [root@9724781ac393 /]# ifconfig eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.77.125 netmask 255.255.255.0 broadcast 192.168.77.255ether 5a:f0:c6:49:d4:27 txqueuelen 1000 (Ethernet)RX packets 36 bytes 7473 (7.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 1 bytes 42 (42.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 0 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@9724781ac393 /]# ping www.baidu.com # 測試能否ping通外網 PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data. 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=128 time=13.9 ms 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=128 time=10.2 ms 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=128 time=10.3 ms 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=128 time=10.2 ms ^C --- www.a.shifen.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 10.267/11.192/13.921/1.580 ms [root@9724781ac393 /]# exit

如上,可以看到該容器已經被成功分配了我們指定的ip,并且也能正常ping通外網。

接著就是測試在外部能否ping通這個容器的ip,打開windows的cmd,執行以下命令:

C:\Users\zero>ping 192.168.77.125正在 Ping 192.168.77.125 具有 32 字節的數據: 來自 192.168.77.125 的回復: 字節=32 時間<1ms TTL=64 來自 192.168.77.125 的回復: 字節=32 時間<1ms TTL=64 來自 192.168.77.125 的回復: 字節=32 時間<1ms TTL=64 來自 192.168.77.125 的回復: 字節=32 時間<1ms TTL=64192.168.77.125 的 Ping 統計信息:數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒為單位):最短 = 0ms,最長 = 0ms,平均 = 0msC:\Users\zero>

輸出結果如上,可以正常ping通。

小結:以上我們通過第三方的pipework工具實現了容器網絡與宿主機網絡的橋接,這種方式配置起來雖然稍微有些麻煩,但是方便于本地網絡中的機器和Docker容器的通信。而docker自帶的bridge模式,雖然在字面上是橋接,但是實際上更類似于nat模式,或者說就是nat模式,所以我們才需要使用pipework來實現橋接。




本文轉自 ZeroOne01 51CTO博客,原文鏈接:http://blog.51cto.com/zero01/2069594,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的docker数据卷备份恢复以及配置桥接网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。