前面我們通過單個容器進行管理,可以實現系統的部署,但是如果系統依賴的東西比較多時,在一個新的機器中,我們又需要將這些容器部署起來,你也許會說我們可以通過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鏡像進行構建
構建出了兩個鏡像:
本人開發的一個網站:編程之道,歡迎來踩!!!