1,198 瀏覽數

CoreOS – Docker

CoreOS 的安裝與設定請參考 http://benjr.tw/96511

Continaer 與 Docker

Docker 是 CoreOS 主要的一項功能,而 Docker 是用來管理 Container 的.而 Fleet 是用來管理 Docker 的.感覺很困惑!!

Container -> Docker -> Fleet

先來看看什麼是 Container ,他是輕量級的虛擬化軟體,透過資源共享的方式,可以快速建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,透過 Docker 的基本三元素. 容器 (Container) , 映像檔 (Image) , 倉庫 (Repository) .讓我們更方便管理 Container 的環境,但是要能做到 方便大量,分散式的 部署與管理,這時候就要透過 Fleet 來協助.

Container

Container 提供類似於作業系統層級的虛擬化 OS-Level Virtualization ,先來看看之前所謂的 作業系統層級的虛擬化 .
hosted_vm
作業系統層級的虛擬化是透過 VMM (Virtual Machine Monitor,也可以稱作 Hybervisor) 建立一個虛擬化的環境給虛擬機的作業系統來使用,幾乎所有的作業系統我們都可以透過這樣的方式模擬出來,但相對的是效能差以及消耗過多的系統資源.

所以 Container 採用與 KVM 一樣的做法 (Linux 核心加入 KVM 再讓這 Linux 核心當作 VMM ,在 KVM 下的 Guest OS 對於 Linux 核心而言都只是一個 Process 行程). Container 採用類似的方式在原作業系統中透過資源共享的方式,建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,這邊不再稱它為虛擬機器 Virtual Machine 而是叫做 Container.
lxc01
從 Linux 核心 2.6.24 之後的版本內建了 Control Group 和 Namespaces 機制,這些機制讓 Container 可以分配 Host OS 的資源給 Containers.這種做法跟 chroot 類似.但 Container 多了 IP address, a separate process domain, user ids 以及 dedicated access to the host’s physical resources (i.e. memory, CPU) .

Docker

我們先來了解一下關於 Docker 基本的三個觀念. 容器 (Container) , 映像檔 (Image) , 倉庫 (Repository) .

  • 容器 (Container)
    在原作業系統中透過資源共享的方式,建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,聽起來很像是虛擬機器 Virtual Machine 但方式不一樣,名稱也不太一樣,這樣的方式叫做 Container.
  • 映像檔 (Image)
    Container 是一個容器,我們需要將作業環境放到這一個容器,最快的方式就是透過網路下載別人已經做好的作業環境 (唯讀映像檔) 來使用,當然也是可以自己建立.因為這是一個唯讀的映像檔,所以容器啟動的時候還會提供資料可以寫入的一層地方.
  • 倉庫 (Repository)
    倉庫是用來存放映像檔的地方,預設會到 Docker Hub https://hub.docker.com 這個倉庫來找.

那 Docker 是什麼? Docker 與 Container 的關聯是? 如下圖所示.
docker01

使用 Docker 用來管理 Container 可以讓 Container 的環境更為完善.

下面的例子是透過 Docker 去管理一個 Nginx (音同 Engine X ,Web ,HTTP 伺服器) 的 Container.透過 docker 指令我們可以找到關於 Nginx 的 image.

core@coreos1 ~ $ docker search Nginx
NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                     Official build of Nginx.                        5140      [OK]     

因為 Docker 在我的系統找不到 nginx 這個 image 所以會下載倉庫 (Repository)的映像檔 (Image)來產生 容器 (Container).

core@coreos1 ~ $ docker run -it --name nginx-web -p 80:80 nginx /bin/bash
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5040bd298390: Pull complete 
333547110842: Pull complete 
4df1e44d2a7a: Pull complete 
Digest: sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645
Status: Downloaded newer image for nginx:latest
root@21ed136a6643:/# exit
exit
core@coreos1 ~ $

-t : 將 Container 的輸出轉向到 虛擬終端(pseudo-tty),也就是我們在系統上終端機看到的.
-i : 透過系統的鍵盤將資料輸入到 Container 裡面.
-p : 這邊可以指定 container 的埠 port 直接對應到 host 的哪一個埠

剛剛的 Container 會執行 /bin/bash 並等待有使用者結束這個指令 exit 之後就會關閉,不過下次我們一樣可以用手動的方式將它打開並登入進去看看.

這邊先來討論一下 Container 的生命週期,執行 docker run/create 時會透過 映像檔 (Image) 產生新的 Container ,執行完畢的 Container 就會被關閉.

加入 -d 可以讓 container 可以在背景執行.
-d Run container in background and print container ID

core@coreos1 ~ $ docker run -it --name nginx-web -p 80:80 -d nginx       
a877befa2dcae44b38089ca6eee16346f1d14a7f64a5ea638778cb3c26ce2873

Nginx 服務已經啟動,可以透過 curl 文字版的瀏覽器看一下.

core@coreos1 ~ $ curl 172.17.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

想要登入 Nginx Container 可以透過 exec 傳送指令 bash 給 Container.
-exec Run a command in a running container

core@coreos1 ~ $ docker exec -ti nginx-web1 bash                           
root@21ed136a6643:/#

那要如何看我系統目前有哪一些 映像檔 (Image) 與 容器 (Container)呢!
images – List images ,查看系統有那一些 映像檔 (Image)

core@coreos1 ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              cc1b61406712        7 hours ago         181.8 MB

ps – List containers ,一個映像檔 (Image) 可以產生多個 容器 (Container),這邊可以檢查產生幾個容器 (Container)了.注意狀態是已退出.

core@coreos1 ~ $ docker ps -a
CONTAINER ID  IMAGE  COMMAND       CREATED         STATUS                     PORTS     NAMES
49f0df93b625  nginx  "/bin/bash"   40 seconds ago  Exited (0) 34 seconds ago            nginx-web

其他 Docker 相關參數

  • run – Run a command in a new containerr
  • rm – Remove one or more containers
  • pull – Pull an image or a repository from a registry
  • rmi – Remove one or more images

已經建立好的 Containers 可以透過下面幾個指令來啟動.

  • start – Start one or more stopped containers
  • stop – Stop one or more running containers
  • kill – Kill one or more running containers
  • stats – Display a live stream of container(s) resource usage statistics
  • attach – Attach to a running container
core@coreos1 ~ $ docker start nginx-web
nginx-web
core@coreos1 ~ $ docker ps -a
CONTAINER ID   IMAGE   COMMAND        CREATED             STATUS              PORTS               NAMES
49f0df93b625   nginx   "/bin/bash"    4 minutes ago       Up About a minute   80/tcp, 443/tcp     nginx-web
core@coreos1 ~ $ docker stats nginx-web
CONTAINER    CPU %    MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O     PIDS
nginx-web    0.00%    628 KiB / 996.9 MiB   0.06%     648 B / 816 B    0 B / 0 B     1

Container 已經執行 /bin/bash 並等待使用者登入,可以透過 attch

core@coreos1 ~ $ docker attach nginx-web
root@49f0df93b625:/# exit
exit
core@coreos1 ~ $ docker ps -a
CONTAINER ID     IMAGE     COMMAND        CREATED             STATUS                     PORT      NAMES
49f0df93b625     nginx     "/bin/bash"    13 minutes ago      Exited (0) 3 seconds ago            nginx-web

3 Replies to “CoreOS – Docker”

  1. 自動參照通知: CoreOS – Flannel – Benjr.tw

  2. 自動參照通知: CoreOS – Fleet – Benjr.tw

  3. 自動參照通知: CoreOS 設定檔 – Benjr.tw

發表迴響