課程目標
[ ] ?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)歷史的就讓它成為歷史,不要碰了。
? ?(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不必設置。
設置完后,你執行搜索一下 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 ?
? ? 下次再說