CoreOS 的安裝與設定請參考 https://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 ,先來看看之前所謂的 作業系統層級的虛擬化 .
作業系統層級的虛擬化是透過 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.
從 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 的關聯是? 如下圖所示.
使用 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 thoughts on “CoreOS – Docker”