相關文章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,所以有不少經常使用命令,須要本身去安裝。前端工程師
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
複製代碼