Docker深刻淺出系列 | Docker Compose多容器實戰

Docker已經上市不少年,不是什麼新鮮事物了,不少企業或者開發同窗之前也很少很多有所接觸,可是有實操經驗的人很少,本系列教程主要偏重實戰,儘可能講乾貨,會根據本人理解去作闡述,具體官方概念能夠查閱官方教程,由於本系列教程對前一章節有必定依賴,建議先學習前面章節內容。java

本系列教程導航:
Docker深刻淺出系列 | 容器初體驗
Docker深刻淺出系列 | Image實戰演練
Docker深刻淺出系列 | 單節點多容器網絡通訊
Docker深刻淺出系列 | 容器數據持久化
Docker深刻淺出系列 | 單機Nginx+Springboot實戰mysql

教程目的:nginx

  • 瞭解docker-compose是什麼&爲何要用
  • 瞭解docker-compose如何安裝
  • 瞭解如何建立docker-compose 文件
  • 瞭解如何利用docker-compose 文件去建立服務
  • 瞭解docker compose的基本命令
  • 瞭解如何經過docker compose進行彈性擴容
  • 掌握docker-compose在nginx+springboot實戰應用

前期準備

1.下載mysqlgit

docker pull mysql

2.下載nginxgithub

docker pull nginx

3.克隆credit-facility-service做爲後面部署演示使用,使用docker分支web

git clone https://github.com/EvanLeung08/credit-facility-service.git

4.虛擬機、centos和docker環境安裝請查看第一章,本章默認已經安裝好centos和docker
Docker深刻淺出系列 | 容器初體驗spring


Docker Compose是什麼

Docker Compose是一個用於定義和運行多容器應用程序的工具。 經過compose,咱們可使用yaml文件來配置應用程序的服務,而後使用一個命令來建立和啓動全部已配置的服務。 在微服務環境中進行本地開發測試時,咱們常用此工具。 它也是輕量級的,只須要簡單的配置。 您能夠預先配置所需的環境和服務,而後專一於當前開發的服務,而沒必要管理開發時如何運行每一個服務的方式。

***sql

爲何要用Docker Compose

首先,咱們回顧前一章,咱們要部署一個微服務項目,須要手動配置一堆命令,十分繁瑣,假若有幾十上百個容器,而且容器之間還存在依賴,光是忙着搭建容器都耗掉一天了,還談什麼Devops,那有沒有什麼方便快捷的組建,可讓咱們經過一個配置就搞定容器編排和運行呢?docker

Docker compose就是爲了簡化多容器配置和管理工做而生的,能夠簡化大量重複的手動工做,具備如下主要特色:

  • 提供工具用於定義和運行多個docker容器應用
  • 使用yaml文件來配置應用服務(docker-compse.yml)
  • 能夠經過一個簡單的命令docker-compse up能夠按照依賴關係啓動全部服務
  • 能夠經過一個簡單的命令docker-compose down中止全部服務
  • 當一個服務須要的時候,能夠很簡單地經過--scale進行擴容

Docker Compose的考慮理由:

  • 可移植性
    Docker Compose僅需一個命令便可提供完整的開發環境:docker-compose up,而後使用docker-compose down輕鬆將其拆解。 這使咱們的開發人員能夠將開發環境保持在一箇中立位置,並幫助咱們輕鬆地部署應用程序。
  • 測試
    Compose的另外一個重要功能是經過將其置於本身的環境中,以快速可重複的方式支持運行單元和E2E測試。 這意味着,您能夠運行與生產環境很是類似的環境,而不是在本地/主機系統上測試應用程序。
  • 單個主機上的多個隔離環境
    Compose使用項目名稱將環境彼此隔離,這帶來了如下好處:
    • 您能夠在一臺計算機上運行同一環境的多個副本
    • 它能夠防止不一樣的項目和服務相互干擾

Docker Compose使用場景

  • 單主機部署
    傳統上,Compose專一於開發和測試,但如今可用於在單個主機系統上進行部署和管理容器的整個部署過程。

  • 開發環境
    Compose提供了在孤立的環境中運行應用程序的能力,該環境能夠在安裝了Docker的任何計算機上運行。 這使測試你的應用程序變得很是容易,並提供了一種儘量接近生產環境的工做方式。
    Compose文件管理應用程序的全部依賴項(數據庫,隊列,緩存等),而且可使用單個命令建立每一個容器。

  • 自動化測試環境
    持續集成和整個開發過程的重要組成部分是自動化測試套件,該套件要求能夠在其中執行測試的環境。 Compose提供了一種方便的方法來建立和銷燬與您的生產環境接近的隔離測試環境。


Docker Compose安裝

能夠參考官網:Docker Compose安裝

1.下載當前穩定版本,選擇對應系統版本,我這裏用的是Centos

經過官方下載

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

經過國內源下載
bash sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.賦予可執行權限

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

Compose Yaml文件結構

經過Compose,咱們開發人員能夠經過應用在docker-compose.yml文件中聲明的許多規則輕鬆地一次處理多個Docker容器。

它由多個層級組成,這些層級使用製表符或空格分隔,而不是大多數編程語言中已知的括號。 幾乎每一個Compose-File應該具備如下四個主要方面:

  • Compose文件的Version
  • 咱們將要構建的Services
  • 全部要使用的Volumes
  • 用來鏈接不一樣服務的network

docker-compose.yml 示例:

version: '3.3'

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
     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應用程序,包括MySQL數據庫。 這些服務中的每個都被視爲一個單獨的容器,能夠在須要時進行添加或刪除

我是怎麼知道這些命令怎麼使用?
詳細的配置參數,能夠查閱: 官方配置參數
***

Compose 基本操做命令

查看docker-compose的基本操做命令,能夠經過docker-compose --help進行查看,不少命令實際上是跟docker類似

[root@localhost credit-facility]# docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent
  --env-file PATH             Specify an alternate environment file

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

Docker Compose實戰


相信你們都已經看過上一章,若是你們尚未看過,請先回到上一章節教程

在上一章,咱們經過手動方式,一步步搭建了Nginx、Mysql以及額度服務,相信你們都體會到整個流程很是繁瑣,有一部出錯了,都要從新敲一遍指令,在本章咱們沿用上一章的環境配置,可是整個過程會經過docker compose來幫咱們自動部署而不是手動部署。

實戰目標

  • 建立docker網絡,設置靜態子網ip168.18.0.0/24
  • 搭建額度服務集羣
    • [額度服務]credit-facility01 - 168.18.0.10
    • [額度服務]credit-facility02 - 168.18.0.11
    • [額度服務]credit-facility03 - 168.18.0.12
  • 搭建Mysql數據庫
    • [Mysql服務]credit-facility-db - 168.18.0.4
  • 搭建Nginx服務,並配置負載均衡規則
    • [Nginx服務]credit-facility-nginx - 168.18.0.5
  • 建立Volume credit-facility-volume,用於持久化Mysql容器數據
  • 利用docker內置DNS服務器的特色,docker網絡內容器之間經過容器名稱進行通訊
  • 經過瀏覽器訪問swagger進行業務操做

實戰步驟

清理舊配置

1.若是上一章已經建立好了容器,先清理上一章已經建立的容器,避免衝突

docker container stop credit-facility01
docker container stop credit-facility02
docker container stop credit-facility03
docker container stop credit-facility-db
docker container stop credit-facility-nginx
docker container rm credit-facility01
docker container rm credit-facility02
docker container rm credit-facility03
docker container rm credit-facility-db
docker container rm credit-facility-nginx

2.清理上一章建立好的網絡credit-facility-net

docker network rm credit-facility-net

3.覈對下當前Centos系統上credit-facility目錄下的文件是否跟我一致,若是不同,請先查看上一章

[root@localhost credit-facility]# ls
Dockerfile nginx  start-1.0.0-SNAPSHOT.jar

咱們上一章建立好的文件應該是以上三個

搭建環境

1.上傳credit-facility-service項目裏的docker-compose.yml文件到Centos系統credit-facility目錄下,若是還沒克隆額度服務到本地,請查看前期準備

docker-compose.yml文件存放在credit-facility-service項目dockerfile目錄下

[root@localhost credit-facility]# ls
Dockerfile  docker-compose.yml  nginx  start-1.0.0-SNAPSHOT.jar

這時候會多了一個docker-compose.yml文件

2.經過docker config校驗compose文件,若是文件格式有問題,經過該命令能夠幫你校驗並輸出錯誤信息

[root@localhost credit-facility]# docker-compose config
networks:
  credit-facility-net:
    driver: bridge
    ipam:
      config:
      - subnet: 168.18.0.0/24
services:
  credit-facility-service1:
    build:
      context: /usr/local/credit-facility
    container_name: credit-facility01
    image: credit-facility-image
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.10
    ports:
    - 8081:8080/tcp
    restart: always
  credit-facility-service2:
    build:
      context: /usr/local/credit-facility
    container_name: credit-facility02
    image: credit-facility-image
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.11
    ports:
    - 8082:8080/tcp
    restart: always
  credit-facility-service3:
    build:
      context: /usr/local/credit-facility
    container_name: credit-facility03
    image: credit-facility-image
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.12
    ports:
    - 8083:8080/tcp
    restart: always
  mysql:
    build:
      context: /usr/local/credit-facility
    container_name: credit-facility-db
    environment:
      MYSQL_DATABASE: db_credit_facility
      MYSQL_ROOT_PASSWORD: evan123
    image: mysql
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.4
    ports:
    - 3301:3306/tcp
    restart: always
    volumes:
    - credit-facility-volume:/var/lib/mysql:rw
  nginx:
    build:
      context: /usr/local/credit-facility
    container_name: credit-facility-nginx
    image: nginx
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.5
    ports:
    - 80:80/tcp
    restart: always
    volumes:
    - /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/nginx.conf:rw
version: '3.0'
volumes:
  credit-facility-volume: {}

這裏能夠看到,咱們的配置文件檢驗經過,接下來咱們分段拆解來講明下每一段腳本的意思

配置網絡

networks:
  credit-facility-net:
    driver: bridge
    ipam:
      config:
      - subnet: 168.18.0.0/24

跟前面同樣,這裏建立了一個自定義網絡credit-facility-net,指定了docker的網絡模式是bridge,劃分了一個子網ip段168.18.0.0/24,跟前一章手動配置對應的命令以下:

[root@localhost ~]# docker network create --subnet=168.18.0.0/24 credit-facility-net

配置Mysql容器

mysql:
    restart: always
    container_name: credit-facility-db
    image: mysql
    ports:
      - "3301:3306"
    volumes:
      - "credit-facility-volume:/var/lib/mysql:rw"
    environment:
      - MYSQL_DATABASE=db_credit_facility
      - MYSQL_ROOT_PASSWORD=evan123
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.4
  • restart - 指定了容器每次部署都會從新重啓
  • container_name - 指定了容器名稱爲credit-facility-db
  • image - 指定了咱們用來運行容器的鏡像是mysql,若是指定的image不存在,它會自動從遠程倉庫下載
  • ports - 指定了咱們映射端口,這裏把容器3306端口映射到宿主機器3301端口
  • volumes - 指定了容器裏的存儲路徑以volume掛載方式映射到宿主機器上credit-facility-volume,而且分配讀寫權限
  • environment - 這裏環境變量的做用是向容器傳遞參數,指定了數據庫實例爲db_credit_facility,數據庫root用戶密碼爲evan123
  • networks - 指定了網絡選用自定義網絡credit-facility-net,分配靜態IP 168.18.0.4

上面的compose文件配置對應前一章的手動配置命令以下:

[root@localhost ~]# docker run -d --name credit-facility-db -v credit-facility-volume:/var/lib/mysql -p 3301:3306 -e MYSQL_ROOT_PASSWORD=evan123 --net=credit-facility-net --ip 168.18.0.4 mysql

配置額度服務集羣

credit-facility-service1:
    restart: always
    container_name: credit-facility01
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8081:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.10


  credit-facility-service2:
    restart: always
    container_name: credit-facility02
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8082:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.11

  credit-facility-service3:
    restart: always
    container_name: credit-facility03
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8083:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.12

核心配置:

  • container_name - 這裏主要是配置3個額度服務實例,分別爲credit-facility01credit-facility02credit-facility03
  • build - 這裏指定了docker-compose從當前目錄尋找dockerfile文件進行鏡像建立和啓動容器
  • depends_on - 它指定當前容器依賴mysql容器,這樣子docker-compose啓動時會按照依賴關係來啓動
  • networks - 指定了自定義網絡credit-facility-net,並對三個實例分別分配了靜態ip168.18.0.10168.18.0.11168.18.0.12

大部分命令跟前面同樣,因此這裏不做重複講解。這裏對應前一章的手動配置命令以下:

[root@localhost credit-facility]# docker build -t credit-facility-image .
[root@localhost credit-facility]# docker run -d --name credit-facility01 -p 8081:8080  --net=credit-facility-net --ip 168.18.0.10 credit-facility-image
[root@localhost credit-facility]# docker run -d --name credit-facility02 -p 8082:8080  --net=credit-facility-net --ip 168.18.0.11 credit-facility-image
[root@localhost credit-facility]# docker run -d --name credit-facility03 -p 8083:8080  --net=credit-facility-net --ip 168.18.0.12 credit-facility-image

這裏沿用上一章在credit-facility目錄下建立的dockerfile:

FROM openjdk:8-jre-alpine
MAINTAINER evan
LABEL name="credit-facility" version="1.0" author="evan"
COPY start-1.0.0-SNAPSHOT.jar credit-facility-service.jar
CMD ["java","-jar","credit-facility-service.jar"]

配置Nginx服務

nginx:
    restart: always
    container_name: credit-facility-nginx
    depends_on:
      - mysql
      - credit-facility-service1
      - credit-facility-service2
      - credit-facility-service3
    image: nginx
    ports:
      - "80:80"
    volumes:
      - /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.5

核心配置:

  • container_name - 把nginx容器命名爲credit-facility-nginx
  • depends_on - 定義了容器啓動依賴關係
  • ports - 把容器80端口映射到宿主機80端口
  • volumes - 把容器目錄下的/etc/nginx/nginx.conf文件映射到宿主機/usr/local/credit-facility/nginx/nginx.conf,這裏的nginx配置沿用上一章的配置不變,宿主機的配置會自動覆蓋容器的nginx.conf文件
  • networks - 指定網絡爲credit-facility-net,並分配靜態ip爲168.18.0.5

大部分命令跟前面同樣,因此這裏不做重複講解。這裏對應前一章的手動配置命令以下:

[root@localhost nginx]# docker run -d --name credit-facility-nginx -p 80:80 -v /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/ningx.conf --network=credit-facility-net --ip 168.18.0.5 nginx

這裏沿用上一章的Nginx配置/usr/local/credit-facility/nginx/nginx.conf:

user nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;


    server {
        listen 80;
        location / {
         proxy_pass http://balance;
        }
    }

    upstream balance{
       server credit-facility01:8080;
       server credit-facility02:8080 ;
       server credit-facility03:8080;
    }
    include /etc/nginx/conf.d/*.conf;
}

這裏是經過容器名稱訪問,所以不須要管每一個容器的ip是多少

4.經過docker-compose up啓動全部服務

[root@localhost credit-facility]# docker-compose up
Creating network "credit-facility_credit-facility-net" with driver "bridge"
Creating credit-facility02     ... done
Creating credit-facility-db    ... done
Creating credit-facility03     ... done
Creating credit-facility-nginx ... done
Creating credit-facility01     ... done
...

經過docker-compose命令,會按照咱們在docker-compose.yml配置的信息去建立和啓動服務,而且把日誌打印到控制檯輸出,這裏由於日誌太多,只截取了部分日誌,只要日誌沒有報錯信息,全部服務到這裏已經搭建完成

驗證環境

1.驗證Nginx服務是否已經成功,這裏須要經過宿主機ip+映射端口訪問

先查看下當前centos機器的ip

[root@localhost credit-facility]# ip add
...
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.23/24 brd 192.168.101.255 scope global noprefixroute dynamic eth1
       valid_lft 68553sec preferred_lft 68553sec
    inet6 fe80::a00:27ff:feba:a28/64 scope link 
       valid_lft forever preferred_lft forever

從上面能夠看到,宿主機外網ip是192.168.101.23

在本機瀏覽器輸入192.168.101.23進行驗證
Nginx服務已經啓動成功

2.驗證額度服務是否成功訪問

經過Nginx 80端口驗證

分別經過每一個實例自身映射端口訪問
在這裏插入圖片描述

3.驗證額度服務接口是否能夠處理成功

在驗證額度服務前,須要先把表建立好,把credit-facility-service下的db script在DB裏執行

進入到Mysql容器,把表建立sql放進去執行

[root@localhost credit-facility]# docker exec -it credit-facility-db bash
root@d0d2fb8006c9:/# mysql -uroot -pevan123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db_credit_facility |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use db_credit_facility;
Database changed
mysql> CREATE TABLE `t_product_limit`
...

輸入下面請求數據測試接口

{
    "registrationLimitCO": {
        "applicationId": "1111",
        "userId": 1111,
        "quotaLimit": 10000,
        "productCode": "tb",
        "expirationTime": "2030-01-01",
        "accountType": 1
    }

}



從上面輸出結果能夠看到,接口已經處理成功

4.進去數據庫查看是否已經保存數據成功

mysql> select * from t_product_limit;
+--------------------+---------------------+---------------------+---------+---------+--------------------+--------------------+-------------+---------+--------------+-------------+---------------+-----------------+--------------+------------+--------------+------------+---------------+-------------+---------------+---------------------+---------------+---------------+-----------+-----------+
| id                 | create_time         | edit_time           | deleted | version | serial_number      | account_id         | customer_id | user_id | product_code | quota_limit | quota_balance | quota_occupancy | quota_frozen | quota_base | quota_change | quota_mode | frozen_status | frozen_time | expire_status | expiration_time     | active_status | inactive_time | parent_id | abandoned |
+--------------------+---------------------+---------------------+---------+---------+--------------------+--------------------+-------------+---------+--------------+-------------+---------------+-----------------+--------------+------------+--------------+------------+---------------+-------------+---------------+---------------------+---------------+---------------+-----------+-----------+
| 684437432334159872 | 2020-03-03 08:30:00 | 2020-03-03 08:30:00 |       0 |       0 | 684437432338354177 | 684437432338354176 |      111111 |    1111 | tb           |       10000 |             0 |               0 |            0 |          0 |            0 |       NULL |             1 | NULL        |          NULL | 2030-01-01 00:00:00 |          NULL | NULL          |      NULL |         0 |
+--------------------+---------------------+---------------------+---------+---------+--------------------+--------------------+-------------+---------+--------------+-------------+---------------+-----------------+--------------+------------+--------------+------------+---------------+-------------+---------------+---------------------+---------------+---------------+-----------+-----------+
1 row in set (0.00 sec)

Compose彈性擴容初體驗

在互聯網公司比較場景,常常會遇到服務器資源不足,特別是遇到節假日公司要搞活動,須要臨時擴容增大服務的計算能力,假如咱們公司已經用上docker,docker-compose就能夠幫咱們很簡單作到服務器擴容,固然,docker-compose不多直接在生產上獨立使用,更可能是在開發測試環境,後面講解k8s的時候會介紹生產上如何作到彈性擴容。

接下來,咱們只須要經過簡單的命令就能夠實現彈性擴容

1.對於前面咱們建立的docker-compose.yml作一點改動,加入一個新的服務定義,以下

web:
    restart: always
    image: credit-facility-image
    build: .
    expose:
      - "8080"
    depends_on:
      - mysql
      - credit-facility-service1
      - credit-facility-service2
      - credit-facility-service3
    networks:
      - credit-facility-net

這裏指定了容器端口是8080,可是沒有配置宿主機端口映射,網絡也加入到credit-facility-net

Nginx也須要調整下,把靜態ip去掉,而且加上依賴,避免ip衝突,docker會自動分配一個靜態ip

nginx:
    restart: always
    container_name: credit-facility-nginx
    depends_on:
      - mysql
      - credit-facility-service1
      - credit-facility-service2
      - credit-facility-service3
      - web
    image: nginx
    ports:
      - "80:80"
    links:
      - web
    volumes:
      - /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - credit-facility-net

在這裏我複製了一份credit-facility-service配置,爲了方便演示,我去掉了網絡配置和端口映射,由於若是想使用彈性擴容,端口和ip不能固定,不然會啓動失敗,改造後完整的配置以下:

version: '3'
services:

  mysql:
    restart: always
    container_name: credit-facility-db
    image: mysql
    ports:
      - "3301:3306"
    volumes:
      - "credit-facility-volume:/var/lib/mysql:rw"
    environment:
      - MYSQL_DATABASE=db_credit_facility
      - MYSQL_ROOT_PASSWORD=evan123
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.4

  credit-facility-service1:
    restart: always
    container_name: credit-facility01
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8081:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.10


  credit-facility-service2:
    restart: always
    container_name: credit-facility02
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8082:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.11

  credit-facility-service3:
    restart: always
    container_name: credit-facility03
    depends_on:
      - mysql
    image: credit-facility-image
    build: .
    ports:
      - "8083:8080"
    networks:
      credit-facility-net:
        ipv4_address: 168.18.0.12

  web:
    restart: always
    image: credit-facility-image
    build: .
    expose:
      - "8080"
    depends_on:
      - mysql
      - credit-facility-service1
      - credit-facility-service2
      - credit-facility-service3
    networks:
      - credit-facility-net

  nginx:
    restart: always
    container_name: credit-facility-nginx
    depends_on:
      - mysql
      - credit-facility-service1
      - credit-facility-service2
      - credit-facility-service3
      - web
    image: nginx
    ports:
      - "80:80"
    links:
      - web
    volumes:
      - /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - credit-facility-net

networks:
  credit-facility-net:
    driver: bridge
    ipam:
      config:
        - subnet: 168.18.0.0/24
volumes:
  credit-facility-volume: {}

2.執行如下命令,對web服務進行彈性擴容,建立三個容器實例

[root@localhost credit-facility]# docker-compose up --scale web=3 -d
Creating network "credit-facility_credit-facility-net" with driver "bridge"
Creating network "credit-facility_default" with the default driver
Creating credit-facility_web_1 ... done
Creating credit-facility_web_2 ... done
Creating credit-facility_web_3 ... done
Creating credit-facility01     ... done
Creating credit-facility02     ... done
Creating credit-facility03     ... done
Creating credit-facility-nginx ... done
Creating credit-facility-db    ... done

從上圖能夠看到,web服務對應的容器實例已經建立成功,它的命名方式是基於dockerfile裏面的Label名稱+_web_<實例序號>

3.經過docker-compose ps查看下當前已啓動的容器

[root@localhost credit-facility]# docker-compose ps
        Name                       Command               State                 Ports              
--------------------------------------------------------------------------------------------------
credit-facility-db      docker-entrypoint.sh mysqld      Up      0.0.0.0:3301->3306/tcp, 33060/tcp
credit-facility-nginx   nginx -g daemon off;             Up      0.0.0.0:80->80/tcp               
credit-facility01       java -jar credit-facility- ...   Up      0.0.0.0:8081->8080/tcp           
credit-facility02       java -jar credit-facility- ...   Up      0.0.0.0:8082->8080/tcp           
credit-facility03       java -jar credit-facility- ...   Up      0.0.0.0:8083->8080/tcp           
credit-facility_web_1   java -jar credit-facility- ...   Up      8080/tcp                         
credit-facility_web_2   java -jar credit-facility- ...   Up      8080/tcp                         
credit-facility_web_3   java -jar credit-facility- ...   Up      8080/tcp

這裏能夠看到,咱們配置的全部容器都啓動成功,而且新增了三個web容器實例

4.經過docker-compose logs web能夠查看web服務每一個實例的日誌

5.修改下nginx.conf的配置,改成新的web容器名稱,註釋掉咱們原來的credit-facility容器

user nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65; 

   
    server {
        listen 80;
        location / {
         proxy_pass http://balance;
        }
    }
    
    upstream balance{  
      #  server credit-facility01:8080;
      # server credit-facility02:8080 ;
      # server credit-facility03:8080;
      server credit-facility_web_1:8080;
      server credit-facility_web_2:8080;
      server credit-facility_web_3:8080;
    }
    include /etc/nginx/conf.d/*.conf;
}

6.重啓nginx服務

[root@localhost nginx]# docker restart credit-facility-nginx 
credit-facility-nginx

7.經過Postman測試WEB服務

請求Url輸入你宿主機ip,請求方式是POST,在請求body輸入如下請求數據:

{
    "registrationLimitCO": {
        "applicationId": "1111",
        "userId": 1111,
        "quotaLimit": 10000,
        "productCode": "tb",
        "expirationTime": "2030-01-01",
        "accountType": 1
    }

}


從上面相應結果能夠看到,服務處理成功


附錄

引用

Docker Compose官方文檔:官方文檔
Demo項目地址:Demo下載

Q&A

1.docker-compose up啓動報錯

[root@localhost credit-facility]# docker-compose up
ERROR: Named volume "credit-facility-volume:/var/lib/mysql:rw" is used in service "mysql" but no declaration was found in the volumes section.

解決方案:
這是由於缺乏Volume聲明,在docker-compose.yml按以下配置(上文的配置文件已經配置好)

- "credit-facility-volume:/var/lib/mysql:rw"
volumes:
  credit-facility-volume: {}

2.credit-facility-service在服務器上啓動報錯
先肯定你是否已經切換到docker分支,而且本地構建能夠成功,而後再打包部署

相關文章
相關標籤/搜索