- Dockerfile
Dockerfile其實就是根據特定的語法格式撰寫出來的一個普通的文本文件
利用docker build
命令依次執行在Dockerfile中定義的一系列命令,最終生成一個新的鏡像(定製鏡像
)
根據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
- 官方Dockerfile
查看鏡像歷史構建信息(以從官方拉取的redis爲例)
docker history redis
在github官方Dockerfile中找到redis進入,找到latest版,點擊進入即可查看Dockerfile內容,與history內容一致
- Dockerfile 常用命令
- FROM: 指定基礎鏡像,如果基礎鏡像在本地不存在會執行pull操作
- RUN: 構建鏡像過程中需要執行的命令。可以有多條。docker build的時候執行
如果包含多條命令,必須要要使用json的格式,如[“executable”, “param1”, “param2”]
執行一條命令是用的shell 方式執行(子進程運行,先前設置的環境變量可以訪問)
執行多條命令是用的exec方式執行(主進程運行,先前設置的環境變量無法訪問) - CMD:添加啓動容器時需要執行的命令。多條只有最後一條生效。可以在啓動容器時被覆蓋和修改。(3種寫法)
- ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。(2種寫法)
- LABEL:爲鏡像添加對應的數據。在docker inspect IMAGE 中 .ContainerConfig.Labels 查看
- MAINTAINER:表明鏡像的作者。將被遺棄,被LABEL代替。
- EXPOSE:設置對外暴露的端口。在docker inspect IMAGE 中 .Config.ExposedPorts 查看
- ENV:設置執行命令時的環境變量,並且在構建完成後,仍然生效
- ARG:設置只在構建過程中使用的環境變量,構建完成後,將消失
- ADD:將本地文件或目錄拷貝到鏡像的文件系統中。能解壓特定格式文件,能將URL作爲要拷貝的文件
- COPY:將本地文件或目錄拷貝到鏡像的文件系統中。
- VOLUME:添加數據卷
- USER:指定以哪個用戶的名義執行RUN, CMD 和ENTRYPOINT等命令
- WORKDIR:設置工作目錄
- ONBUILD:如果製作的鏡像被另一個Dockerfile使用,將在那裏被執行Docekrfile命令
- STOPSIGNAL:設置容器退出時發出的關閉信號。(kill -l查看所有信號)
- HEALTHCHECK:設置容器狀態檢查。
- 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 有多個版本,基本是向後兼容的,但也有極個別配置項高版本中沒有
- 在docker-compose.yml一開始就需要利用version關鍵詞標明當前file使用的版本
- Docker Compose File 頂級配置項:
version:指定Docker Compose File版本號
services:定義多個服務並配置啓動參數
volumes:聲明或創建在多個服務中共同使用的數據卷對象
networks:定義在多個服務中共同使用的網絡對象
configs:聲明將在本服務中要使用的一些配置文件
secrets:聲明將在本服務中要使用的一些祕鑰、密碼文件
x-***:自定義配置。主要用於複用相同的配置。
更多詳細配置
- Docker Compose 案例一:小型Flask web服務項目搭建
步驟:
-
根據項目環境,利用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
-
撰寫docker-compose.yaml配置文件,啓動項目
docker-compose.ymlversion: "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"
說明:
- 縮進要統一(要麼2個空格,要麼4個空格)
- 內容放在同一行的冒號: 後面要接空格(volumes下面指定的是掛載點,冒號:後面不能有空格)
- 如果不指定volumes,重啓服務以後會使用新的數據卷,前面的數據將無法複用,因此要指定volumes保證服務重啓以後數據一致性。
啓動:docker-compose up -d (首次啓動會進行構建鏡像比較耗時)
關閉:docker-compose down
-
- Docker Compose 案例二 單機環境ELK系統搭建
-
拉取Elasticsearch / Logstash / Kibana 鏡像(國外比較慢)
-
配置參數:sysctl -w vm.max_map_count=262144(加入到/etc/rc.local 開機自動配置)
-
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:
-
啓動Elasticsearch:docker-compose up
檢查是否啓動成功:docker ps -a(如果啓動失敗使用docker logs -f
查看是否有報錯日誌)
-
- Docker Compose 案例三 多主機環境ELK系統搭建
- Swarm 介紹:
- 集羣版Docker Compose工作原理
- 搭建步驟
- 使用docker swarm配置多個docker node集羣節點、
主節點:docker swarm init
從節點執行上面紅框部分語句即可 - 配置集羣版ELK的docker-compose.yaml文件
注意:版本3+;加入deploy;刪除無效配置;bootstrap.memory_lock=falseversion: '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"
- 利用
docker stack deploy -c docker-compose.yml elk
部署集羣版ELK環境
查看所有服務:docker service ls
查看特定服務日誌:docker service logs elk_elasticsearch -f
刪除先前部署的ELK環境:docker stack rm elk
- Swarm 介紹: