Docker容器化從零開始搭建Spring Cloud微服務系統:docker-compose

前言

在沒有docker-compose以前,咱們建立和啓動一個容器方式以下:mysql

1.經過相似下面兩種方式的命令來構建或者拉取一個docker鏡像。git

方式1:建立Dockerfile文件來構建鏡像(命令最後的點別漏了~):github

docker build -t registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0 .

方式2: 直接從Docker Hub或者阿里雲或者網易雲等等平臺拉取鏡像。web

docker pull registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0

2.使用命令docker run ...來來依賴鏡像建立並運行一個容器,中間還要加一些複雜的參數。sql

docker run --restart always --privileged=true -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM="mysql" -e MYSQL_MASTER_SERVICE_HOST="www.wangjihong.com.cn" -e MYSQL_MASTER_SERVICE_PORT="3300" -e MYSQL_MASTER_SERVICE_DB_NAME="nacos" -e MYSQL_MASTER_SERVICE_USER="root" -e MYSQL_MASTER_SERVICE_PASSWORD="123456" -e MYSQL_SLAVE_SERVICE_HOST="www.wangjihong.com.cn" -e MYSQL_SLAVE_SERVICE_PORT="3301" -v=/usr/local/dockerfiles/nacos/data:/home/nacos/data -v=/usr/local/dockerfiles/nacos/logs:/home/nacos/logs --name docker-nacos-server1.0.0 -d -p 8848:8848 registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0

3.使用命令docker exec ...進入容器操做。docker

docker exec -it docker-nacos-server1.0.0 bash

4.查看容器啓動日誌。centos

docker logs -f docker-nacos-server1.0.0

綜上咱們能夠看出,運行單個docker容器咱們要用命衆多命令來管理容器,這種狀況下如果只運行一個容器還好,但若是咱們有一堆容器(如: mysqlkibanaelasticsearch 等等...)須要執行的話,這樣管理是極其麻煩的,利器docker-compose 的出現便解決了此類問題。數組


What-什麼是docker-compose

  1. Docker Compose 將所管理的容器分爲三層,分別是工程(project)、服務(service)、容器(container)。
  2. Docker Compose 運行目錄下的全部文件(docker-compose.yml)組成一個工程,一個工程包含多個服務,每一個服務中定義了容器運行的鏡像、參數、依賴,一個服務可包括多個容器實例。
  3. Docker Compose 是一個批處理工具,咱們能夠經過配置一個docker-compose.yml文件去定義多個容器的應用,經過一條命令就能夠根據docker-compose.yml文件建立出指定的容器,文件格式以下(使用docker-compose.yml部署微服務調用鏈監控組件skywalking):
version: '2'
services:
  elasticsearch:
    image: elasticsearch:5.6
    container_name: elasticsearch
    ports:
      - 9200:9200
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

  kibana:
    image: kibana:5.6
    container_name: kibana
    ports:
      - 5601:5601
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200

  skywalking:
      image: weihanli/skywalking:5.0.0-GA
      container_name: skywalking
      ports:
        - 10800:10800
        - 11800:11800
        - 12800:12800
        - 8090:8080
      volumes:
        - ./skywalking/application.yml:/app/skywalking/config/application.yml
      links:
        - elasticsearch:elasticsearch
      depends_on:
        - elasticsearch

Why-爲何要用docker-compose

可參考前言介紹。bash


How-如何使用docker-compose

安裝docker-compose

從github上下載docker-compose二進制文件 https://github.com/docker/com... 並按描述安裝。服務器

1.下載最新版的docker-compose文件。

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2.添加可執行權限。

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

3.測試安裝結果。

docker-compose --version

4.安裝pip。

sudo pip install docker-compose

運行docker-compose

1.在centos上建立一個docker-compose.yml文件,裏面寫上本身的多容器內容,如上述skywalking對應的文件內容。

2.最後在centos上打開docker-compose.yml所在的文件夾路徑下執行docker-compopse up就能夠啓動了,若是須要後臺啓動則爲docker-compopse up -d


docker-compose配置文件參數使用詳解

經過上述描述咱們能夠看到一份標準配置文件應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分,下面先來看 services 的書寫規則。

version

指定 docker-compose.yml 文件的寫法格式,如:

version: '3'

services

定義多個容器服務集合,如定義docker-mysql5.7-master-service和elasticsearch-service兩個容器服務寫法:

services:
  docker-mysql5.7-master-sevice:
    image: registry.cn-beijing.aliyuncs.com/wangjihong/mysql:5.7
    container_name: docker-mysql5.7-master
    ports:
      - 3300:3306
  elasticsearch-sevice:
    image: elasticsearch:5.6
    container_name: elasticsearch
    ports:
      - 9200:9200

image

標明image的ID,這個image的ID能夠是本地也能夠是遠程的,若是本地不存在,Compose會嘗試去pull下來,如在services標籤下的第二級標籤是docker-mysql5.7-master-service,它表示服務名稱,用戶可自定義名稱,image則是指定服務的鏡像名稱或鏡像ID,若是鏡像在本地不存在,Compose將會嘗試拉取這個鏡像。

services:
  docker-mysql5.7-master-sevice:
    image: registry.cn-beijing.aliyuncs.com/wangjihong/mysql:5.7
    container_name: docker-mysql5.7-master
    ports:
      - 3300:3306

build

配置構建時,Compose會利用它自動構建鏡像,該值能夠是一個路徑,也能夠是一個對象,用於指定Dockerfile參數。該參數指定Dockerfile文件的路徑,Compose將會以一個已存在的名稱進行構建並標記,並隨後使用這個image。

示例:

services:
  docker-mysql5.7-master-sevice:
    image: mysql:5.7
    container_name: docker-mysql5.7-master
    ports:
      - 3300:3306
    build:
      context: /usr/local/dockerfiles/mysql
      dockerfile: Dockerfile
      args:
        - buildno=1
        - password=secre

示例說明:
docker-mysql5.7-master-sevice容器服務會根據/usr/local/dockerfiles/mysql路徑下的Dockerfile文件以buildno=1,password=secre爲環境變量來構建出一個image ID爲mysql:5.7的鏡像。其中:

context:是一個目錄路徑,也能夠是一個git repository url。 當所提供的值是相對路徑的時候,它被解釋爲compose文件位置的相對路徑。目錄裏的信息會被當作構建內容發送到Docker daemon, context只支持version2+, version1只能使用build。

dockerfile:Compose將會使用指定的該Dockerfile文件去構建,但必須指定路徑,如與context搭配使用。

args:僅支持Version2+,用於添加構建環境變量參數,可是僅構建過程期間可使用,如:

ARG buildno
ARG password
 
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

depends_on

表示服務之間的依賴關係,做用以下:
1.docker-compose up將會根據依賴關係的順序開啓全部服務,下面的例子中, kibana會早於elasticsearch服務先啓動。
2.docker-compose upSERVICE會自動包含 SERVICE的依賴,下面的例子中, 執行docker-compose up命令時kibana將會建立,同時也會啓動elasticsearch服務。

version: '2'
services:
  elasticsearch:
    image: elasticsearch:5.6
    container_name: elasticsearch
    ports:
      - 9200:9200
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  kibana:
    image: kibana:5.6
    container_name: kibana
    ports:
      - 5601:5601
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200

注意:kibana服務啓動前並不會等待elasticsearch服務到ready狀態才啓動。若是須要等待其餘服務到ready狀態,能夠參考https://docs.docker.com/compo...

environment

環境變量配置,能夠用數組或字典兩種方式。
格式如:

environment:
    RACK_ENV: development
    SHOW: 'ture'
-------------------------
environment:
    - RACK_ENV=development
    - SHOW=ture

示例如:

version: '2'
services:
  kibana:
    image: kibana:5.6
    container_name: kibana
    ports:
      - 5601:5601
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200

env_file

從文件中獲取環境變量,能夠指定一個文件路徑或路徑列表,其優先級低於 environment指定的環境變量。

env_file: .env
---------------
env_file:
    - ./common.env

links

將指定容器鏈接到當前鏈接,能夠設置別名,避免ip方式致使的容器重啓動態改變的沒法鏈接狀況,達到服務之間可使用服務名稱相互訪問,links 容許定義一個別名,從而使用該別名訪問其它服務,相似於微服務中的根據服務名查找主機服務的場景。

version: '2'
services:
  kibana:
    image: kibana:5.6
    container_name: kibana
    ports:
      - 5601:5601
    links: 
      # 指定服務名稱:別名
      - elasticsearch:elasticsearch-server

備註:示例中kibana服務就可使用elasticsearch或elasticsearch-server做爲hostname訪問elasticsearch:elasticsearch服務了。

volumes

掛載指定的路徑或者named volumes, 能夠在主機上指定一個路徑 HOST:CONTAINER, 或者一個只讀的HOST:CONTAINER:ro。

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql
 
  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql
 
  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache
 
  # User-relative path
  - ~/configs:/etc/configs/:ro
 
  # Named volume

示例
將容器的/usr/share/elasticsearch/data掛載到宿主機的./es/data文件下。目的是能夠不進入容器內部直接經過宿主機的./es/data目錄就能夠看到容器的數據內容,避免容器刪除銷燬後形成把數據也銷燬了的嚴重問題。

version: '2'
services:
  elasticsearch:
    image: elasticsearch:5.6
    container_name: elasticsearch
    ports:
      - 9200:9200
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

expose

對外暴露端口,只將端口暴露給鏈接的服務(已經linked的service可訪問),而不暴露給主機。

expose:
 - "6666"
 - "8888"

ports

對外暴露的端口定義,和expose對應。
格式:- "宿主機端口:容器暴露端口"

ports:   
  # 暴露端口信息
  - "3300:3306"
  - "8080:8080"

注意
當以 HOST:CONTAINER的形式映射端口的時候,當容器的端口低於60的時候可能會遇到錯誤,由於YAML會解析xx:yy數字爲60。基於這個緣由,咱們推薦明確指定端口映射用字符串的形式。

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010

command

覆蓋容器啓動後默認執行的命令。

command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]

dns

配置 dns 服務器,能夠是一個值或列表。

dns: 8.8.8.8
------------
dns:
    - 8.8.8.8
    - 9.9.9.9

dns_search

配置 DNS 搜索域,能夠是一個值或列表。

dns_search: example.com
------------------------
dns_search:
    - dc1.example.com
    - dc2.example.com

network_mode

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

logs

--no-color          單色輸出,不顯示其餘顏.
-f, --follow        跟蹤日誌輸出,就是能夠實時查看日誌
-t, --timestamps    顯示時間戳
--tail              從日誌的結尾顯示,--tail=200

labels

添加 metadata 到容器中。可使用數組或字典。

labels:
  app-description: "website for wangjihong"
  app-website: "www.wangjihong.com.cn"
  app-memo: "一個不太神奇的網站"
  
labels:
  - "app-description=website for wangjihong"
  - "app-website=www.wangjihong.com.cn"
  - "app-memo=一個不太神奇的網站"

pid

將當前的PID設置爲主機的PID,從而打開容器和host操做系統之間的PID地址共享。帶有PID啓動的容器能夠訪問和操縱其餘真實機器空間容器。

pid:"host"

docker-compose命令使用詳解

Docker Compose 經常使用命令與配置以下(與docker命令基本一致)。

ps

列出全部運行容器。

docker-compose ps

logs

查看服務日誌輸出。

docker-compose logs

port

打印綁定的公共端口,下面命令能夠輸出 elasticsearch 服務 9002 端口所綁定的公共端口。

docker-compose port elasticsearch 9002

build

構建或者從新構建服務。

docker-compose build

start

啓動指定服務已存在的容器。

docker-compose start elasticsearch

stop

中止已運行的服務的容器。

docker-compose stop elasticsearch

rm

刪除指定服務的容器。

docker-compose rm elasticsearch

up

構建、啓動容器。

----前臺啓動---
docker-compose up
----後臺啓動---
docker-compose up -d
----指定文件後臺啓動---
docker-compose -f docker-compose-nacos.yml up -d

kill

經過發送 SIGKILL 信號來中止指定服務的容器。

docker-compose kill elasticsearch

pull

下載服務鏡像。

docker-compose pull elasticsearch

scale

設置指定服務運行容器的個數,以 service=num 形式指定。

docker-compose scale user=3 movie=3

run

在一個服務上執行一個命令。

docker-compose run elasticsearch bash

總結

本文只是介紹了docker-compose基本內容,想深刻了解能夠自行查資料,嘿嘿。
圖片描述

相關文章
相關標籤/搜索