Linux學習總結(七十)docker-2
1 掛載本地的目錄到容器裏docker run -tid -v /data/:/data centos bash
//-v 用來指定掛載目錄,:前面的/data/為宿主機本地目錄,:後面的/data/為容器裏的目錄,會在容器中自動創建
2 掛載數據卷
其實我們掛載目錄的時候,可以指定容器name,如果不指定就隨機定義了。比如上面我們沒有指定,它就生成了一個名字為relaxed_franklin,這個名字可以使用命令 docker ps 看最右側一列docker run -itd --volumes-from relaxed_franklin lv bash
這樣,我們使用aming123鏡像創建了新的容器,並且使用了 relaxed_franklin 容器的數據卷
有時候,我們需要多個容器之間相互共享數據,類似於linux裏面的NFS,所以就可以搭建一個專門的數據卷容器,然後其他容器直接掛載該數據卷。
1)首先建立數據卷容器
docker run -itd -v /data/ --name testvol centos bash
//註意這裏的/data/是容器的/data目錄,並非本地的/data/目錄。 2)然後讓其他容器掛載該數據卷
docker run -itd --volumes-from testvol lv bash
備註:
以上操作的實質就是,我們在啟動容器時,-v選項指定了該容器可以作為一個數據卷容器,後面跟的是共享目錄。類似nfs的共享目錄。--volumes-from 定義了該容器的掛載目標,即數據卷容器。-v選項後面可以直接跟容器裏的目錄,也可以加上宿主機的目錄,二者用冒號分割,宿主機目錄在前,意思是將宿主機目錄掛載到容器裏。
二 Docker數據卷的備份與恢復
1 備份
mkdir /data/backupdocker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/
說明:首先我們需要使用testvol數據卷新開一個容器,同時我們還需要把本地的/data/backup/目錄掛載到該容器的/backup下,這樣在容器中/backup目錄裏面新建的文件,我們就可以直接在/data/backup/目錄中看到了。 然後再把/data/目錄下面的文件打包到成data.tar文件放到/backup目錄下面。
2 恢復
思路: 先新建一個數據卷容器,再建一個新的容器並掛載該數據卷容器,然後再把tar包解包。
docker run -itd -v /data/ --name testvol2 centos bash
掛載數據卷新建容器,並解包:
docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar
備註:
上面的內容比較繞,我們備份的對象應該是數據卷容器,就像我們備份nfs服務器一樣。之所以我們要引入一個新容器來備份,是因為我們在創建數據卷容器時沒有掛載宿主機目錄,而且對於已存在的容器沒有辦法追加該掛載。所以才會出現如此曲折的辦法。我們創建的該新容器/data/ 目錄掛載了數據卷容器的/data/目錄,/backup/ 掛載了宿主機/data/backup/目錄,那麽只要在新容器裏,將/data/目錄備份到/backup/目錄,就實現了將數據卷容器的數據備份到宿主機磁盤的目的。恢復就是剛才的逆過程,當然如果原來數據卷容器還存在的話,就沒有必要再創建新的數據卷容器。我們新建的容器同時使用了-volumes 和-v選項,它既作為一個普通容器(相對數據卷容器來說)指定了數據卷容器這個掛載對象。數據容器的共享目錄/data/掛載到了它的/data/目錄。又充當了數據卷容器,將宿主機的目錄/data/backup/掛載到了自己的共享目錄/backup/。備份時,我們指定了目標目錄為/backup/,解壓時為什麽沒有指定呢,是因為容器bash進去就是在根目錄下。所以就直接解壓當了當前目錄,正好對應為/data/。
三 docker 網絡模式
host模式,使用docker run時使用--net=host指定
docker使用的網絡實際上和宿主機一樣,在容器內看到的網卡ip是宿主機ip
container模式,使用--net=container:container_id/container_name
多個容器使用共同的網絡,看到的ip是一樣的
none模式,使用--net=none指定
這種模式下,不會配置任何網絡
bridge模式,使用--net=bridge指定默認模式,不用指定默認就是這種網絡模式。這種模式會為每個容器分配一個獨立的Network Namespace。類似於vmware的nat網絡模式。同一個宿主機上的所有容器會在同一個網段下,相互之間是可以通信的。
四 docker 網絡管理,外部訪問容器
首先使用centos鏡像新建一個容器,然後在該容器中安裝httpd服務,並啟動
再把該容器導成一個新的鏡像(centos-httpd),然後再使用新鏡像創建容器,並指定端口映射docker run -itd -p 5123:80 centos-httpd bash
//-p 可以指定端口映射,本例中將容器的80端口映射為本地的5123端口docker exec -it container_id bash
啟動httpd: httpd -k start
編輯1.html: vi /var/www/html/1.html 隨便寫點東西
退出該容器:exit
測試: curl 127.0.0.1:5123/1.html
-p後面也支持IP:port:ip:port 的格式,比如
-p 127.0.0.1:8080:80
也可以不寫本地的端口,只寫ip,這樣會隨意分配一個端口
-p 127.0.0.1::80 //註意這裏是兩個冒號
新建的容器,啟動nginx或者httpd服務的時候會報錯
Failed to get D-Bus connection: Operation not permitted
這是因為dbus-daemon沒有啟動,解決該問題可以這樣做
啟動容器時,要加上--privileged -e "container=docker" ,並且最後面的命令改為/usr/sbin/initdocker run -itd -p 5123:80 --privileged -e "container=docker" imagename /usr/sbin/init
五 Docker網絡管理-配置橋接網絡
為了使本地網絡中的機器和Docker容器更方便的通信,我們經常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,我們只要將Docker容器和宿主機的網卡橋接起來,再給Docker容器配上IP就可以了。
cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0
vi ifcfg-eth0 //增加BRIDGE=br0,刪除IPADDR,NETMASK,GATEWAY,DNS1
vi ifcfg-br0//修改DEVICE為br0,Type為Bridge,把eth0的網絡設置設置到這裏來
systemctl restart network
至此,生成br0網卡,原來的eh0 網卡未分配ip 為正常狀態。然後去ping 外網,調通為止。
如果有問題,繼續編輯ifcfg-eth0 ,考慮是不是uuid ,mac 地址沖突。
ifcfg-br0 配置如下:
DEVICE=br0
HWADDR=00:0c:29:9b:78:e8
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.56.132
NETMASK=255.255.255.0
GATEWAY=192.168.56.2
DNS1=119.29.29.29
ifcfg-eth0 配置如下:
DEVICE=eth0
BRIDGE=br0
#HWADDR=00:0c:29:9b:78:e8
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
#IPADDR=192.168.56.132
#NETMASK=255.255.255.0
#GATEWAY=192.168.56.2
#DNS1=119.29.29.29
安裝pipwork
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/
開啟一個容器
docker run -itd --net=none --name lv centos bash
pipework br0 lv 192.168.56.200/[email protected] #200為容器的ip,@後面的ip為網關ip
docker exec -it lv bash #進去後ifconfig查看就可以看到新添加的ip
備註:其中@前的ip為橋接網卡ip的子網ip,不要和br0相同,@後為網關,填寫br0的網關。
Linux學習總結(七十)docker-2