《Docker Deep Dive》閱讀筆記(一)

tsin發表於2019-09-17

安裝

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功能視窗中開啟ContainersHyper-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)組成,上層可以覆蓋下層,多個映象可以共享一個層

Docker deep dive

  • 多架構映象(Multi-architecture images):一個映象可能需要支援多種架構,比如:Windows,ARM,這時就可以使用多架構映象( manifest list中記錄支援的架構資訊)。

容器

容器是映象的執行時例項。

Docker deep dive

  • 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 deep dive

  • 構建映象: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

使用多階段構建部署到生產環境

將構建過程分成多個映象,後面的映象可以從前面的映象中拷貝必要的檔案,避免映象體積過大。

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.ymldocker-compose.yaml
      • 如果不是這兩個名稱,可以-f指定
      • -d後臺執行
  • 使用Compose管理容器
    • 檢視服務(容器) docker-compose ps
    • 列出每個服務的程式:docker-compose top
    • 停止應用:docker-compose stop
    • 停止並刪除:docker-compose down
    • 重啟:docker-compose restart
    • 刪除:docker-compose rm

Was mich nicht umbringt, macht mich stärker

相關文章