圖表君聊Docker-Container

上篇文章咱們介紹了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 attachdocker exec有什麼區別呢?

docker attach 讓用戶能夠進入Container查看輸出等等操做,可是並不會另外啓動一個進程! 若是你用CTRL-c來退出,同時這個信號會kill Container(默認狀況)

docker exec 會啓動另一個進程來進入Container,這裏的操做是在這個進程下的。若是你用CTRL-c來退出,不會kill 原來的Container

好了,對於Container今天就聊到這裏,下片文章咱們繼續聊最後一個概念,Docker倉庫。


歡迎訂閱個人公衆號,第一時間獲取圖表君的新文章。

圖片描述

相關文章
相關標籤/搜索