Linux学习总结(七十)docker-2
一 docer 數據管理
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 容器的數據卷
3 定義數據卷容器
有時候,我們需要多個容器之間相互共享數據,類似于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/backup
docker 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/init
docker 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 配置如下:
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/24@192.168.56.2 #200為容器的ip,@后面的ip為網關ip docker exec -it lv bash #進去后ifconfig查看就可以看到新添加的ip備注:其中@前的ip為橋接網卡ip的子網ip,不要和br0相同,@后為網關,填寫br0的網關。
轉載于:https://blog.51cto.com/12606610/2147696
總結
以上是生活随笔為你收集整理的Linux学习总结(七十)docker-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript系列-class10
- 下一篇: 毕业5年,我是怎么成为年薪30W的运维工