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 | $ docker pull ubuntu |
列出 Local 端的映像檔
一般在操作 Docker 的時候,會先確定本地端有哪些映像檔
1 | $ docker images |
啟動(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 | $ docker rm <NAMES> |
假設我想刪除 funny_ptolemy
那麼,就輸入 docker rm funny_ptolemy
執行結果如下:
倉庫
顧名思義就是集中擺放 images 的地方。倉庫也分為 Public 和 Private 形式,公開的倉庫是 Docker Hub,裡頭放了許多映像檔讓使用者下載。這個有點像是 git 觀念一樣,也是一種託管服務。也就是說當使用者建立好自己的映像檔之後,就可以使用 push 命令上傳到倉庫,之後在另一台機器就可以使用映像檔使用 pull 命令下載下來。
所以,映像管理系統就是提供類似程式庫刑事的映像存取和管理方式,如果是用遠端的方式要求登入與授權操作的話,需要透過 docker login 登入指定的倉庫伺服器
1 | $ docker login -u <username> -p <password> <server> |
如果不加上
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