Docker compose管理mysql、項目後臺系統(實現多容器管理)

前面我們通過單個容器進行管理,可以實現系統的部署,但是如果系統依賴的東西比較多時,在一個新的機器中,我們又需要將這些容器部署起來,你也許會說我們可以通過shell腳本來實現,但docker提供了更快、更簡便的方式:docker compose,通俗點說就是組合多個容器並進行管理,類似maven jar管理。

docker compose的核心是docker-compose.yml文件,通過該文件來管理service,爲了使用compose

1、我們需要執行

docker swarm init

初始化一個swarm管理器

2、編寫docker-compose.yml文件

version: "3"
services:
  mysql:
    image: mysql
    restart: always                       
    volumes:
      - ./mysql/data/:/var/lib/mysql/
      - ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    command: --default-authentication-plugin=mysql_native_password  
  gs_om_ms:
    restart: always
    image: gs-om-ms-compose:1.0
    volumes:
      - ./logs/:/data/log/om/omms/
    ports:
      - 8988:8988
    links:
      - mysql:m1

因爲我們已經有了mysql、gs-om-ms-compose:1.0這兩個鏡像,所以這裏通過image的方式進行引入,還可以通過build的方式(構建指定路徑下的Dockerfile文件)

下面簡單講解下docker-compose.yml的含義

version: 版本號,固定爲3就行,版本3支持docker stack,版本2不支持docker stack,版本2和3的都支持docker compose,這樣說明docker stack是後續的主流

services: 服務列表

    mysql: 定義一個服務名稱爲mysql的服務,具體服務名會加上指定的前綴

       image:  指定服務使用的鏡像,如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像

       restart: 重啓方式

       volumes: 掛載一個目錄或者一個已存在的數據卷容器,這很有必要,如果不這樣,當容器停止或移除後數據就找不回來了

            - ./mysql/data/:/var/lib/mysql/    // 將當前目錄下的mysql/data掛載到/var/lib/mysql
            - ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf   // 將當前目錄下的mysql/conf/mysqld.cnf掛載到/etc/mysql/mysql.conf.d/mysqld.cnf

        ports:   映射端口的標籤。使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口。  
            - "3306:3306"  宿主3306映射到容器端口3306
        environment:   容器變量 
            - MYSQL_ROOT_PASSWORD=123456    // 設置mysql root用戶密碼爲123456

        command: --default-authentication-plugin=mysql_native_password  // 執行命令,這裏使用的mysql版本爲8.0.15,所以執行授權的插件

        links: 連接其它服務中的容器
           - mysql:m1  // 連接數據庫服務中的容器,因爲系統需要連接數據庫

 

除了上述使用的一些關鍵字外:還有一些也比較常用,例如

depends_on 依賴的容器,解決容器啓動順序問題

build:指定路徑,使用指定路徑下的Dockerfile文件構建服務

3、部署應用

docker stack deploy -c docker-compose.yml 應用名稱(也是服務前綴)

注:這裏使用docker stack deploy實現了類似docker-compose的功能,但兩者還是有所不同的。

Docker stack會忽略了“構建”指令。 您無法使用stack命令構建新鏡像。 它是需要鏡像是預先已經構建好的。 所以docker-compose更適合於開發場景。

  

查看服務

docker service ls

這裏的應用名稱爲gs-compose,可以看到已經有了兩個服務了

同時可以看到有兩個容器已經在運行了

訪問系統,可以正常訪問,說明系統已經部署好了

4、其它命令

(1)刪除應用(正在運行的容器也會刪除掉)

docker stack rm 應用名稱

(2)進入容器內部並執行命令

docker exec -it 容器名稱 命令

例docker exec -it gs-compose_mysql.1.c0diy1ycaixyu81x7x6avnc2j bash

進入mysql容器中並執行bash命令

(3)查詢指定父鏡像ID的子鏡像

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=父鏡像ID)

(4)docker-compose運行命令

docker-compose -f docker-compose.yml -p gs-compose up -d

-d 表示在後臺運行,其它命令使用docker-compose --help

 

注:連接mysql需要以ip地址的形式進行連接,否則會出現errorCode 0, state 08S01

 

除了依賴已有的鏡像,我們還可以通過build選項構建鏡像,例jdk的構建,後臺管理系統的構建

version: "3"
services:
  jdk:
    build: ./jdk
  mysql:
    image: mysql
    restart: always                       
    volumes:
      - ./mysql/data/:/var/lib/mysql/
      - ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=nDLkMs7giw11~
    command: --default-authentication-plugin=mysql_native_password  
  gs_om_ms:
    restart: always
    build: .
    volumes:
      - ./logs/:/data/log/om/omms/
    ports:
      - 8988:8988
    depends_on:
      - jdk
    links:
      - mysql:m1

目錄結構:

jdk目錄下也有一個Dockerfile文件

gs_om_ms的Dockerfile內容如下:

FROM gs-compose_jdk
MAINTAINER youpanpan "[email protected]"
ADD gs-om-ms.jar gs-om-ms.jar
EXPOSE 8988
ENTRYPOINT java -jar gs-om-ms.jar --spring.profiles.active=test

 

這裏依賴的是gs-compose_jdk,即通過docker-compose構建的鏡像,不過最好還是先將jdk構建出來,後臺系統鏡像基於jdk鏡像進行構建

構建出了兩個鏡像:

 

本人開發的一個網站:編程之道,歡迎來踩!!!

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