Docker-compose是什么?能干嘛?解決了哪些痛點?

是什么?
Docker-compose是Docker官方推出 的一個工具軟體,可以管理多個Docker容器組成的一個應用,你需要撰寫一個一個YAML格式的組態檔:docker-compose.yml,寫好多個容器之間的呼叫關系,然后,只需要一個命令,就能同時啟動/關閉這些容器了,
怎么理解:

能干嘛?
docker建議我們每一個容器只運行一個服務,因為docker容器本身占用資源極少,所以最好是將每一個服務單獨地分割,但是這樣,我們面臨了一個問題:

去哪下?
官方地址:
https://docs.docker.com/compose/compose-file/compose-file-v3/
官方下載:
https://docs.docker.com/compose/install/
安裝步驟:
1:下載
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2:給目錄賦權限
chmod +x /usr/local/bin/docker-compose
3:查看compose的版本號
docker-compose --version
卸載步驟:
rm /usr/local/bin/docker-compose
compose核心概念
一個檔案,兩個要素:
一個檔案:docker-compose.yml
兩個要素:
服務*(service):一個個應用容器實體,比如訂單服務、庫存服務、mysql容器、nginx容器等
工程(project):由一組關聯的應用容器組成一個完整的業務單元,在docker-compose.yml檔案中定義

compose使用的三個步驟
1:撰寫Dockerfile定義各個微服務應用并構建出對應的鏡像檔案
2:使用docker-compose.yml定義一個完整業務單元,安排好整個應用中的各個容器服務
3:最后 ,執行docker-compose up命令,來啟動并運行整個應用程式,完成部署上線
compose常用命令
compose編排微服務
需求描述:
user服務,增刪改查,查詢的時候,如果快取中,沒有就去資料庫中查詢,
注意:資料庫使用docker中mysql的,redis也使用docker里面的,
我們不使用docker-compose情況下:
啟動mysql容器:
docker run -d -p 3306:3306 --privileged=true -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 mysql:5.7

啟動redis容器:
docker run -p 6379:6379 --name reids608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app
/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

本地撰寫完用戶微服務后,mvn package后,上傳的docker的宿主機后,構建鏡像:
docker build -t order:1.0.2

啟動鏡像:
docker run -d -p 6001:6001 be1face5d825

docker ps查看是否啟動成功:

發現三個服務都啟動了,
所以我們可以得到如下對比:

啟動后,swagger測驗:
訪問swagger-ui:宿主機id:埠/swagger-ui.html#
http://192.168.50.131:6001/swagger-ui.html#

訪問正常,從swagger新建用戶,然后從資料庫和redis中都可以查詢到,
雖然上面來看,是沒問題了,那么這種沒有使用compose會有哪些問題呢?
問題如下:
1:先后啟動順序要求固定的,先mysql+redis,然后才是微服務鏡像,啟動微服務,訪問成功
2:多個run命令,,,,
3:容器間的停機或宕機,有可能導致ip地址對應的容器實體變化,映射出問題,要么生產ip寫死(雖然可以,但是不推薦),要么通過服務呼叫,
當很多微服務的時候,那就瘋了,所以,我們引入docker-compose檔案統一管理起來,
使用docker-compose檔案實戰
使用docker-composy.yml服務編排,一套帶走,
步驟:
1:撰寫docker-compose.yml檔案
version: "3"
services:
microService:
image: order:1.0.2
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- kaigejava_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- kaigejava_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'kaigejava'
MYSQL_PASSWORD: 'kaigejava123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- kaigejava_net
command: --default-authentication-plugin=mysql_native_password #解決外部無法訪問
networks:
kaigejava_net:
檔案詳解:
version:xanzai都用3版本
services:服務
image:image的名字:TAG版本
container_name:容器名稱
ports:埠映射
volumes:資料卷掛載地址
networks:網路名稱
depends_on:依賴于redis 和mysql
redis:redis相關配置
mysql:mysql相關配置
命令轉化:

同理redis和mysql也是一樣的,
networks: kaigejava_net: 這個相當于是:docker network create kaigejava_net
2:修改微服務工程中mysql和redis連接的ip.將ip修改成服務名稱

更新微服務組態檔后,重新packer,然后上傳到docker宿主機后,重新生成鏡像:
docker build -t order:1.0.2 .
3:執行docker-compose up或者執行docker-compose up -d
注意:執行命令的時候,最好在docker-compose.yml檔案目錄

我們可以看到mysql\redis\ms01都done了,
注意到了嗎?order微服務我們給contener的名字設定了ms01.redis和mysql沒有設定容器名稱,可以看到會自動以當前檔案夾名稱為前綴,追加mysql前面
驗證是否真的成了,
1:驗證網路是否添加了kaigejava_net
docker network ls

使用docker ps命令查看:

mysql、redis、微服務都正常啟動了,
4:進入mysql容器實體并創建資料庫db2021+新表t_user
使用mysql客戶端連接到mysql中,發現資料庫db2021已經存在了,創建表:
CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=1=',
`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '01',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=''
5:測驗
通過頁面訪問用戶的新增和根據用戶id獲取,
一切正常,OK
6:關停
docker-compose stop

一鍵停服務,

結束語
如操作有問題歡迎去 我的 個人博客(www.kaigejava.com)留言或者 微信公眾號(凱哥Java)留言交流哦,
本系列教程直通車
直通車,本系列教程已發布文章,快速到達,《Docker學習系列》教程已經發布的內容如下:
【圖文教程】Windows11下安裝Docker Desktop
【填坑】在windows系統下安裝Docker Desktop后遷移鏡像位置
【Docker學習系列】Docker學習1-docker安裝
【Docker學習系列】Docker學習2-docker設定鏡像加速器
【Docker學習系列】Docker學習3-docker的run命令干了什么?docker為什么比虛擬機快?
【Docker學習系列】Docker學習2-常用命令之啟動命令和鏡像命令
【Docker學習系列】Docker學習系列3:常用命令之容器命令
【Docker學習系列】Docker學習4-常用命令之重要的容器命令
【Docker教程系列】Docker學習5-Docker鏡像理解
【Docker教程系列】Docker學習6-Docker鏡像commit操作案例
【Docker學習教程系列】7-如何將本地的Docker鏡像發布到阿里云
【Docker學習教程系列】8-如何將本地的Docker鏡像發布到公司鏡像服務器上?
「Docker學習系列教程」9-Docker容器資料卷介紹
「Docker學習系列教程」10-Docker容器資料卷案例
Docker學習11-Docker常規方式安裝軟體
「Docker學習系列教程」基礎篇小總結及高級篇預告
docker高級篇1-dockeran安裝mysql主從復制
docker高級篇2-分布式存盤之三種演算法
docker高級篇第二章-分布式存盤之實戰案例:3主3從redis集群擴容配置
docker高級篇第二章-分布式存盤之實戰案例:主從容錯切換遷移案例
Docker高級:Redis集群實戰!4主4從縮容到3主3從,怎么處理?
Dockerfile介紹及常用保留指令
docker高級篇第三章-dockerfile案例之制作自己的centos鏡像
docker的虛懸鏡像是什么?
docker高級篇:實戰-自己開發的微服務怎么在docker上面運行?
Docker網路中篇-docker網路的四種型別
【Docker學習教程系列匯總】筆記及遇到問題解決文章
小福利:【凱哥優惠淘】
凱哥自己開發的,領取外賣、打車、咖啡、買菜、各大電商的優惠券的公¥眾¥號【凱哥優惠淘】,如下圖:

大家好,我是凱哥Java(kaigejava),樂于分享,每日更新技術文章,歡迎大家關注“凱哥Java”,及時了解更多,讓我們一起學Java,也歡迎大家有事沒事就來和凱哥聊聊~~~
本文來自博客園,作者:kaizi1992,轉載請注明原文鏈接:https://www.cnblogs.com/kaigejava/p/17014121.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540974.html
標籤:其他
