寫給前端工程師看的Docker教程-基礎篇

深紅發表於2019-09-29

相關文章

最近公司在推進容器化和k8s,專案都要改成Docker部署。負責的工程裡有幾個node專案,只能從零開始學習Docker了。

安裝

Docker支援window, Mac, Linux, 教程參考Docker安裝教程

建議在Mac和Linux系統裡使用Docker。

平時開發,我使用的是vscode編輯器,可以順便安裝docker外掛。在外掛商店搜尋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
複製程式碼

基本概念

  1. 映象(Image):類似於虛擬機器中的映象。映象有兩種:基礎映象和個人映象。基礎映象由各大廠商提供,比如ubuntu映象,node映象。個人映象則是由個人開發者構建上傳。
  2. 容器(Container):類似於一個輕量級的沙盒。容器是基於映象來建立的,ubuntu映象並不能和我們進行各種互動,我們希望有個環境能執行ubuntu,於是基於ubuntu映象建立了一個容器。
  3. 倉庫(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
複製程式碼

參考

相關文章