課程目標(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)歷史的就讓它成為歷史,不要碰了窟赏。
? ?(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è)置。
設(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 ?
? ? 下次再說