上篇文章咱們介紹了Docker三大概念中的Image,這篇咱們來介紹Container,上篇文章中咱們瞭解到了Image是運行在Container中的,實際上在容器裏跑的指令都是在Container中run的。python
啓動容器的方法通常有兩種:web
基於一個Image從新啓動一個新的容器docker
啓動一個如今已是在Stopped狀態下的容器。
來試着運行下邊的這個命令:flask
docker run ubuntu /bin/echo 'Hello Docker' Hello Docker
有沒有感受和本地執行 echo ‘Hello Docker’ 的速度沒什麼差異?可是其實人家是在一個Container裏運行的啊。想一想以前用VM的狀況,啓動一個instance得2分鐘,所要執行的Job只有幾秒而已。若是一樣的Job放到docker裏跑,那會快多了,太爽快了。ubuntu
因此通常用戶在使用容器的時候都是隨時新建和刪除容器的。瀏覽器
上邊那個例子是咱們用docker 運行了一個輸出語句,下面咱們來看這樣一個例子:bash
docker run -t -i ubuntu /bin/bash root@42099bcd8196:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
這樣進入了一個docker container 並運行ls命令。-t讓docker分配一個僞終端綁定到容器的標準輸入上, -i讓容器的標準輸入一直打開。app
那麼一個容器的啓動到底經歷那些過程呢:webapp
檢查images若是本地不存在就是從遠程倉庫下載。ui
利用鏡像建立並啓動一個容器
分配一個文件系統,並在只讀的鏡像層外層掛接一個寫讀寫層。
從宿主主機配置的網橋接口橋接一個虛擬接口到容器中
分配一個ip地址給容器
運行用戶給定的應用程序
運行完畢,容器被終止。
容器的啓動過程,對於理解容器相當重要,須要深刻的理解。
使用docker ps -al
查看全部的歷史,使用docker start
能夠啓動一個已經終止的容器。
添加 -d
參數能夠後臺運行docker container
docker run -d ubuntu /bin/bash -c "while true; do echo hello docker; sleep 2; done"
這樣咱們就看不到容器的輸出信息了,能夠經過docker logs來查看
docker logs [container ID or NAME]
like this
docker logs 133e58dbdc78 hello docker hello docker hello docker hello docker ...
要中止一個容器也是至關簡單的,docker stop
就能辦到了。同時,對於終止狀態的容器,咱們能夠採用docker start
來啓動。經過docker restart
來重啓這個容器。
docker stop [CONTAINER ID OR NAME]
當咱們使用 -d參數運行了一個Container的時候,有時候咱們須要進入這個容器進行一些操做。例若有這樣的一個狀況,咱們運行了一個app在一個容器裏,咱們想進入容器看看,這個app運行的狀態,查看log。那們如何進入呢?其實有不少種方法,這裏介紹兩種。
第一:
docker attach [CONTAINER ID OR NAME]
$ docker run -d --name topdemo ubuntu /usr/bin/top -b $ docker attach topdemo top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 373572k total, 355560k used, 18012k free, 27872k buffers Swap: 786428k total, 0k used, 786428k free, 221740k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 17200 1116 912 R 0 0.3 0:00.03 top
這裏咱們使用了attach命令進入了容器,看到了top命令的輸出。
回到我剛纔說的那個例子,若是有個Container後臺裏執行的是一個webapp,如何看到logs 或者是輸出呢?接下來具體說說。
docker run -d --name webapp -p 5000:5000 training/webapp
在執行了這個命令後,咱們在後臺run了一個images爲training/webapp的Container(這是一個python的flask app)咱們將本機的5000端口與Container的5000端口(flask的默認端口)進行了mapping。當咱們從Browser訪問的時候,咱們就能訪問到這個app。
當咱們在本地開發的時候,咱們很容易的能夠從console裏看到,這個app的訪問的記錄,同時也能方便的查看log文件。那麼這些在容器裏怎麼進行呢?固然咱們可使用上邊介紹的attach命令。
docker attach webapp
當從瀏覽器訪問這個app的時候,經過attach咱們能夠看到Container裏的輸出。
docker attach webapp 172.17.0.1 - - [04/Oct/2016 04:44:23] "GET / HTTP/1.1" 200 - 172.17.0.1 - - [04/Oct/2016 04:44:24] "GET / HTTP/1.1" 200 -
可是問題來了,若是咱們要看log文件,或者想進入Container,看看其餘的文件狀態,該怎麼辦呢?那麼這時候咱們就會用到 docker exec
了。
docker exec -it webapp /bin/bash root@e0cac87036f0:/opt/webapp# ls Procfile app.py requirements.txt tests.py root@e0cac87036f0:/opt/webapp#
經過docker exec咱們就在這個Container裏又運行了bash,這時候咱們就能作其餘咱們想作的事情了。
那麼docker attach
和 docker exec
有什麼區別呢?
docker attach
讓用戶能夠進入Container查看輸出等等操做,可是並不會另外啓動一個進程! 若是你用CTRL-c
來退出,同時這個信號會kill Container(默認狀況)
docker exec
會啓動另一個進程來進入Container,這裏的操做是在這個進程下的。若是你用CTRL-c
來退出,不會kill 原來的Container
好了,對於Container今天就聊到這裏,下片文章咱們繼續聊最後一個概念,Docker倉庫。
歡迎訂閱個人公衆號,第一時間獲取圖表君的新文章。