手把手帶你體驗 Docker HelloWorld

課程目標

[ ] ?Mac Pro 上如何安裝Docker

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

[ ] ?在 Docker 上如何運行 Nginx

[ ] ?容器的管理:查看,進入,stop, start, restart, kill, 刪除

[ ] 怎么發布自己的一個 Docker Image ?

提醒:急速閱讀,請直接看第六節“總結(簡版操作)”,詳細閱讀請按序。


一、 Mac 上安裝Docker


? ?關于mac下安裝docker,搜索下會有一大堆,你只需了解4點:

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

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

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

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

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

于是你需要做的是:

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

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

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

提醒:

如果你的系統里之前安裝過 virtualbox ,而且版本不夠高,docker for mac 會提示你必須“徹底刪除”,或者升級,才能安裝 docker for mac.?


二、概念:Docker 引擎,宿主機,鏡像(Image),容器(Container)


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

$ docker images

就是查看本地已經下載了多少鏡像(Image)。什么是鏡像(Image)和容器(Container)呢?

docker與“鏡像”的關系,可以不嚴格但便于類比的理解為Linux的yum和軟件包(或者Mac的brew和軟件包,或者Maven的jar包)。

于是你可以聯想到:

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

$ docker inspect $image ? 顯示鏡像的詳細信息,類比 brew info $some_app

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

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

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

問題來了,你可能發現,你運行 docker images 時,啥也沒有,因為你沒裝。你再發現 docker search nginx的時候,半天沒結果!!!

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

那么國內有鏡像(Mirrors)站點嗎?

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

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

另外,如果你上外網需要走代理服務器,請設置代理服務器,否則HTTP Proxy不必設置。


圖2:設置Docker Registry mirrorsApp

設置完后,你執行搜索一下 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

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


三、在 Docker 上運行 Nginx


運行nginx很簡單,只需要 docker run daocloud.io/nginx

當然我們也可以更復雜一點,加點參數,比如:

$ 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列表,里面出現了剛才運行的nginx。于是可以把“容器(Container)”理解為鏡像(Image)的一次運行。

這個概念可以類比為“進程”與“程序”的關系。不信,你再看:

$ 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

出現了第2個Container,Command都是nginx -g ,名字一個叫helloworld,另一個叫helloworld2.

如何訪問它們呢?

$ curl http://localhost:8080

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

$ curl http://localhost:9090

結果一樣,只是訪問了另外一個容器罷了。

你或許很著急希望知道:

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

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

以第一個命令:$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx 來說,”—name” 是給容器起了一個名字;-d 表示容器運行在后臺,如果前臺,用-i表示交互式;-p 8080:80 表示端口映射,將宿主機的8080端口轉發到容器內的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" “-"


四、容器的管理:查看,進入,stop, start, restart, kill, 刪除

查看宿主機運行著多少個容器,剛才已經用到過 docker ps 命令。

進入容器內,用 docker attach helloworld命令。

$ docker attach helloworld

發現什么動靜都沒有? 如果我們用curl 再訪問以下nginx 8080口子,進入容器的狀態下會出現一條日志:

$ docker attach helloworld

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

如果我們要查看容器內運行了哪些進程呢? 用 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,區別是stop是優雅關閉,可以做一些收尾工作,kill是強制關閉。

? ?~ 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 參數。

~ 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命令(執行的前提是容器先停止,或者-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”的容器再也不存在了。


五、發布自己的一個 Docker Image

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

劇透下實驗內容,下載一個centos的鏡像,然后運行起來,進入這個容器,在容器內,就跟我們平時進入的centos操作系統沒啥區別。

不過這個簡單的centos容器里面,什么工具都沒有,比如常用的nc命令呀,curl命令呀,都沒有。我們會進入容器,在容器內手動安裝nc命令(當然也可以類似Linux的Bash一樣弄個腳本,這腳本叫Dockerfile )。

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

可以。我們把安裝了nc命令的centos容器,保存為一個鏡像,然后起個名字叫centos-with-nc,并發布到docker 倉庫,

后來者就可以下載并運行centos-with-nc這個鏡像了。他們進入容器時,就能直接用nc命令了。


六、總結(簡版操作)


[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

[ ] ?容器的管理:查看,進入,stop, start, restart, kill, 刪除

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

? ?進入: docker attach $container

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

[ ] 怎么發布自己的一個 Docker Image ?

? ? 下次再說

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容