本篇內(nèi)容介紹了“Docker怎么連接網(wǎng)絡(luò)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
從事中國(guó)電信成都樞紐中心,服務(wù)器租用,云主機(jī),網(wǎng)頁(yè)空間,國(guó)際域名空間,CDN,網(wǎng)絡(luò)代維等服務(wù)。
作為一個(gè)寄宿在宿主主機(jī)上的容器,我們要想辦法讓外部網(wǎng)絡(luò)能夠訪問(wèn)到它,這樣才能夠使用其提供的服務(wù)。當(dāng)docker啟動(dòng)時(shí),它會(huì)在宿主主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)絡(luò)接口。linux下可以通過(guò):ifconfig命令查看,windods下使用ipconfig查看。
1.1 暴露網(wǎng)絡(luò)端口
Docker中運(yùn)行網(wǎng)絡(luò)應(yīng)時(shí),要讓外部能訪問(wèn)這里需要通過(guò)-P或-p參數(shù)來(lái)指定端口映射。通過(guò)端口映射來(lái)實(shí)現(xiàn)端口暴露是容器對(duì)外提供服務(wù)的基礎(chǔ)方法。
-P(大寫):Docker會(huì)在宿主主機(jī)上隨機(jī)為應(yīng)用分配一個(gè)49000~49900內(nèi)的未被使用的端口,并將其映射到容器開(kāi)放的網(wǎng)絡(luò)端口(即通過(guò)EXPOSE配置的端口)。
這里以官方的一個(gè)培訓(xùn)項(xiàng)目示例:
docker run -d -P training/webapp python app.py 使用下面的命令可以查看到運(yùn)行分配的端口號(hào)。 docker ps
上面的32768就是隨機(jī)分配的端口,每次運(yùn)行時(shí)分配的可能都不一樣,5000是容器暴露出來(lái)的端口。這樣通過(guò)http://localhost:32768 就能訪問(wèn)服務(wù)了。
-p(小寫):它可以指定宿主主機(jī)上的端口映射到容器內(nèi)部指定的開(kāi)放端口,格式有如下3種:
ip:hostPort:containerPort //指定ip和端口與容器開(kāi)放的端口綁定
docker run -d -p 192.168.0.1:8000:5000 training/webapp python app.py
ip::containerPort //指定ip的隨機(jī)端口與容器開(kāi)放的端口綁定
docker run -d -p 192.168.0.1::5000 training/webapp python app.py //相當(dāng)于省略了端口號(hào)所有兩個(gè)冒號(hào)連在一起了
hostPort:containerPort //宿主主機(jī)上所有的網(wǎng)絡(luò)接口的指定的端口都會(huì)綁定(比如你可以使用localhost、局域網(wǎng)ip、主機(jī)名等加端口訪問(wèn)服務(wù))。
docker run -d -p 8000:5000 training/webapp python app.py
容器的所有配置信息可以通過(guò)下面的命令查看:
docker inspect 容器ID或名稱
Docker中的數(shù)據(jù)可以存儲(chǔ)在類似于虛擬機(jī)磁盤的介質(zhì)中,在Docker中稱為數(shù)據(jù)卷(Data Volume)。數(shù)據(jù)卷可以用來(lái)存儲(chǔ)Docker應(yīng)用的數(shù)據(jù),也可以用來(lái)在Docker容器間進(jìn)行數(shù)據(jù)共享。
數(shù)據(jù)卷呈現(xiàn)給Docker容器的形式就是一個(gè)目錄,支持多個(gè)容器間共享,修改也不會(huì)影響鏡像。使用Docker的數(shù)據(jù)卷,類似在系統(tǒng)中使用 mount 掛載一個(gè)文件系統(tǒng)。
數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,使用它可以達(dá)到如下目的。
1)繞過(guò)“拷貝寫”系統(tǒng),以達(dá)到本地磁盤IO的性能,(比如運(yùn)行一個(gè)容器,在容器中對(duì)數(shù)據(jù)卷修改內(nèi)容,會(huì)直接改變宿主機(jī)上的數(shù)據(jù)卷中的內(nèi)容,所以是本地磁盤IO的性能,而不是先在容器中寫一份,最后還要將容器中的修改的內(nèi)容拷貝出來(lái)進(jìn)行同步。)
2)繞過(guò)“拷貝寫”系統(tǒng),有些文件不需要在docker commit打包進(jìn)鏡像文件。
3)數(shù)據(jù)卷可以在容器間共享和重用數(shù)據(jù)
4)數(shù)據(jù)卷可以在宿主和容器間共享數(shù)據(jù)(共享單個(gè)文件,也可以是socket)
5)數(shù)據(jù)卷數(shù)據(jù)改變是直接修改的
6)數(shù)據(jù)卷是持續(xù)性的,直到?jīng)]有容器使用它們。即便是初始的數(shù)據(jù)卷容器或中間層的數(shù)據(jù)卷容器刪除了,只要還有其他的容器使用數(shù)據(jù)卷,那么里面的數(shù)據(jù)都不會(huì)丟失。
2.1 創(chuàng)建、掛載數(shù)據(jù)卷
有兩種方式創(chuàng)建數(shù)據(jù)卷,具體如下:
1.在Dockerfile中,使用VOLUMN指令,如:VOLUME /var/lib/MySQL
2.在命令行中使用docker run時(shí),使用-v參數(shù)創(chuàng)建數(shù)據(jù)卷并將其掛載到容器中
docker run -d -P -v /webapp /training/webapp python app.pyp
上面只是定義了一個(gè)/webapp的數(shù)據(jù)卷,并沒(méi)有指定宿主機(jī)上的目錄,docker會(huì)自動(dòng)分配一個(gè)具有唯一名字的目錄給該數(shù)據(jù)卷。
1)一個(gè)數(shù)據(jù)卷是一個(gè)特別指定的目錄,該目錄利用容器的UFS文件系統(tǒng)可以為容器提供一些穩(wěn)定的特性或者數(shù)據(jù)共享。數(shù)據(jù)卷可以在多個(gè)容器之間共享。
2)創(chuàng)建數(shù)據(jù)卷,只要在docker run命令后面跟上-v參數(shù)即可創(chuàng)建一個(gè)數(shù)據(jù)卷,當(dāng)然也可以跟多個(gè)-v參數(shù)來(lái)創(chuàng)建多個(gè)數(shù)據(jù)卷,當(dāng)創(chuàng)建好帶有數(shù)據(jù)卷的容器后,
就可以在其他容器中通過(guò)--volumes-froms參數(shù)來(lái)掛載該數(shù)據(jù)卷了,而不管該容器是否運(yùn)行。也可以在Dockerfile中通過(guò)VOLUME指令來(lái)增加一個(gè)或者多個(gè)數(shù)據(jù)卷。
3)如果有一些數(shù)據(jù)想在多個(gè)容器間共享,或者想在一些臨時(shí)性的容器中使用該數(shù)據(jù),那么最好的方案就是你創(chuàng)建一個(gè)數(shù)據(jù)卷容器,然后從該臨時(shí)性的容器中掛載該數(shù)據(jù)卷容器的數(shù)據(jù)。
這樣,即使刪除了剛開(kāi)始的第一個(gè)數(shù)據(jù)卷容器或者中間層的數(shù)據(jù)卷容器,只要有其他容器使用數(shù)據(jù)卷,數(shù)據(jù)卷都不會(huì)被刪除的。
4)不能使用docker export、save、cp等命令來(lái)備份數(shù)據(jù)卷的內(nèi)容,因?yàn)閿?shù)據(jù)卷是存在于鏡像之外的。備份的方法可以是創(chuàng)建一個(gè)新容器,掛載數(shù)據(jù)卷容器,同時(shí)掛載一個(gè)本地目錄,
然后把遠(yuǎn)程數(shù)據(jù)卷容器的數(shù)據(jù)卷通過(guò)備份命令備份到映射的本地目錄里面。如下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
5)也可以把一個(gè)本地主機(jī)的目錄當(dāng)做數(shù)據(jù)卷掛載在容器上,同樣是在docker run后面跟-v參數(shù),不過(guò)-v后面跟的不再是單獨(dú)的目錄了,它是[host-dir]:[container-dir]:[rw|ro]這樣格式的,
host-dir是一個(gè)絕對(duì)路徑的地址,如果host-dir不存在,則docker會(huì)創(chuàng)建一個(gè)新的數(shù)據(jù)卷,如果host-dir存在,但是指向的是一個(gè)不存在的目錄,則docker也會(huì)創(chuàng)建該目錄,然后使用該目錄做數(shù)據(jù)源。docker run -d -P --name webapp -v `pwd`:/webapp training/webapp python app.py //用pwd獲取當(dāng)前絕對(duì)路徑注意事項(xiàng):如果容器內(nèi)部已經(jīng)存在/webapp目錄,那么掛載宿主目錄之后,它的內(nèi)容將會(huì)被覆蓋。(不過(guò)一般不會(huì)直接在容器中寫重要的數(shù)據(jù),是吧?。?/p>
需要注意的是,Dockerfile并不支持掛載本地目錄到數(shù)據(jù)卷,也就是說(shuō)不能在Dockerfile文件中使用VOLUME指令掛載本地目錄到數(shù)據(jù)卷,主要是因?yàn)椴煌僮飨到y(tǒng) 的目錄格式不盡相同。為了保證Dockerfile的可移植性,所以不支持這種方式,只能通過(guò)-v參數(shù)的形式掛載。
掛載目錄后面可以跟上目錄的操作權(quán)限,默認(rèn)是RW權(quán)限。使用格式如下:
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
除了掛載主機(jī)目錄外,也可以掛載主機(jī)的文件作為數(shù)據(jù)卷:
docker run --rm -it -v d:/test.txt:/test.txt ubuntu:latest /bin/bash //掛載的這個(gè)文件必須要存在,否則docker會(huì)創(chuàng)建同名的目錄,比如上面的test.txt文件不存在時(shí)會(huì)創(chuàng)建一個(gè)test.txt的目錄。
2.1 數(shù)據(jù)卷容器
數(shù)據(jù)卷容器故名思義是指一個(gè)專門用于掛載數(shù)據(jù)卷的容器,以供其他容器引用和使用。它主要是用在多個(gè)容器需要從一處獲得數(shù)據(jù)時(shí)。在實(shí)際操作時(shí),需要將數(shù)據(jù)容器命名,有了確定的容器名之后,對(duì)它有依賴關(guān)系的其它容器就可以通過(guò)--volumes-from引用它的數(shù)據(jù)卷。
首先,建立一個(gè)數(shù)據(jù)卷容器,名為test_dbdata,并為該容器新建一個(gè)數(shù)據(jù)卷/dbdata。具體操作為:
docker run -d -v /dbdata --name test_dbdata training/postgres
接著創(chuàng)建一個(gè)容器db1,它引用test_dbdata的數(shù)據(jù)卷,具體操作為:
docker run -d --volumes-from=test_dbdata --name db1 training/postgres
可以通過(guò)docker inspect test_dbdata/db1 來(lái)查看容器掛載信息。
從inspect信息中可以看到他們的數(shù)據(jù)卷是一樣的。需要說(shuō)明的是,數(shù)據(jù)卷一旦聲明,它的生命周期和聲明它的那個(gè)容器就無(wú)關(guān)了。當(dāng)聲明它的容器停止了,數(shù)據(jù)卷依賴存在,除非所有引用它的容器都被刪除了并且顯式地刪除了該數(shù)據(jù)卷。此外,一個(gè)容器引用一個(gè)數(shù)據(jù)卷容器時(shí),并不要求數(shù)據(jù)卷容器是運(yùn)行的。一個(gè)數(shù)據(jù)卷容器可以被多個(gè)容器引用。
docker run -d --volumes-from=test_dbdata --name db2 training/postgres
此外,數(shù)據(jù)卷容器還可以級(jí)聯(lián)經(jīng)引用。例如,新建一個(gè)容器db3,它可以引用db1的數(shù)據(jù)卷。
docker run -d --volumes-from=db1 --name db3 training/postgres
無(wú)論是聲明數(shù)據(jù)卷的容器還是后續(xù)引用該數(shù)據(jù)卷的容器,容器的停止和刪除都不會(huì)導(dǎo)致數(shù)據(jù)卷本身刪除。如果需要?jiǎng)h除數(shù)據(jù)卷,那么需要?jiǎng)h除所有依賴它的容器,并且在刪除最后一個(gè)依賴容器時(shí)加入-v標(biāo)志。這里,假如test_dbdata、db1、db2都已經(jīng)郵件了,那么刪除db3時(shí)加上-v參數(shù)就可以刪除數(shù)據(jù)卷。
docker rm -v db3
利用數(shù)據(jù)卷容器,還可以進(jìn)行數(shù)據(jù)的備份和恢復(fù)等。
1、備份、恢復(fù)
利用數(shù)據(jù)卷容器,我們可以備份一個(gè)數(shù)據(jù)卷容器的數(shù)據(jù)。
首先,建立一個(gè)數(shù)據(jù)卷容器,相關(guān)操作為:
docker run -d -v /dbdata --name dbdata training/postgress
這樣,數(shù)據(jù)都保存到了容器的/dbdata目錄,這里要備份/dbdata目錄到本地,相關(guān)操作為:
docker run --volumes-from dbdata -v ${pwd}:/backup ubuntu tar cvf /backup/backup.tar /dbdata
這里創(chuàng)建了一個(gè)新的數(shù)據(jù)卷容器,并引用了dbdata數(shù)據(jù)卷容器,當(dāng)前目錄掛載到新的數(shù)據(jù)卷容器/backup目錄,這樣當(dāng)前目錄就和/backup目錄是同一個(gè)目錄了,容器中的數(shù)據(jù)寫到/backup目錄亦即寫到了宿主機(jī)的當(dāng)前目錄。
恢復(fù)的過(guò)程其實(shí)就是將原來(lái)tar cvf打包的數(shù)據(jù),使用tar xvf解壓到數(shù)據(jù)卷。
注意:在windows中如果使用git-bash的命令行來(lái)運(yùn)行命令,pwd得到的路徑不認(rèn),可以直接寫絕對(duì)路徑,格式是:/d/docker_data d表示d盤。就是原來(lái)的 d:/ 換成了/d。
很詳細(xì)的講解數(shù)據(jù)卷、及備份恢復(fù)的文章:
前面我們使用了-P或-p來(lái)暴露容器端口,以供外界使用該容器。還有另一種容器對(duì)外提供服務(wù)的方法——容器連接。容器連接包含源容器和目標(biāo)容器:源容器是提供服務(wù)的一方,對(duì)外提供指定服務(wù);目標(biāo)容器連接到源容器后,就可以使用其所提供的服務(wù)。容器連接依賴于容器名,所以當(dāng)需要使用容器連接時(shí),首先需要命名容器,然后使用--link參數(shù)進(jìn)行連接。
連接的格式為:--link name:alias,其中name是源容器的名稱,alias是這個(gè)連接的別名。下面是一個(gè)連接的示例:
docker run -d --name dbdata training/postgres 上面的命令先建立了一個(gè)數(shù)據(jù)庫(kù)的容器,使用下面的命令連接它。 docker run -d -P --name web --link dbdata:db training/webapp python app.py
通過(guò)docker inspect web可以查看到連接信息。
通過(guò)這種方法,dbdata容器為web容器提供了服務(wù),但并沒(méi)有使用-P或-p對(duì)外暴露端口,這使得源容器dbdata更安全。那web容器是如何使用dbdata的服務(wù)呢?
Docker給目標(biāo)容器提供了如下兩種方式來(lái)暴露連接提供的服務(wù):
環(huán)境變量
/etc/hosts文件
下面分別說(shuō)明它們。
1 環(huán)境變量
當(dāng)兩個(gè)容器連接互聯(lián)之后,Docker將會(huì)在目標(biāo)容器中設(shè)置相關(guān)的環(huán)境變量,以便在目標(biāo)容器中使用源容器提供的服務(wù)。連接環(huán)境變量的命令格式為
一般情況下,可以使用evn命令來(lái)查看一個(gè)容器的環(huán)境變量,相關(guān)代碼為:
docker run --rm --name web --link dbdata:webdb training/webapp env
下面是顯示結(jié)果:
2 /etc/hosts文件
查看目標(biāo)容器的/etc/hosts配置文件,具體操作如下:
docker run -i -t --rm --name web2 --link dbdata:webdb training/webapp /bin/bash
可以看到,容器連接webdb對(duì)應(yīng)的ip地址,該ip地址即為dbdata容器的地址,容器對(duì)webdb連接的操作將映射到該地址上。
上面說(shuō)的容器連接都是在同一個(gè)宿主主機(jī)上的連接,要實(shí)現(xiàn)跨主機(jī)的容器連接,目前可以使用ambassador模式來(lái)實(shí)現(xiàn)跨主機(jī)連接,這種模式叫代理連接。
“Docker怎么連接網(wǎng)絡(luò)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!