這篇文章給大家分享的是有關(guān)Docker中使用0.9.1版Docker會遇到什么問題的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為甘州企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè),甘州網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
我測試時,使用0.9.1版Docker的問題:
1.Dockerfile創(chuàng)建的image即使添加了-t也無法為新鏡像添加tag和名稱。
2.使用--link參數(shù)但卻在子容器中的/etc/hosts找不到父容器的信息,導(dǎo)致無法直接ping主機名。
問題解決的關(guān)鍵:
安裝最新版docker(看來前面的版本bug多多?。?/p>
安裝步驟(ubuntu)(參考自官網(wǎng)手冊):
1.安裝解析https的輔助工具:
apt-get install apt-transport-https
我強烈建議你安裝完后重啟機器,不然apt可能會無法解析https的網(wǎng)址!
2.添加key和源:
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 sh -c "echo deb https://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list" sudo apt-get update
3.安裝lxc-docker:
apt-get install lxc-docker
4.檢查docker版本:
docker version
顯示版本號如下(1.2.0):
root@docker:~# docker version Client version: 1.2.0 Client API version: 1.14 Go version (client): go1.3.1 Git commit (client): fa7b24f OS/Arch (client): linux/amd64 Server version: 1.2.0 Server API version: 1.14 Go version (server): go1.3.1 Git commit (server): fa7b24f
測試Dockerfile:
我pull了一個最小化的ubuntu image:
docker pull dbehnke/ubuntu1404
在本地目錄創(chuàng)建了一個名為Dockerfile的文件,:
vi Dockerfile #添加以下內(nèi)容 #my test image FROM dbehnke/ubuntu1404:latest #從現(xiàn)有的image創(chuàng)建一個新的image MAINTAINER Hochikong #維護(hù)者信息 RUN mkdir -p /home/backup RUN mv /etc/apt/sources.list /home/backup RUN wget http://172.16.77.157/sources.list -P /etc/apt #從宿主機(172.16.77.157)的apache2服務(wù)器下載本地化的sources.list文件,因為國外源太慢 RUN apt-get update
執(zhí)行build:
docker build -t="hochikong/local:v1" . #不要忘了后面的那一點,指代本地的Dockerfile文件;另外hochikong必須小寫,之前我輸入的是大寫提示"only [a-z0-9_] are allowed, size between 4 and 30"
看看我的image有沒有被創(chuàng)建好:
之前這篇的問題終于被解決了
測試--link參數(shù)的使用:
先啟動一個名為base的容器(父容器):
docker run -d -p 1000:5000 --name base training/webapp python app.py
查看狀態(tài):
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 928ebabc26eb training/webapp:latest "python app.py" 32 seconds ago Up 31 seconds 0.0.0.0:1000->5000/tcp base
可以看到容器已經(jīng)啟動,主機的1000端口被綁定到容器的5000端口,容器名為base
再啟動一個名為web的子容器:
docker run -d -p 2000:5000 --name web --link base:base training/webapp python app.py
再次檢查狀態(tài):
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21f82b33c27a training/webapp:latest "python app.py" 30 seconds ago Up 29 seconds 0.0.0.0:2000->5000/tcp web 928ebabc26eb training/webapp:latest "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:1000->5000/tcp base,web/base
可以看到,web容器已經(jīng)啟動。同時base容器的NAMES一欄多了web/base這個內(nèi)容,實際上,"web/base"中,web指的是連接到base的子容器,但是"/"后面的是這個鏈接的別名(推薦和父容器的容器名相同,接下來你會知道為什么)
我再啟動一個名為web2的子容器,同樣連接到base上:
docker run -d -p 3000:5000 --name web2 --link base:connection2 training/webapp python app.py
看看docker ps的結(jié)果:
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d180046639f4 training/webapp:latest "python app.py" 57 seconds ago Up 56 seconds 0.0.0.0:3000->5000/tcp web2 21f82b33c27a training/webapp:latest "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:2000->5000/tcp web 928ebabc26eb training/webapp:latest "python app.py" 8 minutes ago Up 8 minutes 0.0.0.0:1000->5000/tcp base,web/base,web2/connection2
在base的NAMES欄多了"web2/connection2"(對此你可以參考https://docs.docker.com/userguide/dockerlinks/,看看"--link name:alias"的含義)
我們通過nsenter連接一下web2,先獲取PID號:
root@docker:~# docker inspect web2 | grep Pid #docker inspect CONTAINERNAME能以JSON格式輸出指定容器的詳細(xì)信息,我直接用grep過濾出來 "Pid": 21275,
連接web2:
nsenter --target 21275 --mount --uts --net --ipc --pid #使用那個PID值
查看該容器的/etc/hosts文件:
我再查看下base的IP地址:
root@docker:~# docker inspect base | grep IP "IPAddress": "172.17.0.11", "IPPrefixLen": 16,
你是不是覺得很殘念!實際上,172.17.0.11正是base的IP地址,但是在web2中,顯示的卻是該鏈接的名稱,你ping主機connection2實際上是ping容器base。但是我認(rèn)為這很不合理!為什么hosts文件寫的不是父容器的容器名而是鏈接的名稱?
ping下base容器:
ping是ping得通。
正是因為不合理,我才強烈建議你這樣寫:
docker run -d -p 2000:5000 --name web --link base:base training/webapp python app.py
使鏈接的名(":"后的base)和父容器名(":"前的base)相同!
連接上web容器,可以看到hosts中的信息,這樣的話,ping父容器名也更合理:
注意:
在base容器中不包含子容器的信息:
在設(shè)計應(yīng)用的時候,尤其要注意這一點(不可能使web服務(wù)為父容器,數(shù)據(jù)庫為子容器吧?)
感謝各位的閱讀!關(guān)于“Docker中使用0.9.1版Docker會遇到什么問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!