8 Docker教程

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)容搁痛。

  1. 基鏡像是誰(shuí)?
  2. 怎么把我們需要的文件等裝到基鏡像宇弛?
  3. 怎么訪問(wèn)我們的應(yīng)用鸡典?使用哪個(gè)端口?
  4. 怎樣啟動(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è),記錄自己的用戶名破婆。
cdDockerfile路徑涮总,然后:

$ 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)題需要解決:

  1. bridge網(wǎng)絡(luò)是所有容器共享的展懈,不夠安全销睁。
  2. 告訴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è)名為foodtrucksbirdge網(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ì)有更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市徒役,隨后出現(xiàn)的幾起案子禾进,更是在濱河造成了極大的恐慌,老刑警劉巖廉涕,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艇拍,居然都是意外死亡狐蜕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門卸夕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人快集,你說(shuō)我怎么就攤上這事个初」院” “怎么了楣嘁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我聋溜,道長(zhǎng)撮躁,這世上最難降的妖魔是什么把曼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮型雳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冤荆。我一直安慰自己钓简,他們只是感情好汹想,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布损话。 她就那樣靜靜地躺著丧枪,像睡著了一般拧烦。 火紅的嫁衣襯著肌膚如雪服赎。 梳的紋絲不亂的頭發(fā)上重虑,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音提针,去河邊找鬼辐脖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛久锥,可吹牛的內(nèi)容都是我干的瑟由。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了究流?” 一聲冷哼從身側(cè)響起芬探,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哩簿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宗苍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讳窟,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞丧。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖突那,靈堂內(nèi)的尸體忽然破棺而出愕难,到底是詐尸還是另有隱情,我是刑警寧澤猜丹,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布藏杖,位于F島的核電站蝌麸,受9級(jí)特大地震影響祥楣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兽间,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帜羊。 院中可真熱鬧,春花似錦奶段、人聲如沸痹籍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)因俐。三九已至,卻和暖如春蓉坎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勿侯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兵钮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酿箭,于是被迫代替她去往敵國(guó)和親缭嫡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件炕泳?Google Compute Engi...
    ahohoho閱讀 15,532評(píng)論 15 147
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,748評(píng)論 1 21
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一登刺、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,499評(píng)論 0 120
  • 0. 前言 docker是什么?docker是用GO語(yǔ)言開(kāi)發(fā)的應(yīng)用容器引擎揍很,基于容器化窒悔,沙箱機(jī)制的應(yīng)用部署技術(shù)”本龋可...
    sessionboy閱讀 3,854評(píng)論 2 49
  • 2017年6月4日 星期日 天氣晴 崔笑媽媽親子日記 美好的一天從清晨開(kāi)始了!寶貝睜開(kāi)雙眼的第一件事就是...
    崔笑媽媽閱讀 225評(píng)論 1 1