Docker學習筆記之Compose

Docker Compose概述

Compose是一個通過yaml文件來定義、運行、管理Docker容器的工具,負責實現對Docker容器集羣的快速編排。

安裝Compose

在Linux環境安裝Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/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 version 1.26.0, build d4451659
docker-py version: 4.2.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

如果想要卸載Composer,直接將對應文件刪除即可:

sudo rm /usr/local/bin/docker-compose

Compose的使用

Compose 裏涉及到兩個重要概念:serviceproject

service:一個應用容器,實際上可以運行多個相同鏡像的實例;

project:由一組相互關聯的應用容器組成的一個完整業務單元。

由此可知,一個項目由多個服務(應用容器)組成,Compose面向項目進行管理。

Compose 模板文件

Compose 模板文件是使用Compose的核心,默認名稱爲docker-compose.yml,文件格式爲yaml。一個簡單的模板文件如下所示:

version: "3" 

services: 
	webapp: 
		image: examples/web 
		ports: 
			- "80:80" 
		volumes:
        	- "/data"

version:指定模板文件的版本號,當前最新版本爲3.8,詳情可看官網

services:定義應用服務,webapp是自定義的服務名稱,image指定鏡像名稱,ports對容器端口進行映射,volumes指定數據卷掛載。

雖然模板文件裏參數特別多,但是很多都跟Docker裏的參數含義一致,所以理解起來也比較容易,下面以官方的例子來進行講解。

# 指定模板文件版本號
version: "3.8"
services:
 # 自定義的服務名
  redis:
   # 指定服務鏡像
    image: redis:alpine
    # 端口映射,這裏只指定了容器端口,沒有和宿主機端口進行映射
    ports:
      - "6379"
      # 指定服務網絡
    networks:
      - frontend
      # 指定服務部署相關配置,僅用於 Swarm 集羣部署的時候,如果僅運行 docker-compose up 或 docker-compose run 將被忽略。
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints:
          - "node.role==manager"

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
      # 表示該服務依賴於redis服務
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
      # 在容器響應中斷信號之前,允許等待的時間,即等待1m30s後再把容器停掉
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  frontend:
  backend:

volumes:
  db-data:

Compose 實戰

下面我們來搭建一個ElasticSearch+Kibana+Logstash的服務項目來介紹Compose的使用。

創建一個compose-test目錄並進入該目錄:

mkdir compose-test
cd compose-test/

創建Compose 模板文件:

touch docker-compose.yml

編輯該文件:

vi docker-compose.yml

輸入以下內容:

version: '3'
services:
  es01:
    image: elasticsearch:7.7.1
    container_name: es01
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx512m"
    volumes:
      - es-data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - elastic

  kib01:
    image: kibana:7.7.1
    container_name: kib01
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: http://es01:9200
      ELASTICSEARCH_HOSTS: http://es01:9200
    networks:
      - elastic
    depends_on:
      - es01
  
  logstash01:
    image: logstash:7.7.1
    container_name: logstash01   
    networks:
      - elastic
    volumes:
      - logstash01-config:/usr/share/logstash/config
    environment:
      - "xpack.management.enabled=false"
      - "monitoring.enabled=false"
    depends_on:
      - es01
      
volumes:
  es-data01:
    driver: local
  logstash01-config:
    driver: local
    
networks:
  elastic:
    driver: bridge

執行docker-compose -p elk up -d命令,會看到控制檯輸出以下內容:

Creating es01       ... done
Creating logstash01 ... done
Creating kib01      ... done

執行curl localhost:9200,控制檯輸出以下內容則說明elasticsearch已啓動成功:

{
  "name" : "2b9932a79edd",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "TR59-aFHRDWXuz1VCrcr4Q",
  "version" : {
    "number" : "7.7.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

在瀏覽器輸入ip:5601,可以看到Kibana也能正常訪問。

常用命令說明

docker-compose命令的基本使用格式:

docker-compose [-f<arg>...] [options] [COMMAND] [ARGS...]

命令選項

  • -f,--file FILE指定使用的模板文件,默認爲docker-compose.yml,可以多次指定

  • p,--project-name NAME 指定項目名稱,默認使用所在目錄名稱作爲項目名稱

up
啓動容器項目,該命令參數比較多,下面說下常用的:

  • -d 在後臺運行服務。
  • --force-recreate 強制構建容器。
  • --no-crcreate 如果容器已經存在,則不重新創建,不能與--force-recreate同時使用。
  • no-build 不自動構建缺失的服務鏡像。

示例:

docker-compose -p elk up -d

down

停止up命令所啓動的容器,並移除對應網絡。

示例:

docker-compose down

提示:

Removing network compose-test_elastic
WARNING: Network compose-test_elastic not found.

看來停止也要指定項目名,命令改成如下:

docker-compose -p elk down

控制檯輸出以下內容:

Stopping es01       ... done
Stopping kib01      ... done
Stopping logstash01 ... done
Removing es01       ... done
Removing kib01      ... done
Removing logstash01 ... done
Removing network elk_elastic

down命令會先把對應容器服務停掉,隨後刪除,最後再把對應網絡移除。

ps

列出項目中所有容器。

示例:

docker-compose -p elk ps

輸出:

   Name                 Command               State                       Ports                     
----------------------------------------------------------------------------------------------------
es01         /tini -- /usr/local/bin/do ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
kib01        /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5601->5601/tcp                        
logstash01   /usr/local/bin/docker-entr ...   Up      5044/tcp, 9600/tcp               

images

列出Compose文件包含的鏡像。

示例:

docker-compose -p elk images

輸出:

Container     Repository      Tag      Image Id       Size  
------------------------------------------------------------
es01         elasticsearch   7.7.1   830a894845e3   804.3 MB
kib01        kibana          7.7.1   6de54f813b39   1.201 GB
logstash01   logstash        7.7.1   7f059e3dee67   787.9 MB

logs

格式爲:docker-compose logs [options] [SERVICE...]

查看項目容器服務的日誌,默認情況下不同容器日誌顏色不一樣。

示例:

docker-compose -p elk logs --tail 2

輸出:

es01          | "at io.netty.util.internal......",
es01          | "at java.lang......"] }
kib01         | {"type":"log"......}
kib01         | {"type":"log"......}
logstash01    | [2020-06-09T09:02:41,917]......
logstash01    | [2020-06-09T09:02:42,445]......

如果只想看指定服務的日誌,命令如下:

docker-compose -p elk logs --tail 2 kib01

top

查看項目中容器運行的進程。

示例:

# 查看全部容器的進程
docker-compose -p elk top
# 查看指定容器的進程
docker-compose -p elk top kib01

port

查看指定容器對外映射的端口。

示例:

docker-compose -p elk port es01 9200

輸出:

0.0.0.0:9200

rm

移除項目容器,如果指定-v參數,還會同時把對應數據卷刪除,注意,項目中使用的網絡不會移除

格式爲:

Usage: rm [options] [SERVICE...]
Options:
    -f, --force   Don't ask to confirm removal
    -s, --stop    Stop the containers, if required, before removing
    -v            Remove any anonymous volumes attached to containers

示例:

docker-compose -p elk rm -s -v logstash01

輸出:

Stopping logstash01 ... done
Going to remove logstash01
Are you sure? [yN] Y
Removing logstash01 ... done

其它命令可參看官網

ptions] [SERVICE…]
Options:
-f, --force Don’t ask to confirm removal
-s, --stop Stop the containers, if required, before removing
-v Remove any anonymous volumes attached to containers


示例:

```shell
docker-compose -p elk rm -s -v logstash01

輸出:

Stopping logstash01 ... done
Going to remove logstash01
Are you sure? [yN] Y
Removing logstash01 ... done

其它命令可參看官網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章