8 Docker教程
大量借鑒https://prakhar.me/docker-curriculum/殖告,以下不做更多說(shuō)明
試玩Busybox
Busybox可以認(rèn)為就是一個(gè)簡(jiǎn)化的linux系統(tǒng)
運(yùn)行
$ docker pull busybox
由于系統(tǒng)權(quán)限問(wèn)題,上述命令可能會(huì)有問(wèn)題。Mac系統(tǒng)請(qǐng)查看Docker引擎正在運(yùn)行。Linux請(qǐng)嘗試“sudo docker pull busybox”
pull命令將busybox鏡像從Decker寄存器提取并保存在你的系統(tǒng)。
運(yùn)行下面命令,可以看到系統(tǒng)上安裝的所有鏡像
$ docker images
run
讓我們運(yùn)行一下這個(gè)鏡像
$ docker run busybox
嗯承璃。角溃。互妓。有什么變化嗎?其實(shí)后臺(tái)發(fā)生了很多事情蚀腿,雖然你現(xiàn)在看不出來(lái)程癌。當(dāng)你運(yùn)行run命令時(shí)舷嗡,客戶端找到鏡像(這里就是busybox),載入容器然后在這個(gè)容器中運(yùn)行命令嵌莉。我們剛才并沒(méi)有提供任何命令进萄,所以這個(gè)容器啟動(dòng),空跑一通就直接退出了锐峭。
那我們?cè)囍峁┮粋€(gè)命令
$ docker run busybox echo "hello from busybox"
hello from busybox
贊中鼠!終于看到些變化了。這一個(gè)命令沿癞,我們經(jīng)歷了啟動(dòng)一個(gè)鏡像援雇,運(yùn)行一個(gè)命令,然后退出椎扬。而且這個(gè)過(guò)程真的很快熊杨!你用是任何一個(gè)虛擬機(jī)能做到這個(gè)速度嗎曙旭?知道Docker很快了吧。
我們?cè)賮?lái)看看docker ps命令晶府,它顯示所有正在運(yùn)行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
因?yàn)楝F(xiàn)在并沒(méi)有運(yùn)行的容器钻趋,我們看不到什么信息川陆。我們是一個(gè)更有用的形式:docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305297d7a235 busybox "uptime" 11 minutes ago Exited (0) 11 minutes ago distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 minutes ago Exited (0) 12 minutes ago elated_ramanujan
So what we see above is a list of all containers that we ran. Do notice that the STATUS column shows that these containers exited a few minutes ago.
看到了嗎?這是我們之前運(yùn)行過(guò)的容器的清單蛮位。其中STATUS顯示這些容器在多久前退出较沪。
那我們可以運(yùn)行多條命令嗎?我們?cè)囅聠?dòng)鏡像的一個(gè)bash可以嗎失仁?
$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
it將我們連接到容器中一個(gè)交互的tty尸曼。其中, -t選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上, -i則讓容器的標(biāo)準(zhǔn)輸入保持打開(kāi)萄焦,即交互狀態(tài)控轿。
這里,我們可以輸入任何我們想輸入的命令拂封。
在容器中茬射,嘗試新建一個(gè)文件,比如touch myfile.txt,然后ls確認(rèn)新建成功冒签。輸入exit在抛,點(diǎn)擊Enter。再次docker run -it busybox sh進(jìn)入容器萧恕,運(yùn)行ls刚梭。有沒(méi)有發(fā)現(xiàn),剛才新建的文件消失了票唆。這是因?yàn)槲覀兪褂?em>run啟動(dòng)鏡像朴读,每次都會(huì)創(chuàng)建全新的容器。
下面在說(shuō)下怎么刪除容器惰说。我們剛才看到磨德,即使我們退出容易,仍然可以通過(guò)docker ps -a命令看到退出容器的殘留吆视。隨著容器建立退出次數(shù)越來(lái)越多典挑,這些殘留將會(huì)占用大量硬盤空間。因此啦吧,如果沒(méi)有特殊需求您觉,最好用完之后清除這些殘留。我們可以使用docker rm命令授滓,后面填容器的container ID(通過(guò)docker ps -a可見(jiàn)此ID)
$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9
如果想更快地刪除大量容器琳水,可以:
$ docker rm $(docker ps -a -q -f status=exited)
最后肆糕,還可以通過(guò)docker rmi刪除不用的鏡像
容器其他命令
docker start | restart | stop:?jiǎn)?dòng)停止的容器,重啟容器在孝,停止容器
docker exec:運(yùn)行正在運(yùn)行的一個(gè)容器的命令
建議自己查查诚啃,因?yàn)楹竺娌挥眠@些命令,這里略過(guò)私沮,以免影響心情始赎。
Docker的Webapp
玩夠了,我們現(xiàn)在可以搞點(diǎn)真實(shí)的東西了仔燕。
靜態(tài)網(wǎng)站
我們一步步來(lái)造垛。我們首先嘗試建立一個(gè)巨簡(jiǎn)單的靜態(tài)網(wǎng)站。我們會(huì)從Docker Hub拖下來(lái)一個(gè)鏡像晰搀,跑一個(gè)容器五辽,感受一下跑一個(gè)網(wǎng)站服務(wù)是多么簡(jiǎn)單。
開(kāi)始干活外恕。這個(gè)靜態(tài)網(wǎng)站托管在在Docker寄存器 - prakhar1989/static-site杆逗。下載這個(gè)鏡像然后跑起來(lái),以下這一條命令搞定:
$ docker run prakhar1989/static-site
因?yàn)楸镜貨](méi)有這個(gè)鏡像吁讨,所以首先下載才能跑起來(lái)髓迎。等到看到Nginx is running...就說(shuō)明已經(jīng)跑起來(lái)了。那怎么看到網(wǎng)站呢建丧?我們?cè)趺床拍芫W(wǎng)站這個(gè)容器排龄?
額。翎朱¢衔。現(xiàn)在客戶端沒(méi)有暴露任何端口拴曲,我們需要重新運(yùn)行docker run以開(kāi)放端口争舞。同時(shí),當(dāng)關(guān)掉終端時(shí)澈灼,我們也不想關(guān)掉運(yùn)行中的容器竞川。滿足這種需求的模式叫做分離模式(detached mode)。
$ docker run -d -P --name static-site prakhar1989/static-site
e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810
上述命令中叁熔,, -d進(jìn)入分離模式, -P將所有端口暴露到隨機(jī)端口委乌。--name后面是我們起的名字。現(xiàn)在我們通過(guò)下面命令查看端口吧
$ docker port static-site
80/tcp -> 0.0.0.0:32769
443/tcp -> 0.0.0.0:32768
瀏覽器輸入“http://localhost:32769”訪問(wèn)荣回。當(dāng)然遭贸,我們也可以指定端口,比如
$ docker run -p 8888:80 prakhar1989/static-site
Nginx is running...
想要停止容器心软,使用docker stop 容器id 命令壕吹。
是不是巨簡(jiǎn)單著蛙?你已經(jīng)知道怎么使用Docker鏡像跑起來(lái)一個(gè)網(wǎng)站了,那么耳贬,我們?cè)趺唇⒆约旱溺R像呢踏堡?
Docker鏡像
本小結(jié)介紹如何建立自己的鏡像。
簡(jiǎn)單來(lái)講效拭,Docker鏡像就像是一個(gè)git倉(cāng)庫(kù)暂吉,鏡像可以做出有很多改變和版本的提交。如果不指定版本缎患,默認(rèn)使用最新版。
比如像要拉取某個(gè)版本的Ubuntu
$ docker pull ubuntu:12.04
想要得到一個(gè)Docker鏡像阎肝,或者從一個(gè)Docker寄存器(比如Docker Hub)拉取挤渔,或者自己建立。你可以在Docker Hub搜索自己想要的鏡像风题。
鏡像有一個(gè)需要特變注意的區(qū)別是基鏡像和子鏡像(base and child images)判导。
基鏡像沒(méi)有任何父鏡像,一般是系統(tǒng)鏡像比如Ubuntu和剛才用到的busybox沛硅。子鏡像基于基鏡像并于其上添加一些功能眼刃。這樣就有了官方鏡像和用戶鏡像。
官方鏡像由Docker員工維護(hù)摇肌,用戶鏡像由類似你我的用戶建立擂红。
我們的第一個(gè)鏡像
需要python支持,沒(méi)有的話自己去安裝围小。
我們的目標(biāo)是建立一個(gè)Flash應(yīng)用昵骤。這個(gè)應(yīng)用是原作者做的,每次載入會(huì)顯示一個(gè)隨機(jī)的小貓動(dòng)圖肯适。請(qǐng)復(fù)制此庫(kù)到本地变秦。
驗(yàn)證本地工作
進(jìn)入flask-app路徑然后運(yùn)行此應(yīng)用,如下:
$ cd flask-app
$ pip install -r requirements.txt
$ python app.py
* Running on http://0.0.0.0:5000/ (Press CTRL**C to quit)
一切順利的話框舔,你可以在http://localhost:5000看到效果蹦玫。
如果出現(xiàn)權(quán)限問(wèn)題,可能需要sudo刘绣,或者你不想吧各種包安裝到系統(tǒng)層面樱溉,可以試試pip install --user -r requirements.txt
不錯(cuò)吧?下一步我們就要用此鏡像建立一個(gè)自己的鏡像额港。
建立自己的鏡像
如前所述饺窿,所有的用戶鏡像都是基于基鏡像。
因?yàn)槲覀冞@個(gè)應(yīng)用使用Python寫成移斩,我們使用的基鏡像是Python 3肚医。下載:
$ docker pull python:3-onbuild
onbuild版的鏡像包括可以使應(yīng)用啟動(dòng)的一些幫助項(xiàng)【钼桑現(xiàn)在我們有了足夠的內(nèi)容:可工作的app和基鏡像。下一步做什么呢肠套?我們使用Dockerfile
Dockerfile
什么是Dockerfile
Dockerfile就是一個(gè)簡(jiǎn)單的文本文件舰涌,它里面包含了創(chuàng)建鏡像的時(shí)候Docker客戶端調(diào)用的命令。這是一個(gè)簡(jiǎn)化自動(dòng)化鏡像創(chuàng)建的過(guò)程你稚。你在Dockerfile寫的命令和Linux命令幾乎相同瓷耙,是不是很爽?不用學(xué)就會(huì)了吧刁赖?
下面我們腦補(bǔ)一下Dockerfile應(yīng)該有什么內(nèi)容搁痛。
- 基鏡像是誰(shuí)?
- 怎么把我們需要的文件等裝到基鏡像宇弛?
- 怎么訪問(wèn)我們的應(yīng)用鸡典?使用哪個(gè)端口?
- 怎樣啟動(dòng)應(yīng)用枪芒?
我們看下Dockerfile的內(nèi)容(位于flask-app文件夾)
# 基鏡像
FROM python:3-onbuild
# 端口
EXPOSE 5000
# 啟動(dòng)應(yīng)用
CMD ["python", "./app.py"]
我們可以看到彻况,這個(gè)文件沒(méi)有回答第二個(gè)問(wèn)題,如何是好舅踪?
不用擔(dān)心纽甘,因?yàn)槲覀兊?strong>Dockerfile位于flask-app文件夾,且使用onbuild版本抽碌,第二個(gè)問(wèn)題自動(dòng)解決了悍赢。
使用Dockerfile
怎么用呢?讓docker build命令去干就行了咬展。
首先泽裳,沒(méi)有注冊(cè)Docker hub的同學(xué)要去注冊(cè),記錄自己的用戶名破婆。
cd到Dockerfile路徑涮总,然后:
$ docker build -t 你的用戶名/catnip .
Sending build context to Docker daemon 8.704 kB
Step 1 : FROM python:3-onbuild
# Executing 3 build triggers...
Step 1 : COPY requirements.txt /usr/src/app/
---> Using cache
Step 1 : RUN pip install --no-cache-dir -r requirements.txt
---> Using cache
Step 1 : COPY . /usr/src/app
---> 1d61f639ef9e
Removing intermediate container 4de6ddf5528c
Step 2 : EXPOSE 5000
---> Running in 12cfcf6d67ee
---> f423c2f179d1
Removing intermediate container 12cfcf6d67ee
Step 3 : CMD python ./app.py
---> Running in f01401a5ace9
---> 13e87ed1fbc2
Removing intermediate container f01401a5ace9
Successfully built 13e87ed1fbc2
其中-t標(biāo)記來(lái)添加tag,指定新的鏡像的用戶信息祷舀。 “.” 是 Dockerfile所在的路徑(當(dāng)前目錄)瀑梗,也可以替換為一個(gè)具體的 Dockerfile的路徑。
跑起來(lái)
$ docker run -p 8888:5000 用戶名/catnip
* Running on http://0.0.0.0:5000/ (Press CTRL**C to quit)
訪問(wèn)“http://0.0.0.0:8888/”看看效果吧裳扯。
祝賀你抛丽,成功了!
Docker on AWS
算了吧
多容器環(huán)境
上面部分只運(yùn)行了一個(gè)Docker饰豺。但是為了運(yùn)行一個(gè)應(yīng)用亿鲜,你還用很多其他依賴吧,數(shù)據(jù)庫(kù)得有吧?
這部分我們就討論下怎么運(yùn)行有依賴的應(yīng)用蒿柳。具體來(lái)講饶套,就是討論運(yùn)行和管理多容器環(huán)境。
將各種服務(wù)解耦很重要垒探,使用容器隔離各個(gè)服務(wù)妓蛮。這樣就可以針對(duì)各個(gè)服務(wù)進(jìn)行單獨(dú)優(yōu)化。
SF Food Trucks為例
此應(yīng)用包含Flask后臺(tái)和Elasticsearch服務(wù)圾叼。自然我們想把它分成兩個(gè)容器蛤克。如果以后某部分成為性能瓶頸,我們可以通過(guò)增加容器單獨(dú)優(yōu)化夷蚊。
Elasticsearch容器
建立容器應(yīng)該不難吧构挤,我們已經(jīng)建立過(guò)一個(gè)Flask容器,那我們看看有沒(méi)有Elasticsearch容器:
$ docker search elasticsearch
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
elasticsearch Elasticsearch is a powerful open source se... 697 [OK]
itzg/elasticsearch Provides an easily configurable Elasticsea... 17 [OK]
tutum/elasticsearch Elasticsearch image - listens in port 9200. 15 [OK]
barnybug/elasticsearch Latest Elasticsearch 1.7.2 and previous re... 15 [OK]
digitalwonderland/elasticsearch Latest Elasticsearch with Marvel & Kibana 12 [OK]
monsantoco/elasticsearch ElasticSearch Docker image 9 [OK]
我們可以看到有一個(gè)官方版本(沒(méi)有前綴那個(gè))惕鼓。我們迅速就可以把它運(yùn)行起來(lái):
$ docker run -dp 9200:9200 --name es elasticsearch
d582e031a005f41eea704cdc6b21e62e7a8a42021297ce7ce123b945ae3d3763
$ curl 0.0.0.0:9200
{
"name" : "Ultra-Marine",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.1",
"build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
"build_timestamp" : "2015-12-15T13:05:55Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
Flask容器
下一步就是跑起來(lái)Flask****容器儿倒。
首先我們需要Dockerfile。這次呜笑,除了Python,我們需要JavaScript依賴和nodejs彻犁。因?yàn)橛辛俗远x構(gòu)建的步驟叫胁,我們需要從Ubuntu基鏡像開(kāi)始。
Dockerfile如下:
# start from base
FROM ubuntu:14.04
MAINTAINER Prakhar Srivastav <prakhar@prakhar.me>
# install system-wide deps for python and node
RUN apt-get -yqq update
RUN apt-get -yqq install python-pip python-dev
RUN apt-get -yqq install nodejs npm
RUN ln -s /usr/bin/nodejs /usr/bin/node
# copy our application code
ADD flask-app /opt/flask-app
WORKDIR /opt/flask-app
# fetch app specific deps
RUN npm install
RUN npm run build
RUN pip install -r requirements.txt
# expose port
EXPOSE 5000
# start app
CMD [ "python", "./app.py" ]
我們從基鏡像開(kāi)始汞幢,安裝依賴項(xiàng)驼鹅。yqq說(shuō)明任何詢問(wèn)都答yes,而且創(chuàng)建了到node的符號(hào)鏈接來(lái)保證兼容性森篷。
然后使用ADD命令將我們的應(yīng)用復(fù)制到容器中的/opt/flask-app绰更。然后我們將這個(gè)目錄設(shè)為工作目錄反番,這樣下面的操作將會(huì)在這個(gè)目錄進(jìn)行。
現(xiàn)在系統(tǒng)級(jí)別的依賴都搞定了,下面就要安裝應(yīng)用級(jí)的依賴了显拜。首先使用npm安裝然后運(yùn)行pip。后面步驟前別按介紹過(guò)穆壕,不再詳述考传。
最后,跑起來(lái)吧(其實(shí)是爬前联,因?yàn)橐螺d很多東西):
$ docker build -t 你的用戶名/foodtrucks-web .
都安裝好后功戚,再次運(yùn)行會(huì)很快。我們?cè)囋嚕?/p>
$ docker run -P prakhar1989/foodtrucks-web
Unable to connect to ES. Retying in 5 secs...
Unable to connect to ES. Retying in 5 secs...
Unable to connect to ES. Retying in 5 secs...
Out of retries. Bailing out...
額似嗤。啸臀。。我們的應(yīng)用跑步起來(lái)烁落,因?yàn)樗恢?strong>Elasticsearch在哪乘粒。怎么辦呢豌注?
Docker Network
首先,我們想想怎么解決這個(gè)問(wèn)題谓厘。想想我們學(xué)過(guò)什么命令可以用來(lái)給我們一些啟示嗎幌羞?docker ps如何?其實(shí)除了這個(gè)命令我們不知道該干什么了吧竟稳。
我們來(lái)試下:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e931ab24dedc elasticsearch "/docker-entrypoint.s" 2 seconds ago Up 2 seconds 0.0.0.0:9200->9200/tcp, 9300/tcp cocky_spence
這段輸出跟我們說(shuō)在0.0.0.0:9200有一個(gè)ES容器可以訪問(wèn)属桦。我們能告訴Flask去訪問(wèn)這里嗎?
那么我們就得和Flask容器中的應(yīng)用說(shuō)去訪問(wèn)主機(jī)的0.0.0.0:9200吧他爸。但是ES容器也運(yùn)行在0.0.0.0聂宾,只不過(guò)是另外一個(gè)端口。那么并不能通過(guò)訪問(wèn)這個(gè)IP來(lái)交流诊笤。哪還有什么IP可用嗎系谐?
下面我們分析一下docker的網(wǎng)絡(luò)。當(dāng)docker安裝之后讨跟,自動(dòng)建立三個(gè)網(wǎng)絡(luò):
$ docker network ls
NETWORK ID NAME DRIVER
075b9f628ccc none null
be0f7178486c host host
8022115322ec bridge bridge
bridge網(wǎng)絡(luò)是運(yùn)行的默認(rèn)網(wǎng)絡(luò)纪他。我們查看下:
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "8022115322ec80613421b0282e7ee158ec41e16f565a3e86fa53496105deb2d7",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Containers": {
"e931ab24dedc1640cddf6286d08f115a83897c88223058305460d7bd793c1947": {
"EndpointID": "66965e83bf7171daeb8652b39590b1f8c23d066ded16522daeb0128c9c25c189",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
}
}
]
可以見(jiàn)到我們的容器e931ab24dedc在"Containers"中列出,而且分配了一個(gè)IP:172.17.0.2晾匠。這個(gè)IP是我們想要用的那個(gè)嗎茶袒?我們運(yùn)行flask容器試試。
$ docker run -it --rm 你的用戶名/foodtrucks-web bash
root@35180ccc206a:/opt/flask-app# curl 172.17.0.2:9200
bash: curl: command not found
root@35180ccc206a:/opt/flask-app# apt-get -yqq install curl
root@35180ccc206a:/opt/flask-app# curl 172.17.0.2:9200
{
"name" : "Jane Foster",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.1",
"build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
"build_timestamp" : "2015-12-15T13:05:55Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
root@35180ccc206a:/opt/flask-app# exit
--rm說(shuō)明運(yùn)行完就自動(dòng)刪除這個(gè)容器凉馆。我們進(jìn)入容器后薪寓,運(yùn)行了一個(gè)curl命令,但是提示此命令沒(méi)有安裝澜共,所以需要安裝之后向叉,再次運(yùn)行。然后嗦董,大功告成母谎!
雖然我們知道了怎么樣讓它們之間通信,但是我們?nèi)匀挥袃蓚€(gè)問(wèn)題需要解決:
- bridge網(wǎng)絡(luò)是所有容器共享的展懈,不夠安全销睁。
- 告訴Flask連接我們讓他連接的地址。
Docker允許我們建立我們自己的網(wǎng)絡(luò)存崖,還能是它們互相隔離.
首先冻记,我們建立一個(gè)自己的網(wǎng)絡(luò)
$ docker network create foodtrucks
1a3386375797001999732cb4c4e97b88172d983b08cd0addfcb161eed0c18d89
$ docker network ls
NETWORK ID NAME DRIVER
1a3386375797 foodtrucks bridge
8022115322ec bridge bridge
075b9f628ccc none null
be0f7178486c host host
這個(gè)命令新建了一個(gè)名為foodtrucks的birdge網(wǎng)絡(luò)。Docker網(wǎng)路的詳細(xì)內(nèi)容来惧,請(qǐng)閱讀官方文檔冗栗。
現(xiàn)在我們有了網(wǎng)絡(luò),我們可以使用 --net將我們的容器運(yùn)行在這個(gè)網(wǎng)絡(luò)。首先隅居,我們先把之前的容器停止钠至。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e931ab24dedc elasticsearch "/docker-entrypoint.s" 4 hours ago Up 4 hours 0.0.0.0:9200->9200/tcp, 9300/tcp cocky_spence
$ docker stop e931ab24dedc
e931ab24dedc
$ docker run -dp 9200:9200 --net foodtrucks --name es elasticsearch
2c0b96f9b8030f038e40abea44c2d17b0a8edda1354a08166c33e6d351d0c651
$ docker network inspect foodtrucks
[
{
"Name": "foodtrucks",
"Id": "1a3386375797001999732cb4c4e97b88172d983b08cd0addfcb161eed0c18d89",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{}
]
},
"Containers": {
"2c0b96f9b8030f038e40abea44c2d17b0a8edda1354a08166c33e6d351d0c651": {
"EndpointID": "15eabc7989ef78952fb577d0013243dae5199e8f5c55f1661606077d5b78e72a",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {}
}
]
我們這次給了這個(gè)容器一個(gè)名字es,運(yùn)行在我們自定義的網(wǎng)絡(luò)胎源,其他都和以前一樣棉钧。我們?cè)谠囍鴮⑽覀兊?strong>flask容器運(yùn)行在這個(gè)網(wǎng)絡(luò)。
$ docker run -it --rm --net foodtrucks 你的賬戶名/foodtrucks-web bash
root@53af252b771a:/opt/flask-app# cat /etc/hosts
172.18.0.3 53af252b771a
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 es
172.18.0.2 es.foodtrucks
root@53af252b771a:/opt/flask-app# curl es:9200
bash: curl: command not found
root@53af252b771a:/opt/flask-app# apt-get -yqq install curl
root@53af252b771a:/opt/flask-app# curl es:9200
{
"name" : "Doctor Leery",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.1",
"build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
"build_timestamp" : "2015-12-15T13:05:55Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
root@53af252b771a:/opt/flask-app# ls
app.py node_modules package.json requirements.txt static templates webpack.config.js
root@53af252b771a:/opt/flask-app# python app.py
Index not found...
Loading data in elasticsearch ...
Total trucks loaded: 733
* Running on http://0.0.0.0:5000/ (Press CTRL**C to quit)
root@53af252b771a:/opt/flask-app# exit
搞定涕蚤!下一步我們將容器正式運(yùn)行起來(lái)宪卿。
$ docker run -d --net foodtrucks -p 5000:5000 --name foodtrucks-web 你的用戶名/foodtrucks-web
2a1b77e066e646686f669bab4759ec1611db359362a031667cacbe45c3ddb413
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a1b77e066e6 prakhar1989/foodtrucks-web "python ./app.py" 2 seconds ago Up 1 seconds 0.0.0.0:5000->5000/tcp foodtrucks-web
2c0b96f9b803 elasticsearch "/docker-entrypoint.s" 21 minutes ago Up 21 minutes 0.0.0.0:9200->9200/tcp, 9300/tcp es
$ curl -I 0.0.0.0:5000
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 3697
Server: Werkzeug/0.11.2 Python/2.7.6
Date: Sun, 10 Jan 2016 23:58:53 GMT
進(jìn)入http://0.0.0.0:5000享受一個(gè)你的應(yīng)用吧。這個(gè)過(guò)程雖然看起來(lái)很恐怖万栅,實(shí)際只有四條命令佑钾。原作者將其寫入一個(gè)bash script:
#!/bin/bash
# build the flask container
docker build -t prakhar1989/foodtrucks-web .
# create the network
docker network create foodtrucks
# start the ES container
docker run -d --net foodtrucks -p 9200:9200 -p 9300:9300 --name es elasticsearch
# start the flask app container
docker run -d --net foodtrucks -p 5000:5000 --name foodtrucks-web prakhar1989/foodtrucks-web
下次想運(yùn)行這個(gè)應(yīng)用,只要這樣既可:
$ git clone https://github.com/prakhar1989/FoodTrucks
$ cd FoodTrucks
$ ./setup-docker.sh
完烦粒!很清爽吧休溶!
還有更多docker內(nèi)容,可以訪問(wèn)原文教程扰她。
本人也正在學(xué)習(xí)兽掰,以后可能會(huì)有更新