1. 程式人生 > 其它 >20221202 Docker 5. docker-compose

20221202 Docker 5. docker-compose

官網文件

Compose specification | Docker Documentation

Overview of docker compose CLI | Docker Documentation

概述

在實際生產環境中,一個應用往往由許多服務構成,而 docker 的最佳實踐是一個容器只執行一個程序,因此執行多個微服務就要執行多個容器。多個容器協同工作需要一個有效的工具來管理他們,定義這些容器如何相互關聯。compose 應運而生。

compose 是用來定義和執行一個或多個容器(通常都是多個)執行和應用的工具。使用 compose 可以簡化容器映象的構建以及容器的執行。

compose 使用 YAML 檔案來定義多容器之間的關係。一個 docker-compose up

就可以把完整的應用跑起來。 本質上, compose 把 YAML 檔案解析成 docker 命令的引數,然後呼叫相應的 docker 命令列介面,從而將應用以容器化的方式管理起來。它通過解析容器間的依賴關係順序地啟動容器。而容器間的依賴關係由 YAML 檔案中的 links 標記指定。

docker compose 是什麼

compose、machine 和 swarm 是 docker 原生提供的三大編排工具。簡稱docker三劍客。

Docker Compose能夠在 Docker 節點上,以單引擎模式(Single-Engine Mode)進行多容器應用的部署和管理

背景

Docker Compose 的前身是 Fig。Fig 是一個由 Orchard 公司開發的強有力的工具,在當時是進行多容器管理的最佳方案。

Fig 是一個基於 Docker 的 Python工具,允許使用者基於一個 YAML 檔案定義多容器應用,從而可以使用 fig 命令列工具進行應用的部署。

Fig 還可以對應用的全生命週期進行管理。內部實現上,Fig 會解析 YAML 檔案,並通過 Docker API 進行應用的部署和管理。

在 2014 年,Docker 公司收購了 Orchard 公司,並將 Fig 更名為 Docker Compose。

命令列工具也從 fig 更名為 docker-compose,並自此成為繫結在 Docker 引擎之上的外部工具。

雖然它從未完全整合到 Docker 引擎中,但是仍然受到廣泛關注並得到普遍使用。

直至今日,Docker Compose 仍然是一個需要在 Docker 主機上進行安裝的外部 Python 工具。

使用它時,首先編寫定義多容器(多服務)應用的 YAML 檔案,然後將其交由 docker-compose 命令處理,Docker Compose 就會基於 Docker 引擎 API 完成應用的部署。

yml 配置檔案

Docker Compose 使用 YAML 檔案來定義多服務的應用。YAML 是 JSON 的一個子集,因此也可以使用 JSON。

Docker Compose 預設使用檔名 docker-compose.yml 。當然,也可以使用 -f 引數指定具體檔案。

Docker Compose 的 YAML 檔案包含 4 個一級 key:version、services、networks、volumes

  • version 是必須指定的,而且總是位於檔案的第一行。它定義了 Compose 檔案格式(主要是 API)的版本。注意,version 並非定義 Docker Compose 或 Docker 引擎的版本號。

  • services 用於定義不同的應用服務。上邊的例子定義了兩個服務:一個名為 lagou-mysql資料庫服務以及一個名為lagou-eureka的微服。Docker Compose 會將每個服務部署在各自的容器中。

  • networks 用於指引 Docker 建立新的網路。預設情況下,Docker Compose 會建立 bridge 網路。這是一種單主機網路,只能夠實現同一主機上容器的連線。當然,也可以使用 driver 屬性來指定不同的網路型別。

  • volumes 用於指引 Docker 來建立新的卷。

常用指令

# 幫助
docker-compse --help

# 後臺啟動
docker-compose up -d

# 停止服務
docker-compose down

# 列出所有執行容器,在配置檔案所在目錄執行
docker-compose ps

# 檢視服務日誌
docker-compose logs

# 構建或者重新構建服務
docker-compose build

# 啟動服務
docker-compose start

# 停止已執行的服務
docker-compose stop

# 重啟服務
docker-compose restart

反向代理案例

idea 安裝docker外掛。Dockerfile、docker-compose.yml 檔案大部分內容會有提示資訊。方便開發人員編寫配置檔案。

準備配置檔案:

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine


mkdir -p /data/tomcat1/webapps /data/tomcat2/webapps
docker cp nginx:/etc/nginx/ /data
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2 

echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp
echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp
docker rm -f nginx tomcat

修改配置檔案:

# 刪除nginx預設自帶的配置檔案,這個配置檔案監聽80埠
rm /data/nginx/conf.d/default.conf
# nginx.conf增加內容
vim /data/nginx/nginx.conf

include vhost/*.conf;
# 增加nginx配置檔案
mkdir -p /data/nginx/vhost
vim /data/nginx/vhost/lagouedu.com.conf

upstream nginxlagouedu {
  server 192.168.10.1:18081;
  server 192.168.10.1:18082;
}

server {
  listen 80;
  server_name localhost;
  autoindex on;
  index index.html index.htm index.jsp;
  location / {
    proxy_pass http://nginxlagouedu;
    add_header Access-Control-Allow-Origin *;
  }
}

docker-compse 配置檔案:

version: '3'
services:
  lagou-nginx:
    restart: always
    container_name: lagou-nginx
    volumes:
      - /data/nginx:/etc/nginx/
    image: nginx:1.19.3-alpine
    ports:
      - 80:80
  lagou-tomcat1:
    restart: always
    container_name: lagou-tomcat1
    volumes:
      - /data/tomcat1/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
      - 18081:8080
    depends_on:
      - lagou-nginx
  lagou-tomcat2:
    restart: always
    container_name: lagou-tomcat2
    volumes:
      - /data/tomcat2/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
      - 18082:8080
    depends_on:
      - lagou-nginx

執行命令:

# 啟動
docker-compose up
# 後臺啟動
docker-compose up -d

# 停止
docker-compose down

測試:

curl localhost:18081
tomcat1
curl localhost:18082
tomcat2
curl localhost:80
tomcat1或tomcat2,有負載均衡效果