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選項後面能夠直接跟容器裏的目錄,也能夠加上宿主機的目錄,兩者用冒號分割,宿主機目錄在前,意思是將宿主機目錄掛載到容器裏。html
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/。linux
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網絡模式。同一個宿主機上的全部容器會在同一個網段下,相互之間是能夠通訊的。nginx
首先使用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
git
爲了使本地網絡中的機器和Docker容器更方便的通訊,咱們常常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,咱們只要將Docker容器和宿主機的網卡橋接起來,再給Docker容器配上IP就能夠了。github
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 配置以下:docker
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 配置以下:centos
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
安裝pipworkbash
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的網關。網絡