安裝
Linux系統下安裝
wget -qO- https://get.docker.com/ | sh
如果需要使用非root
使用者管理docker(最佳實踐),需要新增使用者到docker
組:
sudo usermod -aG docker your-user
# 檢視使用者組:
# cat /etc/group | grep docker
新增後注意先登出再登入。
- 檢視版本資訊:
docker --version
- 升級Docker引擎(Ubuntu系統下操作)
# 1.停止Docker daemon,更新安裝包列表 apt-get update # 2. 解除安裝Docker(docker可能有不同的名稱,儘量列出可能的名稱) apt-get remove docker docker-engine docker-ce docker.io -y # 3. 安裝新的版本 wget -qO- https://get.docker.com/ | sh # 4. 設定開機自啟 systemctl enable docker # 5. 檢查Docker狀態 systemctl is-enabled docker # 6. 確保容器和服務已經重啟 docker container ls docker service ls
- Docker和儲存驅動
Linux系統下的Docker儲存驅動有以下四種:• aufs (the original and oldest) • overlay2 (probably the best choice for the future) • devicemapper • btrfs • zfs # 備註:windows下只支援 windowsfilter 驅動
一個Docker主機只能有一種儲存驅動(不能每個容器一種驅動),可以通過
docker info
檢視當前儲存驅動。Windows10下安裝
設定>程式和功能>啟用或關閉Windows功能
視窗中開啟Containers
,Hyper-V
- 到 https://docs.docker.com/docker-for-windows... 下載Docker For Windows進行安裝
- 注意到安裝完之後會讓你選擇原生Windows容器還是Linux容器,即容器的執行主機環境,一般選Linux容器(可自由切換)。在Windows下執行Linux容器,是通過
Hyper-V
虛擬技術來實現的。(目前還沒有原生Mac容器) - Docker for Windows 包含了: Docker Engine (client 和 daemon),Docker
Compose,Docker Machine 和 the Docker Notary command line
映象(Image)
將映象類比於程式語言中的類,那麼容器就相當於類的例項。
- 映象的基本操作
- 拉取:
docker image pull <repository>/<name>:<tag>
,預設為映象的latest
tag, 加-a
選項將會拉取映象的所有tags。對於官方映象,不用宣告repository
- 檢視:
docker image ls
,加--digests
輸出摘要資訊,加--filter
過濾輸出結果 - 輸出詳細資訊:
docker image inspect xxx
- 刪除:
docker image rm xxx
- 刪除所有:
docker image rm $(docker image ls -q) -f
,其中image ls -q
返回所有映象ID - 搜尋:
docker search xxx
- 拉取:
- 映象由一組鬆散的只讀層(layer)組成,上層可以覆蓋下層,多個映象可以共享一個層
- 多架構映象(Multi-architecture images):一個映象可能需要支援多種架構,比如:Windows,ARM,這時就可以使用多架構映象( manifest list中記錄支援的架構資訊)。
容器
容器是映象的執行時例項。
- Docker版本資訊:
docker version
,如果使用者賬號沒有許可權,記得將其新增到Docker組 - 檢查Docker狀態:
service docker status
或者systemctl is-active docker
- 容器基本操作
- 開啟一個容器:
docker container run
-it
:表示把當前的終端連線到容器的shell,例如:docker container run -it ubuntu /bin/bash
,將啟動一個Ubuntu容器,然後執行它的Bash Shell。Window容器例子:docker container run -it microsoft/powershell:nanoserver pwsh.exe
- 啟動並連線到bash後,可以
ps -elf
檢視程式詳情。輸入exit
退出bash,容器執行時不能沒有程式,如果這時容器沒有程式,將會自動退出 - 按
Ctrl+PQ
鍵退出bash而不會終止容器。 --name
:設定容器名稱,如果沒有指定,會自動生成一個
- 檢視:
docker container ls
,加-a
同時輸出所有的容器 - 按
Ctrl+PQ
鍵退出後重新回到容器的bash:docker container exec -it 3027eb644874 bash
,其中容器ID值可以先通過docker container ls
得到 - 停止:
docker container stop xxx
- 重啟:
docker container start xxx
- 刪除:
docker container rm xxx
- 開啟一個容器:
- 優雅地刪除容器:先停止再刪除
- 容器重啟策略
always
總是重啟停止了的容器,除非顯式地停止容器(比如通過docker container stop
),例子:docker container run --name neversaydie -it --restart always alpine sh
unless-stopped
顯式地停止後,重啟Docker服務不會再重啟on-failed
當容器以非0退出碼退出,或者Docker服務重啟
- 在 Docker Compose 或 Docker Stacks中指定重啟策略,例子:
version: "3" services: myservice: <Snip> restart_policy: condition: always | unless-stopped | on-failure
- Web server 例子
- 執行
docker container run -d --name webserver -p 80:8080 nigelpoulton/pluralsight-docker-ci
-d
表示後臺執行,前臺執行(進入容器互動環境)使用-it
-p 80:8080
將宿主機80埠對映到容器的8080埠
- 然後瀏覽器訪問宿主機IP或者curl ip即可開啟網頁
- 檢視映象詳情:
docker image inspect nigelpoulton/pluralsight-docker-ci
- 執行
- 清理所有容器:
docker container rm $(docker container ls -aq) -f
容器化應用
容器化一個單容器應用
- 下載應用程式碼:
git clone https://github.com/nigelpoulton/psweb.git
- 檢視其中的Dockerfile檔案,程式碼及註釋如下:
# All Dockerfiles start with the FROM instruction. This will be the base layer of the image FROM alpine # 後設資料,不構成Layer LABEL maintainer="nigelpoulton@hotmail.com" # Alpine apk package manager to install nodejs and nodejs-npm into the image. RUN apk add --update nodejs nodejs-npm # copies in the app files from the build context COPY . /src # 後設資料,不構成Layer WORKDIR /src RUN npm install # exposes a web service on TCP port 8080 # 後設資料,不構成Layer EXPOSE 8080 # set the main application that the image(container) should run ENTRYPOINT ["node", "./app.js"]
以上程式碼可以生成的映象示意圖:
- 構建映象:
docker image build -t web:latest .
(最後的(.)號表示構建上下文為當前目錄) - 檢視:
docker image ls
- 推送到Docker Hub
- 登入:
docker login
(需先註冊賬號) - 給映象打標籤:
docker image tag web:latest nigelpoulton/web:latest
,後面的引數形式為:<current-tag> <new-tag>
- 推送:
docker image push nigelpoulton/web:latest
- 登入:
- 執行應用:
docker container run -d --name c1 \ -p 80:8080 \ web:latest
- 檢視應用:
docker container ls
- 測試應用:訪問對應的地址
- 檢視映象的構建歷史:
docker image history web:latest
使用多階段構建部署到生產環境
將構建過程分成多個映象,後面的映象可以從前面的映象中拷貝必要的檔案,避免映象體積過大。
-
參考資料
-
構建映象:
docker image build
-t
:新增標籤-f
:指定Dockfile檔案--no-cache=true
不使用快取--squash
壓成一個layer,減少映象體積apt-get install
新增no-install-recommends
-
FROM
為新的映象指定基礎映象 -
COPY
複製程式原始碼到映象 -
EXPOSE
指定應用的網路埠 -
ENTRYPOINT
映象啟動時,預設要執行的程式
Compose
Compose 用於單引擎模式(單個節點)下部署和管理多容器應用。
- Linux系統下安裝:參考https://github.com/docker/compose/releases
- 檢視版本:
docker-compose --version
- 使用yaml格式配置檔案,預設檔名為
docker-compose.yml
,-f
可以指定自定義檔案 - 配置檔案例子
# 版本,參考:https://docs.docker.com/compose/compose-file/compose-versioning/ version: "3.5" # 服務,以下配置包含服務(容器):web-fe,redis services: web-fe: # 使用當前目錄的Dockerfile構建映象 build: . # 容器啟動時執行(這句可省略,因為Dockerfile已經定義) command: python app.py # 將容器裡面的5000埠對映到宿主主機5000埠 ports: - target: 5000 published: 5000 # 指明新增到哪個網路 networks: - counter-net # 將卷counter-vol掛載到容器的/code目錄 volumes: - type: volume source: counter-vol target: /code redis: # 從 redis:alpine 構建映象 image: "redis:alpine" networks: counter-net: # 網路 networks: counter-net: # 卷 volumes: counter-vol:
以上配置可分為四個部分: version、services、networks、volumes
- 使用Compose進行部署
- 下載程式碼:git clone https://github.com/nigelpoulton/counter-ap...
- 切換到counter-app目錄,啟動應用:
docker-compose up &
(加&
輸出日誌)- Compose 配置檔案預設名稱為
dockercompose.yml
或docker-compose.yaml
- 如果不是這兩個名稱,可以
-f
指定 -d
後臺執行
- Compose 配置檔案預設名稱為
- 使用Compose管理容器
- 檢視服務(容器)
docker-compose ps
- 列出每個服務的程式:
docker-compose top
- 停止應用:
docker-compose stop
- 停止並刪除:
docker-compose down
- 重啟:
docker-compose restart
- 刪除:
docker-compose rm
- 檢視服務(容器)