相關文章
- 寫給前端工程師看的Docker教程-基礎篇
- 寫給前端工程師看的Docker教程-中級篇
- 寫給前端工程師看的Docker教程-實戰篇
最近公司在推進容器化和k8s,專案都要改成Docker部署。負責的工程裡有幾個node專案,只能從零開始學習Docker了。
安裝
Docker支援window, Mac, Linux, 教程參考Docker安裝教程。
建議在Mac和Linux系統裡使用Docker。
平時開發,我使用的是vscode編輯器,可以順便安裝docker外掛。在外掛商店搜尋docker
,安裝完成後,我們可以很方便的管理Docker映象和容器。
快速使用
首先我們來體驗一下Docker。
平時工作中,如果我們電腦的開發環境是Windows, 有一天希望在Linux環境做一些事情,那該怎麼辦?(沒有云伺服器的前提下)大多數人這時會選擇去用虛擬機器安裝一個ubuntu系統。不過安裝虛擬機器前,你得先去下載幾個G的映象,然後在VMware裡配置一些引數,最後還要等待最少十幾分鐘的系統安裝。等你安裝完一個ubuntu系統,估計已經浪費了幾個小時。
然而使用Docker,你只需要幾分鐘!
# 拉取ubuntu映象
docker pull ubuntu
# 建立一個ubuntu容器並且使用終端進行互動
docker run -it --name my-ubuntu --rm ubuntu /bin/bash
複製程式碼
建立成功後,你就進入一個ubuntu系統裡,現在你可以在其中進行任意的操作了。
注意:雖然當前容器裡是ubuntu系統,但是你只能把它想象成一個精簡版的ubuntu,因此有很多常用命令,需要自己去安裝。
curl -v bilibili.com
複製程式碼
直接執行curl
命令會提示命令不存在
# 安裝curl
apt-get update
apt-get install -y curl
複製程式碼
安裝完成後,才能使用curl
命令
退出容器
exit
複製程式碼
基本概念
- 映象(Image):類似於虛擬機器中的映象。映象有兩種:基礎映象和個人映象。基礎映象由各大廠商提供,比如
ubuntu
映象,node
映象。個人映象則是由個人開發者構建上傳。 - 容器(Container):類似於一個輕量級的沙盒。容器是基於映象來建立的,
ubuntu
映象並不能和我們進行各種互動,我們希望有個環境能執行ubuntu
,於是基於ubuntu
映象建立了一個容器。 - 倉庫(Repository):類似於程式碼倉庫,這裡是映象倉庫,是Docker用來集中存放映象檔案的地方。
我們可以這樣類比:
# 下載原始碼
git clone deepred5/app
# 啟動app
npm run start
複製程式碼
# 拉取映象
docker pull deepred5/app
# 建立容器
docker run deepred5/app
複製程式碼
Docker是基於c/s架構:我們在Client中執行Docker命令,最後建立的Container和Image則會在Server中執行
# 可以檢視server和client資訊
docker info
複製程式碼
映象(Image)
常用命令
# 查詢映象
docker search ubuntu
# 拉取特定tag版本的映象(預設是latest)
docker pull ubuntu:18.0.4
# 檢視下載的所有本地映象
docker images
# 刪除映象
docker rmi ubuntu:18.0.4
複製程式碼
構建映象
我們一般都是基於基礎映象來構建個人映象。映象是由一條條指令構建出來(Dockerfile)
我們來構建一個node-pm2
映象,這個映象自帶node和pm2:
建立一個node-pm2
目錄,並新建一個Dockerfile
檔案
mkdir node-pm2
cd node-pm2
touch Dockerfile
複製程式碼
編輯Dockerfile
# 基於node11基礎映象
FROM node:11
# 一些後設資料,比如作者資訊
LABEL maintainer="deepred5 <deepred5@gamil.com>"
# 安裝pm2
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org
# 暴露容器的埠
EXPOSE 80 443
複製程式碼
基於這個Dockerfile
建立我們自己的映象deepred5/node-pm2
docker build -t deepred5/node-pm2:1.0 .
複製程式碼
注意最後有一個.
檢視我們自己的映象
# 可以看到deepred5/node-pm2映象了
docker images
複製程式碼
基於deepred5/node-pm2
映象啟動一個容器
docker run -it deepred5/node-pm2:1.0 /bin/bash
複製程式碼
進入容器後,我們執行pm2 -v
,可以看見pm2已經安裝成功了
上傳映象
我們本地構建的映象如果希望可以被其他人使用,就需要把映象上傳到倉庫。登入dockerhub,註冊一個賬戶。
# 登入賬戶,輸入使用者名稱和密碼
docker login
# 上傳映象
docker push deepred5/node-pm2:1.0
複製程式碼
注意:deepred5/node-pm2
改成你的使用者名稱/node-pm2
,你需要重新構建一個你的使用者名稱/node-pm2
的映象,然後才能上傳到dockerhub
容器(Container)
我們平時基本都是在和容器打交道。
# 基於ubuntu映象建立my-ubuntu容器。如果本地沒有ubuntu映象,會先去docker pull下載
docker run -it ubuntu:latest --name my-ubuntu /bin/bash
複製程式碼
引數解釋:
-i
: 允許你對容器內的標準輸入 (STDIN) 進行互動
-t
: 在新容器內指定一個偽終端或終端。
--name
: 容器的名字,預設是隨機的名字
/bin/bash
: 啟動容器後立即執行的命令
# 停止容器
docker stop my-ubuntu
# 啟動容器
docker start my-ubuntu
# 刪除容器
docker rm my-ubuntu
# 刪除所有容器
docker rm `docker ps -aq`
複製程式碼
# 檢視正在執行的容器
docker ps
# 檢視所有建立過的容器(執行或者關閉)
docker ps -a
複製程式碼
docker start my-ubuntu
啟動的容器,雖然容器執行著,但是我們無法進入到容器裡。
如何再次進入到容器裡?
docker exec -it my-ubuntu /bin/bash
複製程式碼
容器執行的兩種方式
- 互動式執行(-it)
- 守護式執行(沒有互動式會話,長期執行,適合執行應用程式和服務)(-d)
可以這樣類比:
node index.js
: 互動式執行
pm2 start index.js
: 守護式執行
大部分情況都是執行守護式容器(daemonized container)
# 啟動了容器,然後容器立即關閉
docker run ubuntu /bin/bash
# 啟動了容器,並開啟了互動式的終端,只有輸入exit才退出終端,退出終端後,容器仍然在後臺執行
docker run -it ubuntu /bin/bash
# 啟動了容器,並且在後臺一直執行,每隔1s輸出hello world
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
複製程式碼
檢視容器日誌
docker run -d --name my_container ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
複製程式碼
# 檢視後臺執行的日誌
docker logs my_container
# 實時監控(類似tail -f)
docker logs -f my_container
# 獲取最後10行
docker logs --tail 10 my_container
# 實時檢視最近的日誌
docker logs --tail 0 -f my_container
# 加上時間戳
docker logs -t my_container
複製程式碼