相關文章html
最近公司在推動容器化和k8s,項目都要改爲Docker部署。負責的工程裏有幾個node項目,只能從零開始學習Docker了。前端
Docker支持window, Mac, Linux, 教程參考Docker安裝教程。node
建議在Mac和Linux系統裏使用Docker。git
平時開發,我使用的是vscode編輯器,能夠順便安裝docker插件。在插件商店搜索docker
,安裝完成後,咱們能夠很方便的管理Docker鏡像和容器。docker
首先咱們來體驗一下Docker。npm
平時工做中,若是咱們電腦的開發環境是Windows, 有一天但願在Linux環境作一些事情,那該怎麼辦?(沒有云服務器的前提下)大多數人這時會選擇去用虛擬機安裝一個ubuntu系統。不過安裝虛擬機前,你得先去下載幾個G的鏡像,而後在VMware裏配置一些參數,最後還要等待最少十幾分鐘的系統安裝。等你安裝完一個ubuntu系統,估計已經浪費了幾個小時。ubuntu
然而使用Docker,你只須要幾分鐘!bash
# 拉取ubuntu鏡像 docker pull ubuntu # 建立一個ubuntu容器而且使用終端進行交互 docker run -it --name my-ubuntu --rm ubuntu /bin/bash 複製代碼
建立成功後,你就進入一個ubuntu系統裏,如今你能夠在其中進行任意的操做了。服務器
注意:雖然當前容器裏是ubuntu系統,可是你只能把它想象成一個精簡版的ubuntu,所以有不少經常使用命令,須要本身去安裝。markdown
curl -v bilibili.com
複製代碼
直接運行curl
命令會提示命令不存在
# 安裝curl apt-get update apt-get install -y curl 複製代碼
安裝完成後,才能使用curl
命令
退出容器
exit 複製代碼
ubuntu
鏡像,node
鏡像。我的鏡像則是由我的開發者構建上傳。ubuntu
鏡像並不能和咱們進行各類交互,咱們但願有個環境能運行ubuntu
,因而基於ubuntu
鏡像建立了一個容器。咱們能夠這樣類比:
# 下載源代碼 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 複製代碼
經常使用命令
# 查找鏡像 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
咱們平時基本都是在和容器打交道。
# 基於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 複製代碼
容器運行的兩種方式
能夠這樣類比:
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 複製代碼