Docker進階

  • Dockerfile
    Dockerfile其實就是根據特定的語法格式撰寫出來的一個普通的文本文件
    利用docker build命令依次執行在Dockerfile中定義的一系列命令,最終生成一個新的鏡像(定製鏡像
  1. 根據dockerfile構建鏡像:docker build [OPTIONS] PATH | URL | -
    命令參數:
    PATH:Dockerfile所在路徑(文件夾路徑),文件名默認是Dockerfile
    URL:Dockerfile所在URL地址
    OPTIONS:
    -t, --tag list:爲鏡像設置名稱和tag
    -f, --file string:指定Dockerfile的路徑(這是可以使用其他名稱命名Dockerfile)
    特徵:
    1. Dockerfile內容相同構建的鏡像相同,也即IMAGE ID相同;
    2. IMAGE ID是隨機生成的(如果刪除鏡像重新構建生成的ID不會是原來那個);
    3. 構建的第一次會寫入緩存,如果第二次執行相同的Dockerfile內容構建則走緩存;如果Dockerfile內容中間有變動,則變動內容往下的都會被重新執行
    4. 只要Dockerfile內容不一樣構建的鏡像就是不一樣的(IMAGE ID不同)
    5. 基於以上特性:Dockerfile文件的修改儘量在末尾追加(每一次修改在底層都是commit操作)
    6. Dockerfile必須具備一個FROM命令來進行構建
    7. 每一個Dockerfile命令都會構建一層鏡像(本質上是每一層都會啓動一個容器,執行完命令後,將容器進行提交後,產生新的鏡像層)
    8. 通過查看下載下來的鏡像,發現歷史層信息的層ID是missing,其實是因爲原本的層id只存在於構建鏡像的宿主機上,一旦轉移鏡像後,歷史層消息中將只保留最新一層的ID
    在這裏插入圖片描述
  2. 官方Dockerfile
    查看鏡像歷史構建信息(以從官方拉取的redis爲例)
    在這裏插入圖片描述
    docker history redis在這裏插入圖片描述
    在github官方Dockerfile中找到redis進入,找到latest版,點擊進入即可查看Dockerfile內容,與history內容一致
    在這裏插入圖片描述
    在這裏插入圖片描述

  • Dockerfile 常用命令
    1. FROM: 指定基礎鏡像,如果基礎鏡像在本地不存在會執行pull操作
    2. RUN: 構建鏡像過程中需要執行的命令。可以有多條。docker build的時候執行
      如果包含多條命令,必須要要使用json的格式,如[“executable”, “param1”, “param2”]
      執行一條命令是用的shell 方式執行(子進程運行,先前設置的環境變量可以訪問)
      執行多條命令是用的exec方式執行(主進程運行,先前設置的環境變量無法訪問)
    3. CMD:添加啓動容器時需要執行的命令。多條只有最後一條生效。可以在啓動容器時被覆蓋和修改。(3種寫法)
    4. ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。(2種寫法)
    5. LABEL:爲鏡像添加對應的數據。在docker inspect IMAGE 中 .ContainerConfig.Labels 查看
    6. MAINTAINER:表明鏡像的作者。將被遺棄,被LABEL代替。
    7. EXPOSE:設置對外暴露的端口。在docker inspect IMAGE 中 .Config.ExposedPorts 查看
    8. ENV:設置執行命令時的環境變量,並且在構建完成後,仍然生效
    9. ARG:設置只在構建過程中使用的環境變量,構建完成後,將消失
    10. ADD:將本地文件或目錄拷貝到鏡像的文件系統中。能解壓特定格式文件,能將URL作爲要拷貝的文件
    11. COPY:將本地文件或目錄拷貝到鏡像的文件系統中。
    12. VOLUME:添加數據卷
    13. USER:指定以哪個用戶的名義執行RUN, CMD 和ENTRYPOINT等命令
    14. WORKDIR:設置工作目錄
    15. ONBUILD:如果製作的鏡像被另一個Dockerfile使用,將在那裏被執行Docekrfile命令
    16. STOPSIGNAL:設置容器退出時發出的關閉信號。(kill -l查看所有信號)
    17. HEALTHCHECK:設置容器狀態檢查。
    18. SHELL:更改執行shell命令的程序。Linux的默認shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

  • Docker Compose:一個能一次性定義和管理多個Docker容器的工具
    Compose中定義和啓動的每一個容器都相當於一個服務(service)
    Compose中能定義和啓動多個服務,且它們之間通常具有協同關係

    • 管理方式:
      使用YAML文件來配置我們應用程序的服務。
      使用單個命令(docker-compose up),就可以創建並啓動配置文件中配置的所有服務

    • 工作原理:
      在這裏插入圖片描述

    • 安裝方法查看
      Linux下需要單獨安裝:
      第一步:
      sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      第二步:sudo chmod +x /usr/local/bin/docker-compose
      終端中使用docker-compose --version查看安裝的版本
      建議使用 最新版本

    • Docker Compose CLI 官方文檔
      對比後會發現:Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的。最主要的區別就是前者能一次性運行管理多個容器,後者只能一次管理一個。
      Docker Compose File 有多個版本,基本是向後兼容的,但也有極個別配置項高版本中沒有

    1. 在docker-compose.yml一開始就需要利用version關鍵詞標明當前file使用的版本
    2. Docker Compose File 頂級配置項:
      version:指定Docker Compose File版本號
      services:定義多個服務並配置啓動參數
      volumes:聲明或創建在多個服務中共同使用的數據卷對象
      networks:定義在多個服務中共同使用的網絡對象
      configs:聲明將在本服務中要使用的一些配置文件
      secrets:聲明將在本服務中要使用的一些祕鑰、密碼文件
      x-***:自定義配置。主要用於複用相同的配置。
      更多詳細配置
    • Docker Compose 案例一:小型Flask web服務項目搭建
      步驟:
    1. 根據項目環境,利用Dockerfile構建鏡像
      Dockerfile

      # Flask web app v1.0
      # 搭建一個基於Flask的web項目:實現簡單的訪問量統計
      # 第一步:獲取一個鏡像  Python3.6  使用alpine版本,輕量級的Python,節省存儲
      FROM python:alpine3.6
      # 第二步:拷貝項目代碼到鏡像中   使用COPY,因爲他不會做多餘的操作
      COPY ./flask-web-code /code
      # 第三步:安裝項目的依賴模塊
      WORKDIR /code
      RUN pip install -r requirements.txt
      # 第四步:配置項目啓動  CMD參數   python app.py
      CMD ["python", "app.py"]
      

      docker build . -t my-flask-web

    2. 撰寫docker-compose.yaml配置文件,啓動項目
      docker-compose.yml

      version: "3.6"
      services:
        flask-web:
          build: .
          ports: ["5000:5000"]
          container_name: flask-web
          networks:
            - web
        redis:
          image: redis
          container_name: redis
          networks:
            - web
          volumes:
            - web-data:/data
      networks:
        web:
          driver: "bridge"
      volumes:
        web-data:
          driver: "local"
      

      說明:

      1. 縮進要統一(要麼2個空格,要麼4個空格)
      2. 內容放在同一行的冒號: 後面要接空格(volumes下面指定的是掛載點,冒號:後面不能有空格)
      3. 如果不指定volumes,重啓服務以後會使用新的數據卷,前面的數據將無法複用,因此要指定volumes保證服務重啓以後數據一致性。

      啓動:docker-compose up -d (首次啓動會進行構建鏡像比較耗時)
      關閉:docker-compose down


  • Docker Compose 案例二 單機環境ELK系統搭建
    • ELK官方文檔
    • ELK工作原理:
      在這裏插入圖片描述
    • 搭建步驟
      配置單機版的docker-compose.yaml文件(ELK鏡像地址 點擊鏡像最右側小圖標可以查看搭建文檔)
    1. 拉取Elasticsearch / Logstash / Kibana 鏡像(國外比較慢)

    2. 配置參數:sysctl -w vm.max_map_count=262144(加入到/etc/rc.local 開機自動配置)

    3. docker-compose.yml 參照 搭建文檔

      version: '2.2'
      services:
        es01:
          image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
          container_name: es01
          environment:
            - node.name=es01
            - discovery.seed_hosts=es02
            - cluster.initial_master_nodes=es01,es02
            - cluster.name=docker-cluster
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          ulimits:
            memlock:
              soft: -1
              hard: -1
          volumes:
            - esdata01:/usr/share/elasticsearch/data
          ports:
            - 9200:9200
          networks:
            - esnet
        es02:
          image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
          container_name: es02
          environment:
            - node.name=es02
            - discovery.seed_hosts=es01
            - cluster.initial_master_nodes=es01,es02
            - cluster.name=docker-cluster
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          ulimits:
            memlock:
              soft: -1
              hard: -1
          volumes:
            - esdata02:/usr/share/elasticsearch/data
          networks:
            - esnet
        logstash:
          image: docker.elastic.co/logstash/logstash:7.3.0
          environment:
            - "LS_JAVA_OPTS=-Xms256m -Xmx256m"
          container_name: logstash
          networks:
            - esnet
          depends_on:
            - es01
            - es02
        kibana:
          image: docker.elastic.co/kibana/kibana:7.3.0
          container_name: kibana
          ports:
            - "5601:5601"
          depends_on:
            - es01
            - es02
          networks:
            - esnet
      volumes:
        esdata01:
          driver: local
        esdata02:
          driver: local
      networks:
        esnet:
      
    4. 啓動Elasticsearch:docker-compose up
      檢查是否啓動成功:docker ps -a(如果啓動失敗使用docker logs -f 查看是否有報錯日誌)


  • Docker Compose 案例三 多主機環境ELK系統搭建
    • Swarm 介紹:
      在這裏插入圖片描述
    • 集羣版Docker Compose工作原理
      在這裏插入圖片描述
    • 搭建步驟
    1. 使用docker swarm配置多個docker node集羣節點、
      主節點:docker swarm init
      在這裏插入圖片描述
      從節點執行上面紅框部分語句即可
    2. 配置集羣版ELK的docker-compose.yaml文件
      version: '3.6'
      services:
        es01:
          image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
          environment:
            - node.name=es01
            - discovery.seed_hosts=es02
            - cluster.initial_master_nodes=es01,es02
            - cluster.name=docker-cluster
            - bootstrap.memory_lock=false
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          volumes:
            - esdata01:/usr/share/elasticsearch/data
          ports:
            - 9200:9200
          networks:
            - esnet
          deploy:
            placement:
              constraints:
                - node.role == manager
        es02:
          image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
          environment:
            - node.name=es02
            - discovery.seed_hosts=es01
            - cluster.initial_master_nodes=es01,es02
            - cluster.name=docker-cluster
            - bootstrap.memory_lock=false
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          volumes:
            - esdata02:/usr/share/elasticsearch/data
          networks:
            - esnet
          deploy:
            placement:
              constraints:
                - node.role == worker
        logstash:
          image: docker.elastic.co/logstash/logstash:7.3.0
          environment:
            - "LS_JAVA_OPTS=-Xms256m -Xmx256m"
          networks:
            - esnet
          deploy:
            replicas: 2
        logstash2:
          image: docker.elastic.co/logstash/logstash:7.3.0
          environment:
            - "LS_JAVA_OPTS=-Xms256m -Xmx256m"
          networks:
            - esnet
          deploy:
            replicas: 2
        kibana:
          image: docker.elastic.co/kibana/kibana:7.3.0
          ports:
            - "5601:5601"
          networks:
            - esnet
          deploy:
            placement:
              constraints:
                - node.role == manager
      volumes:
        esdata01:
          driver: local
        esdata02:
          driver: local
      
      networks:
        esnet:
          driver: "overlay"
      
      注意:版本3+;加入deploy;刪除無效配置;bootstrap.memory_lock=false
    3. 利用docker stack deploy -c docker-compose.yml elk部署集羣版ELK環境
      查看所有服務:docker service ls
      查看特定服務日誌:docker service logs elk_elasticsearch -f
      刪除先前部署的ELK環境:docker stack rm elk
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章