做爲一個寄宿在宿主主機上的容器,咱們要想辦法讓外部網絡可以訪問到它,這樣纔可以使用其提供的服務。當docker啓動時,它會在宿主主機上建立一個名爲docker0的虛擬網絡接口。linux下能夠經過:ifconfig命令查看,windods下使用ipconfig查看。html
1.1 暴露網絡端口python
Docker中運行網絡應時,要讓外部能訪問這裏須要經過-P或-p參數來指定端口映射。經過端口映射來實現端口暴露是容器對外提供服務的基礎方法。mysql
-P(大寫):Docker會在宿主主機上隨機爲應用分配一個49000~49900內的未被使用的端口,並將其映射到容器開放的網絡端口(即經過EXPOSE配置的端口)。linux
這裏以官方的一個培訓項目示例:git
docker run -d -P training/webapp python app.py 使用下面的命令能夠查看到運行分配的端口號。 docker ps
上面的32768就是隨機分配的端口,每次運行時分配的可能都不同,5000是容器暴露出來的端口。這樣經過http://localhost:32768 就能訪問服務了。web
-p(小寫):它能夠指定宿主主機上的端口映射到容器內部指定的開放端口,格式有以下3種:sql
ip:hostPort:containerPort //指定ip和端口與容器開放的端口綁定docker
docker run -d -p 192.168.0.1:8000:5000 training/webapp python app.py
ip::containerPort //指定ip的隨機端口與容器開放的端口綁定數據庫
docker run -d -p 192.168.0.1::5000 training/webapp python app.py //至關於省略了端口號全部兩個冒號連在一塊兒了
hostPort:containerPort //宿主主機上全部的網絡接口的指定的端口都會綁定(好比你可使用localhost、局域網ip、主機名等加端口訪問服務)。ubuntu
docker run -d -p 8000:5000 training/webapp python app.py
容器的全部配置信息能夠經過下面的命令查看:
docker inspect 容器ID或名稱
Docker中的數據能夠存儲在相似於虛擬機磁盤的介質中,在Docker中稱爲數據卷(Data Volume)。數據卷能夠用來存儲Docker應用的數據,也能夠用來在Docker容器間進行數據共享。
數據卷呈現給Docker容器的形式就是一個目錄,支持多個容器間共享,修改也不會影響鏡像。使用Docker的數據卷,相似在系統中使用 mount 掛載一個文件系統。
數據卷是一個可供一個或多個容器使用的特殊目錄,使用它能夠達到以下目的。
1)繞過「拷貝寫」系統,以達到本地磁盤IO的性能,(好比運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,因此是本地磁盤IO的性能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)
2)繞過「拷貝寫」系統,有些文件不須要在docker commit打包進鏡像文件。
3)數據卷能夠在容器間共享和重用數據
4)數據卷能夠在宿主和容器間共享數據(共享單個文件,也能夠是socket)
5)數據卷數據改變是直接修改的
6)數據卷是持續性的,直到沒有容器使用它們。即使是初始的數據卷容器或中間層的數據卷容器刪除了,只要還有其餘的容器使用數據卷,那麼裏面的數據都不會丟失。
2.1 建立、掛載數據卷
有兩種方式建立數據卷,具體以下:
1.在Dockerfile中,使用VOLUMN指令,如:VOLUME /var/lib/mysql
2.在命令行中使用docker run時,使用-v參數建立數據卷並將其掛載到容器中
docker run -d -P -v /webapp /training/webapp python app.pyp
上面只是定義了一個/webapp的數據卷,並無指定宿主機上的目錄,docker會自動分配一個具備惟一名字的目錄給該數據卷。
1)一個數據卷是一個特別指定的目錄,該目錄利用容器的UFS文件系統能夠爲容器提供一些穩定的特性或者數據共享。數據卷能夠在多個容器之間共享。
2)建立數據卷,只要在docker run命令後面跟上-v參數便可建立一個數據卷,固然也能夠跟多個-v參數來建立多個數據卷,當建立好帶有數據卷的容器後,
就能夠在其餘容器中經過--volumes-froms參數來掛載該數據捲了,而無論該容器是否運行。也能夠在Dockerfile中經過VOLUME指令來增長一個或者多個數據卷。
3)若是有一些數據想在多個容器間共享,或者想在一些臨時性的容器中使用該數據,那麼最好的方案就是你建立一個數據卷容器,而後從該臨時性的容器中掛載該數據卷容器的數據。
這樣,即便刪除了剛開始的第一個數據卷容器或者中間層的數據卷容器,只要有其餘容器使用數據卷,數據卷都不會被刪除的。
4)不能使用docker export、save、cp等命令來備份數據卷的內容,由於數據卷是存在於鏡像以外的。備份的方法能夠是建立一個新容器,掛載數據卷容器,同時掛載一個本地目錄,
而後把遠程數據卷容器的數據卷經過備份命令備份到映射的本地目錄裏面。以下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
5)也能夠把一個本地主機的目錄當作數據卷掛載在容器上,一樣是在docker run後面跟-v參數,不過-v後面跟的再也不是單獨的目錄了,它是[host-dir]:[container-dir]:[rw|ro]這樣格式的,
host-dir是一個絕對路徑的地址,若是host-dir不存在,則docker會建立一個新的數據卷,若是host-dir存在,可是指向的是一個不存在的目錄,則docker也會建立該目錄,而後使用該目錄作數據源。docker run -d -P --name webapp -v `pwd`:/webapp training/webapp python app.py //用pwd獲取當前絕對路徑注意事項:若是容器內部已經存在/webapp目錄,那麼掛載宿主目錄以後,它的內容將會被覆蓋。(不過通常不會直接在容器中寫重要的數據,是吧!)
須要注意的是,Dockerfile並不支持掛載本地目錄到數據卷,也就是說不能在Dockerfile文件中使用VOLUME指令掛載本地目錄到數據卷,主要是由於不一樣操做系統 的目錄格式不盡相同。爲了保證Dockerfile的可移植性,因此不支持這種方式,只能經過-v參數的形式掛載。
掛載目錄後面能夠跟上目錄的操做權限,默認是RW權限。使用格式以下:
docker run -d -P -v `pwd`:/webapp:ro training/webapp python app.py docker run -d -P -v `pwd`:/webapp:rw training/webapp python app.py
除了掛載主機目錄外,也能夠掛載主機的文件做爲數據卷:
docker run --rm -it -v d:/test.txt:/test.txt ubuntu:latest /bin/bash //掛載的這個文件必需要存在,不然docker會建立同名的目錄,好比上面的test.txt文件不存在時會建立一個test.txt的目錄。
2.1 數據卷容器
數據卷容器故名思義是指一個專門用於掛載數據卷的容器,以供其餘容器引用和使用。它主要是用在多個容器須要從一處得到數據時。在實際操做時,須要將數據容器命名,有了肯定的容器名以後,對它有依賴關係的其它容器就能夠經過--volumes-from引用它的數據卷。
首先,創建一個數據卷容器,名爲test_dbdata,併爲該容器新建一個數據卷/dbdata。具體操做爲:
docker run -d -v /dbdata --name test_dbdata training/postgres
接着建立一個容器db1,它引用test_dbdata的數據卷,具體操做爲:
docker run -d --volumes-from=test_dbdata --name db1 training/postgres
能夠經過docker inspect test_dbdata/db1 來查看容器掛載信息。
從inspect信息中能夠看到他們的數據卷是同樣的。須要說明的是,數據卷一旦聲明,它的生命週期和聲明它的那個容器就無關了。當聲明它的容器中止了,數據卷依賴存在,除非全部引用它的容器都被刪除了而且顯式地刪除了該數據卷。此外,一個容器引用一個數據卷容器時,並不要求數據卷容器是運行的。一個數據卷容器能夠被多個容器引用。
docker run -d --volumes-from=test_dbdata --name db2 training/postgres
此外,數據卷容器還能夠級聯經引用。例如,新建一個容器db3,它能夠引用db1的數據卷。
docker run -d --volumes-from=db1 --name db3 training/postgres
不管是聲明數據卷的容器仍是後續引用該數據卷的容器,容器的中止和刪除都不會致使數據卷自己刪除。若是須要刪除數據卷,那麼須要刪除全部依賴它的容器,而且在刪除最後一個依賴容器時加入-v標誌。這裏,假如test_dbdata、db一、db2都已經郵件了,那麼刪除db3時加上-v參數就能夠刪除數據卷。
docker rm -v db3
利用數據卷容器,還能夠進行數據的備份和恢復等。
一、備份、恢復
利用數據卷容器,咱們能夠備份一個數據卷容器的數據。
首先,創建一個數據卷容器,相關操做爲:
docker run -d -v /dbdata --name dbdata training/postgress
這樣,數據都保存到了容器的/dbdata目錄,這裏要備份/dbdata目錄到本地,相關操做爲:
docker run --volumes-from dbdata -v ${pwd}:/backup ubuntu tar cvf /backup/backup.tar /dbdata
這裏建立了一個新的數據卷容器,並引用了dbdata數據卷容器,當前目錄掛載到新的數據卷容器/backup目錄,這樣當前目錄就和/backup目錄是同一個目錄了,容器中的數據寫到/backup目錄亦即寫到了宿主機的當前目錄。
恢復的過程其實就是將原來tar cvf打包的數據,使用tar xvf解壓到數據卷。
注意:在windows中若是使用git-bash的命令行來運行命令,pwd獲得的路徑不認,能夠直接寫絕對路徑,格式是:/d/docker_data d表示d盤。就是原來的 d:/ 換成了/d。
很詳細的講解數據卷、及備份恢復的文章:
前面咱們使用了-P或-p來暴露容器端口,以供外界使用該容器。還有另外一種容器對外提供服務的方法——容器鏈接。容器鏈接包含源容器和目標容器:源容器是提供服務的一方,對外提供指定服務;目標容器鏈接到源容器後,就可使用其所提供的服務。容器鏈接依賴於容器名,因此當須要使用容器鏈接時,首先須要命名容器,而後使用--link參數進行鏈接。
鏈接的格式爲:--link name:alias,其中name是源容器的名稱,alias是這個鏈接的別名。下面是一個鏈接的示例:
docker run -d --name dbdata training/postgres 上面的命令先創建了一個數據庫的容器,使用下面的命令鏈接它。 docker run -d -P --name web --link dbdata:db training/webapp python app.py
經過docker inspect web能夠查看到鏈接信息。
經過這種方法,dbdata容器爲web容器提供了服務,但並無使用-P或-p對外暴露端口,這使得源容器dbdata更安全。那web容器是如何使用dbdata的服務呢?
Docker給目標容器提供了以下兩種方式來暴露鏈接提供的服務:
下面分別說明它們。
1 環境變量
當兩個容器鏈接互聯以後,Docker將會在目標容器中設置相關的環境變量,以便在目標容器中使用源容器提供的服務。鏈接環境變量的命令格式爲<alias>_NAME,其中alias是--link參數中的別名。例如web容器鏈接dbdata容器,參數爲--link dbdata:webdb,那麼在容器中則有環境變量WEBDB_NAME=/web/webdb。
通常狀況下,可使用evn命令來查看一個容器的環境變量,相關代碼爲:
docker run --rm --name web --link dbdata:webdb training/webapp env
下面是顯示結果:
2 /etc/hosts文件
查看目標容器的/etc/hosts配置文件,具體操做以下:
docker run -i -t --rm --name web2 --link dbdata:webdb training/webapp /bin/bash
能夠看到,容器鏈接webdb對應的ip地址,該ip地址即爲dbdata容器的地址,容器對webdb鏈接的操做將映射到該地址上。
上面說的容器鏈接都是在同一個宿主主機上的鏈接,要實現跨主機的容器鏈接,目前可使用ambassador模式來實現跨主機鏈接,這種模式叫代理鏈接。
現階段代理的實現方法有多種,下面收集了一些方案(若有最好的方便歡迎留言)
http://blog.csdn.net/shanyongxu/article/details/51398574
http://blog.csdn.net/magerguo/article/details/72123515