手把手帶你體驗 Docker HelloWorld

課程目標(biāo)

[ ] ?Mac Pro 上如何安裝Docker

[ ] ?概念:Docker 引擎龙考,宿主機,鏡像(Image)期揪,容器(Container)

[ ] ?在 Docker 上如何運行 Nginx

[ ] ?容器的管理:查看掉奄,進(jìn)入,stop, start, restart, kill, 刪除

[ ] 怎么發(fā)布自己的一個 Docker Image ?

提醒:急速閱讀,請直接看第六節(jié)“總結(jié)(簡版操作)”姓建,詳細(xì)閱讀請按序诞仓。


一、 Mac 上安裝Docker


? ?關(guān)于mac下安裝docker速兔,搜索下會有一大堆墅拭,你只需了解4點:

? ?(1)最早最早Docker不能在mac下運行,只能在Linux運行涣狗;

? ?(2)過了不久谍婉,得安裝 boot2docker 就能在mac下跑docker;

? ?(3)再過了不久镀钓,來了個更簡單易用的 Docker Toolbox 就能在mac下跑docker穗熬;

? ?(4)到了現(xiàn)在,大概是2016年3月(記不清具體時間了)丁溅,有了 Docker for mac 這種“三點兩不點”這樣傻瓜式的安裝包唤蔗。

圖1: ?Docker for mac 傻瓜式的安裝包

于是你需要做的是:

? ?(1)歷史的就讓它成為歷史,不要碰了窟赏。

? ?(2)下載個 Docker for mac 妓柜, 盡管它是beta。但是涯穷,官方下載特別慢领虹!請去網(wǎng)盤 https://pan.baidu.com/s/1i47ylkp ? (無需提取密碼,100來兆)

? ?(3)能不能命令行求豫? brew install docker ? ?截止發(fā)稿不能塌衰,安裝出來的結(jié)果跟“docker for mac”的東西不一樣多。

提醒:

如果你的系統(tǒng)里之前安裝過 virtualbox 蝠嘉,而且版本不夠高最疆,docker for mac 會提示你必須“徹底刪除”,或者升級蚤告,才能安裝 docker for mac.?


二努酸、概念:Docker 引擎,宿主機杜恰,鏡像(Image)获诈,容器(Container)


? ? ? ?安裝好了 docker for mac, 你的mac機器叫宿主機心褐,運行著的那個帶界面的docker for mac 叫 Docker 引擎舔涎,也有命令行。比如:

$ docker images

就是查看本地已經(jīng)下載了多少鏡像(Image)逗爹。什么是鏡像(Image)和容器(Container)呢亡嫌?

docker與“鏡像”的關(guān)系,可以不嚴(yán)格但便于類比的理解為Linux的yum和軟件包(或者M(jìn)ac的brew和軟件包,或者M(jìn)aven的jar包)挟冠。

于是你可以聯(lián)想到:

$ docker images ? ? ? ? ? ? ? ?顯示本地已下載的鏡像于购,類比 brew list;

$ docker inspect $image ? 顯示鏡像的詳細(xì)信息知染,類比 brew info $some_app

$ docker search $image ? ?搜索某個鏡像肋僧,比如 nginx。 類比 brew search nginx

$ docker pull $image ? ? ? ?下載某個鏡像控淡,類比 brew install nginx

$ docker push $image ? ? ?上傳某個鏡像嫌吠。

問題來了,你可能發(fā)現(xiàn)逸寓,你運行 docker images 時,啥也沒有覆山,因為你沒裝竹伸。你再發(fā)現(xiàn) docker search nginx的時候,半天沒結(jié)果4乜怼Qā!

因為默認(rèn)管理這些鏡像的倉庫(稱為 Docker Hub 或者 Docker registry 或者 Docker repository)在國外魏割。

那么國內(nèi)有鏡像(Mirrors)站點嗎譬嚣?

有的,地址: http://aad0405c.m.daocloud.io

打開 Docker for mac -> preference -> advanced 钞它,如圖添加 Registry mirrors 拜银。

另外,如果你上外網(wǎng)需要走代理服務(wù)器遭垛,請設(shè)置代理服務(wù)器尼桶,否則HTTP Proxy不必設(shè)置。


圖2:設(shè)置Docker Registry mirrorsApp

設(shè)置完后锯仪,你執(zhí)行搜索一下 nginx的鏡像泵督,會顯示很多,排第一的是 daocloud.io 官方制作的庶喜。

$ docker search nginx

NAME ? ? ? ? ? ? ? ? ? ? ?DESCRIPTION ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? STARS ? ? OFFICIAL ? AUTOMATED

nginx ? ? ? ? ? ? ? ? ? ? Official build of Nginx. ? ? ? ? ? ? ? ? ? ? ? ?4489 ? ? ?[OK]

jwilder/nginx-proxy ? ? ? Automated Nginx reverse proxy for docker c... ? 848 ? ? ? ? ? ? ? ? ?[OK]

…… ?此處省略很多行


接著小腊,下載它,注意在前面添加 daocloud.io 前綴久窟。

$ docker pull daocloud.io/nginx

……

下載完成后秩冈,查看一下:

$ docker images

REPOSITORY ? ? ? ? ? TAG ? ? ? ? ? ? ? ? IMAGE ID ? ? ? ? ? ?CREATED ? ? ? ? ? ? SIZE

daocloud.io/nginx ? ?latest ? ? ? ? ? ? ?067c8da9d5ab ? ? ? ?11 days ago ? ? ? ? 181.5 MB

截止現(xiàn)在,了解了什么叫Image斥扛,但是什么是容器(Container)呢漩仙? 我們運行一下剛才下載的nginx image就知道了。


三、在 Docker 上運行 Nginx


運行nginx很簡單队他,只需要 docker run daocloud.io/nginx 卷仑。

當(dāng)然我們也可以更復(fù)雜一點,加點參數(shù)麸折,比如:

$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

4871c4b47f830a73fa8133f125e63d4a5871dac3a887567d5eb54ea7f8d8ac6c

接著锡凝,

$ docker ps

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

4871c4b47f83 ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 2 minutes ago ? ? ? Up 2 minutes ? ? ? ?443/tcp, 0.0.0.0:8080->80/tcp ? hello world

命令docker ps 顯示的是正在運行的Container列表,里面出現(xiàn)了剛才運行的nginx垢啼。于是可以把“容器(Container)”理解為鏡像(Image)的一次運行窜锯。

這個概念可以類比為“進(jìn)程”與“程序”的關(guān)系。不信芭析,你再看:

$ docker run --name helloworld2 -d -p 9090:80 daocloud.io/nginx

c1d93fbaa49ed16ce7da4cc90cbeba7f1279c15cf849dc5682d84985d3be3c3a

$ docker ps

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

c1d93fbaa49e ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 19 seconds ago ? ? ?Up 18 seconds ? ? ? 443/tcp, 0.0.0.0:9090->80/tcp ? helloworld2

4871c4b47f83 ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 7 minutes ago ? ? ? Up 7 minutes ? ? ? ?443/tcp, 0.0.0.0:8080->80/tcp ? helloworld

出現(xiàn)了第2個Container锚扎,Command都是nginx -g ,名字一個叫helloworld馁启,另一個叫helloworld2.

如何訪問它們呢驾孔?

$ curl http://localhost:8080

會顯示 “Welcome to nginx!” 的頁面。

$ curl http://localhost:9090

結(jié)果一樣惯疙,只是訪問了另外一個容器罷了翠勉。

你或許很著急希望知道:

(1)docker run的那些參數(shù)是什么意思?

(2)怎么看nginx的日志呢霉颠?

以第一個命令:$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx 來說对碌,”—name” 是給容器起了一個名字;-d 表示容器運行在后臺蒿偎,如果前臺朽们,用-i表示交互式;-p 8080:80 表示端口映射诉位,將宿主機的8080端口轉(zhuǎn)發(fā)到容器內(nèi)的80端口华坦;daocloud.io/nginx 表示剛才下載的鏡像(Image)。

看日志不从? 用命令惜姐,docker logs $container_id ?或者 docker logs $container_name

? ?~ docker ps

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

c1d93fbaa49e ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 8 minutes ago ? ? ? Up 8 minutes ? ? ? ?443/tcp, 0.0.0.0:9090->80/tcp ? helloworld2

4871c4b47f83 ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 15 minutes ago ? ? ?Up 15 minutes ? ? ? 443/tcp, 0.0.0.0:8080->80/tcp ? helloworld

? ?~ docker logs 4871c4b47f83

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

? ?~ docker logs helloworld

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"


四、容器的管理:查看椿息,進(jìn)入歹袁,stop, start, restart, kill, 刪除

查看宿主機運行著多少個容器,剛才已經(jīng)用到過 docker ps 命令寝优。

進(jìn)入容器內(nèi)条舔,用 docker attach helloworld命令。

$ docker attach helloworld

發(fā)現(xiàn)什么動靜都沒有乏矾? 如果我們用curl 再訪問以下nginx 8080口子孟抗,進(jìn)入容器的狀態(tài)下會出現(xiàn)一條日志:

$ docker attach helloworld

172.17.0.1 - - [02/Nov/2016:13:18:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"

如果我們要查看容器內(nèi)運行了哪些進(jìn)程呢迁杨? 用 docker top $container ?命令:

$ docker top helloworld

PID ? ? ? ? ? ? ? ? USER ? ? ? ? ? ? ? ?TIME ? ? ? ? ? ? ? ?COMMAND

1889 ? ? ? ? ? ? ? ?root ? ? ? ? ? ? ? ?0:00 ? ? ? ? ? ? ? ?nginx: master process nginx -g daemon off;

1905 ? ? ? ? ? ? ? ?104 ? ? ? ? ? ? ? ? 0:00 ? ? ? ? ? ? ? ?nginx: worker process

停掉一個容器,可以用stop或kill凄硼,區(qū)別是stop是優(yōu)雅關(guān)閉铅协,可以做一些收尾工作,kill是強制關(guān)閉摊沉。

? ?~ docker stop helloworld

helloworld

? ?~ docker ps

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

c1d93fbaa49e ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 20 minutes ago ? ? ?Up 20 minutes ? ? ? 443/tcp, 0.0.0.0:9090->80/tcp ? helloworld2

docker ps 顯示的是正在運行的容器狐史,如果要顯示所有容器(包括停止運行的),需要docker ps -a 參數(shù)说墨。

~ docker ps -a

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ? ? ? ? PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

c1d93fbaa49e ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 23 minutes ago ? ? ?Up 23 minutes ? ? ? ? ? ? ?443/tcp, 0.0.0.0:9090->80/tcp ? helloworld2

4871c4b47f83 ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 30 minutes ago ? ? ?Exited (0) 3 minutes ago ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hello world

如何再次啟動helloworld這個容器呢骏全? 直接 docker start helloworld,并不需要像最開始那樣docker run了尼斧。

docker restart 和 ?kill 自行試試看姜贡。如果我們徹底不要hello world這個容器呢?用docker rm $container命令(執(zhí)行的前提是容器先停止棺棵,或者-f強行刪除一個正在運行的容器)楼咳。

? ?~ docker rm helloworld

helloworld

? ?~ docker ps -a

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

c1d93fbaa49e ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 26 minutes ago ? ? ?Up 26 minutes ? ? ? 443/tcp, 0.0.0.0:9090->80/tcp ? helloworld2

名字叫”helloworld”的容器再也不存在了。


五律秃、發(fā)布自己的一個 Docker Image

時間不早了爬橡,下次再說吧~~

劇透下實驗內(nèi)容治唤,下載一個centos的鏡像棒动,然后運行起來,進(jìn)入這個容器宾添,在容器內(nèi)船惨,就跟我們平時進(jìn)入的centos操作系統(tǒng)沒啥區(qū)別。

不過這個簡單的centos容器里面缕陕,什么工具都沒有粱锐,比如常用的nc命令呀,curl命令呀扛邑,都沒有怜浅。我們會進(jìn)入容器,在容器內(nèi)手動安裝nc命令(當(dāng)然也可以類似Linux的Bash一樣弄個腳本蔬崩,這腳本叫Dockerfile )恶座。

接著我們會想,我們不希望后來者這么麻煩沥阳,需要手動安裝nc命令跨琳,能做到嗎?

可以桐罕。我們把安裝了nc命令的centos容器脉让,保存為一個鏡像桂敛,然后起個名字叫centos-with-nc,并發(fā)布到docker 倉庫溅潜,

后來者就可以下載并運行centos-with-nc這個鏡像了术唬。他們進(jìn)入容器時,就能直接用nc命令了伟恶。


六碴开、總結(jié)(簡版操作)


[x] ?Mac Pro 上如何安裝Docker

下載docker for mac: ? ? ?https://pan.baidu.com/s/1i47ylkp

[ ] ?概念:Docker 引擎,宿主機博秫,鏡像(Image)潦牛,容器(Container)

? ? ?$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

? ? ?$ docker ps

CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

4871c4b47f83 ? ? ? ?daocloud.io/nginx ? "nginx -g 'daemon off" ? 2 minutes ago ? ? ? Up 2 minutes ? ? ? ?443/tcp, 0.0.0.0:8080->80/tcp ? hello world

mac 機器叫宿主機,docker命令工具集叫docker引擎挡育,docker run 的daocloud.io/nginx 叫鏡像巴碗,docker ps列表顯示的叫容器。

[ ] ?在 Docker 上如何運行 Nginx

? ?$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

[ ] ?容器的管理:查看即寒,進(jìn)入橡淆,stop, start, restart, kill, 刪除

? ?查看:docker ps ?或 docker ps -a

? ?進(jìn)入: docker attach $container

? ?docker start/stop/kill/restart/rm ?$container 等

[ ] 怎么發(fā)布自己的一個 Docker Image ?

? ? 下次再說

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市母赵,隨后出現(xiàn)的幾起案子逸爵,更是在濱河造成了極大的恐慌,老刑警劉巖凹嘲,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师倔,死亡現(xiàn)場離奇詭異,居然都是意外死亡周蹭,警方通過查閱死者的電腦和手機趋艘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凶朗,“玉大人瓷胧,你說我怎么就攤上這事∨锓撸” “怎么了搓萧?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宛畦。 經(jīng)常有香客問我瘸洛,道長,這世上最難降的妖魔是什么刃永? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任货矮,我火速辦了婚禮,結(jié)果婚禮上斯够,老公的妹妹穿的比我還像新娘囚玫。我一直安慰自己喧锦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布抓督。 她就那樣靜靜地躺著燃少,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃在。 梳的紋絲不亂的頭發(fā)上阵具,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音定铜,去河邊找鬼阳液。 笑死,一個胖子當(dāng)著我的面吹牛揣炕,可吹牛的內(nèi)容都是我干的帘皿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼畸陡,長吁一口氣:“原來是場噩夢啊……” “哼鹰溜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丁恭,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤曹动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牲览,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓陈,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年竭恬,在試婚紗的時候發(fā)現(xiàn)自己被綠了跛蛋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熬的。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡痊硕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出押框,到底是詐尸還是另有隱情岔绸,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布橡伞,位于F島的核電站盒揉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兑徘。R本人自食惡果不足惜刚盈,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挂脑。 院中可真熱鬧藕漱,春花似錦欲侮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄仍,卻和暖如春韧涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侮繁。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工虑粥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪哩。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓舀奶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斋射。 傳聞我的和親對象是個殘疾皇子育勺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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