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

相關文章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
複製代碼

基本概念

  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
複製代碼

參考

相關文章
相關標籤/搜索