Docker#1 - 初識 Docker

前言

身為開發者經常要處理各種版本的環境部署。若你遇到每次到一個環境都要重新做安裝感到厭煩,那麼,學習 docker 絕對不會讓你失望,它可以讓我們在不同環境裡進行部署應用程式。Docker 是個輕量級的虛擬化技術,每一個 container 都是獨立的環境,有各自的根目錄、檔案系統、網路環境的等,也就是說某個專案執行 mysql 5.6 版,另一個專案執行 mysql 8.0 版,對於應用程式來說是個獨立的系統上執行,並不會衝突到。

什麼是 Docker

Docker 的基礎是 Linux 容器 (LXC),在作業系統層面上實作虛擬化,直接使用本地端的作業系統資源。要了解 Dokcer 是什麼,就先從他的基本概念學起,其中它包含了三個概念

  • 映像檔 Images
  • 容器 Container
  • 倉庫 Repository

映像檔

這個是 Docker 運行虛擬環境時的基礎,是包含應用程式與相關依賴庫的檔案,映像檔可以用來建立容器,會以唯讀的方式建立容器運行的基礎環境,可以把它當作持久化副本。

映像檔名稱指主要分為三個部分,組好之後每一個映像都會有一個獨立的 Image ID

1
docker/ssh:latest
  • Namespace:命名空間,主要是用來辨識建構的組織或個人名稱
  • Repository:檔案名稱,通常用應用程式或服務名稱
  • Tag:類似 git 的 Tag,通常用 Tag 來區分版本

管理映像的方式有提供簡單的指令就能對映像做建構、管理、查詢的操作。

常見的指令操作

指令 說明 範例
search 搜尋 docker search ubuntu
pull 下載 docker pull ubuntu
images 列表 docker images
run 執行 docker run -it ubuntu /bin/bash
rmi [Image ID] 刪除 docker rmi
build 建立 docker build -t member:1 .
login 登入 docker login
push 上傳 docker push

透過 search 可以先查找現有的映像檔,由於這裡我們沒有指定映像標籤,所以會自動的使用 latest 的預設標籤

1
$ docker search ubuntu

列出的訊息可以看到

  • NAME 映像檔名稱
  • DESCRIPTION 描述
  • STARTS 星星數,越多的話代表越多人使用
  • OFFICIAL 是否為官方的映像檔
  • AUTOMATED 自動化

如果你使用指定比較明確的版本,可以使用 ubuntu:16.04 映像檔來啟動一個容器

1
$ docker run -t -i ubuntu:16.04 /bin/bash

如果後面沒有填上 TAG (是用來標記同一個倉庫不同的映像檔)

抓取 Image

1
2
$ docker pull ubuntu
$ docker pull ubuntu:16.04 # 只會抓 Ubuntu 16.04

列出 Local 端的映像檔

一般在操作 Docker 的時候,會先確定本地端有哪些映像檔

1
2
3
4
$ docker images

-- 如果映像檔比較多還可以使用 * 萬用字元來篩選符合條件
$ docker images ph*

啟動(start) Images 產生 Container

1
$ docker start <hash-id>

暫停(stop) Images 產生 Container

1
$ docker stop <hash-id>

刪除映像

後方直接帶上 images id

1
$ docker rmi 3tjdhdlw0

容器

Container 可以執行 run、 啟動 start、停止 stop、刪除 rm,每一個 container 都是分離的。

建立容器

使用以下命令,就可以建立且運行一個終端交互的 Ubuntu 容器:

1
$ docker run -i -t --name cube ubuntu bash

命令參數解釋:

參數 說明
-i n/a 可以輸入進行交互
-t n/a 終端交互
-name cube 指定容器名稱 cube
ubuntu n/a 指定使用映像檔
bash n/a 指定容器啟用使用的應用

執行之後,就會立刻登入 ubuntu 容器的 bash 裡了。

查看 Container 訊息

一但已有建立 Container 之後,可以使用 ps 指令來查詢 container 資訊,會列出正在執行的容器

1
$ docker ps

但如果想要查詢所有容器的狀態,後面補上 -a

1
$ docker ps -a

執行結果會像下面這樣:

刪除 Container

刪除的方式有兩種

1
2
$ docker rm <NAMES>
$ docker rm <CONTAINER ID>

假設我想刪除 funny_ptolemy 那麼,就輸入 docker rm funny_ptolemy

執行結果如下:

倉庫

顧名思義就是集中擺放 images 的地方。倉庫也分為 Public 和 Private 形式,公開的倉庫是 Docker Hub,裡頭放了許多映像檔讓使用者下載。這個有點像是 git 觀念一樣,也是一種託管服務。也就是說當使用者建立好自己的映像檔之後,就可以使用 push 命令上傳到倉庫,之後在另一台機器就可以使用映像檔使用 pull 命令下載下來。

所以,映像管理系統就是提供類似程式庫刑事的映像存取和管理方式,如果是用遠端的方式要求登入與授權操作的話,需要透過 docker login 登入指定的倉庫伺服器

1
$ docker login -u <username> -p <password> <server>

如果不加上 ,預設就會是使用 docker hub

Public 公開倉庫

全球最大的映像倉庫就是官方提供的 https://hub.docker.com/ ,使用服務前先註冊一個 Docker Hub 帳號

註冊完登入後,就可以看到託管的 Docker Hub 映像,一般是以本地 docker login 到 Docker Hub 中,在使用 docker push 發布到 Hub 上

到右上角搜尋匡輸入 mysql 的話,就可以搜尋您想要的服務

在搜尋結果有顯示官方的 image 以及星星數,找到所需要的映像之後就可以用 docker pull 命令下載了

Private 私有倉庫

除了用 Docker Hub 官方提供的倉庫之外,當然也可以自己建構私有的倉庫 (也有點像 gitlab)。其名稱用了一個映像分發工具 Docker Registry 目的是儲存與分發映像,也提供 HTTP API 模組操作。

建立與執行映像檔倉庫

1
$ docker run -d -p 5000:5000 registry

1
$ docker run -d -p 5000:5000 -v <上傳映像檔的目錄>:/tmp/registry registry

之後就可以對這組 registry 做 push 與 pull