Docker從入門到精通(八)——Docker Compose

恭喜大家,學到這裡,對於 docker 的基礎玩法大家應該都會了,下面會介紹 docker的一些編排工具。

1、為什麼需要 Docker Compose?

官網鎮樓://www.runoob.com/docker/docker-compose.html

一句話概括:

幫助我們批量有規則的管理容器。

前面基礎教程,我們介紹了 Dockerfile ,啟動服務都是通過 Dockerfile 構建鏡像,啟動容器,對於幾個服務,我們一個一個的build,run 還能接收,但是實際生產環境是有幾百上千個的,這個時候難道我們還有手動一個一個啟動嗎?

另外,服務與服務之間是有依賴關係的,比如一個 Tomcat 部署的服務依賴MySQL,依賴Redis,我們啟動 Tomcat 服務時,需要先啟動MySQL和Redis,這個順序也是很重要的。

有了 Docker Compose ,那我們就可以告別手動繁瑣的步驟,提前定義好規則,統一管理即可。

2、Docker Compose 局限性

首先說明,Docker Compose 雖然是官方提供的容器編排工具,但是實際生產環境是不用的(用什麼?比如Swarm、K8S,後面會介紹),因為其局限性很大,這裡介紹大家了解即可。

只支援單機多容器,不支援集群環境管理。

3、安裝

參考官方文檔即可://docs.docker.com/compose/install/

Mac/Windows 安裝docker默認提供了 Docker Compose,所以不需要我們安裝,但是Linux環境需要手動安裝。

3.1 下載

sudo curl -L "//github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

上面是官方提供的,但是下載會比較慢,可以使用中國的下載地址:

sudo curl -L "//get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

3.2 授權

sudo chmod +x /usr/local/bin/docker-compose

3.3 驗證安裝

docker-compose version

3.4 卸載

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

4、用法

根據官方提示,使用 Docker Compose 分為三個步驟:

  • 第一步:使用 Dockerfile 定義應用程式的環境。
  • 第二步:使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。
  • 第三步:執行 docker-compose up 命令來啟動並運行整個應用程式。

具體如何用,下面我通過兩個小例子來演示說明。

5、部署WP部落格

這也是官方提供的實例://docs.docker.com/samples/wordpress/

WordPress是一款個人部落格系統,並逐步演化成一款內容管理系統軟體,它是使用PHP語言和MySQL資料庫開發的,用戶可以在支援 PHP 和 MySQL資料庫的伺服器上使用自己的部落格。

5.1 創建項目目錄

名稱任意,用來存放 docker-compose.yml 文件

mkdir my_wordpress

我們按照官方創建一個名為 my_wordpress 目錄。

5.2 創建 docker-compose.yml

新建一個 docker-compose.yml 文件,內容如下:

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

5.3 構建項目

docker-compose up -d

注意要切換到my_wordpress 目錄,否則要增加 -f 參數指定 docker-compose.yml 文件。

看到上面截圖即表示啟動成功。

5.4 訪問頁面

//宿主機IP:8000

另外,我們通過 docker ps 命令,也能看到啟動了兩個容器。

6、docker-compose.yml 規則

上面的例子很簡單,但是裡面有一個核心就是 docker-compsoe.yml 文件的編寫,下面我們就來詳細介紹這個文件的編寫規則。

官方規則介紹:

//docs.docker.com/compose/compose-file/

# 第一層:版本
version: "3.9" 
# 第二層:服務    
services:
	# 服務名稱
  db:
  	# 鏡像名稱
    image: mysql:5.7
    # 掛載的容器卷
    volumes:
      - db_data:/var/lib/mysql
    # 服務掛掉是否自動重啟
    restart: always
    # 環境變數設置
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  # 服務名稱  
  wordpress:
  	# 依賴的服務
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
# 第三層:其他配置,包括網路,容器卷等等
volumes:
  db_data: {}
  wordpress_data: {}

其實主要就是三層配置,具體的每個配置項,大家可以看名知意,然後不懂的官網其實也有很詳細的說明。

7、Docker Comopose 部署自定義服務

下面我們自己寫一個服務,不用官方服務,帶著大家手動玩一遍。

每次訪問 Tomcat的服務,Redis計數器加1

7.1 編寫 Tomcat服務

新建一個springboot項目,然後新建一個controller類:

package com.itcoke.counter.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

@RestController
public class CounterController {

    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping("/visit")
    public String count(HttpServletRequest request){
        String remoteHost = request.getRemoteHost();
        Long increment = redisTemplate.opsForValue().increment(remoteHost);
        return remoteHost +"訪問次數"+increment.toString();
    }
}

Springboot 服務的配置文件 application.yml:

server:
  port: 8080
  servlet:
    context-path: /counter
spring:
  redis:
    host: counterRedis

7.2 Dockerfile

FROM openjdk:8-jdk

COPY *.jar /counter.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/counter.jar"]

7.3 docker-compose.yml

version: "3.8"
services:
  itcokecounter:
    build: .
    image: itcokecounter
    depends_on:
      - counterRedis
    ports:
      - "8080:8080"
  counterRedis:
    image: "redis:6.0-alpine"

7.4 測試

在Linux伺服器新建 counter 文件夾,把下面三個文件拷貝到其中。

然後執行如下命令構建:

docker-compose up

執行完成便會出現如下啟動成功介面:

image-20211116221332395

然後,我們在瀏覽器輸入網址:

//{ip}:8080/counter/visit

每刷新一次,還會增加一次。