之前講解過Docker安裝單個(gè)服務(wù)的系列教程焦辅,沒看過的可以點(diǎn)擊下面的鏈接回顧一下:
Docker的用途我在這里就不做贅述了,不懂的自己戳上面的鏈接學(xué)習(xí),假如現(xiàn)在我們有個(gè)Springboot應(yīng)用付鹿,里面用到了mysql梅尤、Redis埂淮、Nginx等服務(wù)慨畸,那現(xiàn)在我們要用Docker部署我們的服務(wù)倒谷,通常需要下面幾步:
安裝docker
使用docker安裝Redis
使用docker安裝Mysql
使用docker安裝蛛蒙、配置Nginx
springboot應(yīng)用打成Jar包和編寫dockerfile
安裝好以上服務(wù)之后,我們還要一一啟動(dòng)渤愁,然后再運(yùn)行項(xiàng)目才能訪問牵祟,雖然說docker有一次打包到處運(yùn)行、節(jié)省存儲(chǔ)空間和資源抖格,應(yīng)用隔離和服務(wù)器整合等優(yōu)點(diǎn)诺苹,但是仔細(xì)看上面的部署步驟咕晋,即便我們用了docker,也還是要在docker里手動(dòng)安裝其他服務(wù)收奔,現(xiàn)在只有redis掌呜、mysql、nginx幾個(gè)服務(wù)坪哄,如果我們以后還要加ES质蕉、Mongo等等越來越多的服務(wù),好像并沒有提高很多效率翩肌,那作為“萬能”的程序員模暗,有解決方法嗎?那必須有啊念祭,下面就進(jìn)入本文的重點(diǎn):docker-compose兑宇。
docker-compose簡介
Compose是用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具,是docker的服務(wù)編排工具粱坤,主要應(yīng)用于構(gòu)建基于Docker的復(fù)雜應(yīng)用隶糕,compose通過一個(gè)配置文件來管理多個(gè)docker容器,適合組合使用多個(gè)容器進(jìn)行開發(fā)的場景比规。使用compose,可以使用yml或者yaml文件配置應(yīng)用程序的服務(wù)拦英。然后蜒什,通過一個(gè)命令,可以從配置中創(chuàng)建和啟動(dòng)所有服務(wù)疤估。更多資料可以參考官網(wǎng):https://docs.docker.com/compose/overview/docker-compose安裝
安裝docker相關(guān)依賴環(huán)境:
# 安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker下載倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安裝docker-ce
sudo yum install docker-ce
# 啟動(dòng)docker-ce
sudo systemctl start docker
# 驗(yàn)證
sudo docker --version
compose官網(wǎng)安裝文檔:https://docs.docker.com/compose/install/#install-compose
1灾常、安裝Run this command to download the latest version of Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
2、賦權(quán)Apply executable permissions to the binary:
sudo chmod +x /usr/local/bin/docker-compose
3铃拇、Optionally, install command completion for the bash and zsh shell.
4钞瀑、測試(查看版本)Test the installation
docker-compose --version
docker-compose部署服務(wù)詳解使用compose部署應(yīng)用一般需要下面幾個(gè)步驟:
用dockerfile,或者鏡像定義應(yīng)用程序所依賴的環(huán)境慷荔,以便在任何地方都可以直接復(fù)制雕什。
在docker-compose.yaml中定義應(yīng)用程序需要的服務(wù),以便這些服務(wù)可以在單獨(dú)的環(huán)境中一起運(yùn)行显晶。
運(yùn)行docker-compose build 安裝應(yīng)用程序所需要的服務(wù)鏡像贷岸。
運(yùn)行docker-compose up -d 啟動(dòng)并在后臺(tái)運(yùn)行整個(gè)應(yīng)用程序。
運(yùn)行docker compose down 停止整個(gè)應(yīng)用程序磷雇。
下面我們來詳細(xì)講解上面的四個(gè)步驟偿警。
docker-compose部署Spring Boot+Nginx+Redis+Mysql實(shí)戰(zhàn)
歷經(jīng)了一個(gè)月,終于將個(gè)人的博客發(fā)布上線了唯笙,原來準(zhǔn)備用傳統(tǒng)的方式先草草上線螟蒸,可是對(duì)于一個(gè)對(duì)前沿技術(shù)有強(qiáng)迫癥的開發(fā)者來說盒使,哪怕不精通不擅長,至少要懂點(diǎn)皮毛七嫌,要在別人聊起的時(shí)候至少能聽懂少办,于是果斷換了docker方式部署,可部署過程中發(fā)現(xiàn)既然都已經(jīng)開始了抄瑟,索性就再為難自己一下凡泣,干脆一次性到位好了,直接用compose方式皮假。其實(shí)人很多時(shí)候都是在“為難自己”的過程中成長鞋拟,只要你勇敢的邁出第一步。
好了惹资,廢話少說贺纲,在大概的看了官方文檔,又谷哥度娘了幾篇相關(guān)文章褪测,在失敗了7次猴誊,解決了4個(gè)問題之后,最終如愿使用compose方式上線成功侮措,下面就將整個(gè)過程記錄下來和大家分享懈叹,所有步驟都經(jīng)過本人親測,希望對(duì)碼之初的鄉(xiāng)親們也有幫助分扎。
一澄成、看一下完整的目錄結(jié)構(gòu)
下面的common、dao畏吓、service墨状、web模塊不用多做介紹了,是個(gè)人博客項(xiàng)目菲饼,上面的docker-build文件夾就是使用compose方式部署的文件夾肾砂,主要包括:
Spring Boot web項(xiàng)目打成的jar包
jar對(duì)應(yīng)的Dockerfile
compose方式的核心配置文件docker-compose.yaml
config文件夾,是將宿主機(jī)本地配置掛載到docker容器中的配置文件
data文件夾:存放的一些初始化數(shù)據(jù)或者配置
log日志文件夾
二宏悦、Dockerfile文件詳解
FROM java:8
#FROM maven:3.5-jdk-8
VOLUME /tmp
ADD mazhichu.jar mazhichu.jar
EXPOSE 8082
#RUN bash -c 'touch /mazhichu.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/prod/./urandom","-Dspring.profiles.active=prod", "-jar","/mazhichu.jar"
命令解釋:
FROM java:8:基礎(chǔ)鏡像環(huán)境 JDK1.8
VOLUME /tmp:指定了掛載目錄
ADD mazhichu.jar mazhichu.jar:把指定的 jar 包拷貝到 Docker 容器中并命名為 mazhichu.jar
EXPOSE 8082:運(yùn)行監(jiān)聽端口
RUN bash -c 'touch /mazhichu.jar':等同于上面的拷貝jar文件到容器
ENTRYPOINT...:啟動(dòng)jar的命令并指定運(yùn)行環(huán)境等參數(shù)
三镐确、docker-compose.yaml文件詳解
version: '3'
services:
nginx:
container_name: nginx
image: nginx:1.14
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
volumes:
- ./config/nginx/conf.d:/etc/nginx/conf.d
# - ./data/nginx/:/usr/share/nginx/html/
- ./log/nginx/:/var/log/nginx/
restart: always
redis:
container_name: redis
image: redis:5.0.7
environment:
- TZ=Asia/Shanghai
ports:
- "6379:6379"
volumes:
- ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/:/data/
- ./log/redis/:/var/log/redis/
command: redis-server /usr/local/etc/redis/redis.conf
restart: always
mysql:
container_name: mysql
image: mysql:8.0.18
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: mazhichu
MYSQL_ROOT_PASSWORD: Moore@2019
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
volumes:
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./data/mysql/:/var/lib/mysql/
- ./data/init/:/docker-entrypoint-initdb.d/
- ./log/mysql/:/var/log/mysql/
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
#這行代碼解決無法訪問的問題
'--default-authentication-plugin=mysql_native_password'
]
security_opt:
- seccomp:unconfined
restart: always
mazhichu:
container_name: mazhichu
build:
context: .
dockerfile: Dockerfile
environment:
TZ: Asia/Shanghai
spring.datasource.host: mysql
spring.redis.host: redis
expose:
- "8082"
depends_on:
- nginx
- redis
- mysql
links:
- "mysql:mysql"
restart: always
# networks:
# - my-network
# command: mvn clean spring-boot:run -Dspring-boot.run.profiles=prod
配置解釋:
version: '3': 表示使用第三代語法來構(gòu)建 docker-compose.yaml 文件。
services: 用來表示 compose 需要啟動(dòng)的服務(wù)饼煞,上面的配置文件中有四個(gè)服務(wù)分別為:nginx辫塌、redis、mysql還有我的博客項(xiàng)目mazhichu(碼之初)派哲。
Image:指定下載鏡像版本
container_name: 指定容器名稱
environment: 此節(jié)點(diǎn)下的信息會(huì)當(dāng)作環(huán)境變量傳入容器臼氨,例如mysql 服務(wù)配置了數(shù)據(jù)庫、密碼和權(quán)限信息芭届。
ports: 表示對(duì)外開放的端口
volumes: 加載本地目錄下的配置文件到容器目標(biāo)地址下
restart: always 表示如果服務(wù)啟動(dòng)不成功會(huì)一直嘗試储矩。
depends_on:配置依賴服務(wù)感耙,表示需要先啟動(dòng) depends_on 下面的服務(wù)后,再啟動(dòng)本服務(wù)持隧。
links:與depends_on相對(duì)應(yīng)即硼,depends_on控制啟動(dòng)順序,links控制容器連接問題屡拨。值為"服務(wù)名:別名"或者直接使用服務(wù)名
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以這個(gè)命令來啟動(dòng)項(xiàng)目只酥,-Dspring-boot.run.profiles=prodr表示使用 application-prod.yml文件配置信息進(jìn)行啟動(dòng)。
networks:加入指定網(wǎng)絡(luò)呀狼,我這兒沒用到裂允。
四、config文件夾詳解
config文件夾下是將宿主機(jī)本地配置掛載到docker容器中的配置哥艇,在docker-compose.yaml文件中使用volumes指定绝编。因?yàn)閱蝹€(gè)安裝這些服務(wù)時(shí)我們也會(huì)這樣做,可以見文章開頭的相關(guān)文章貌踏,這兒我就把我的貼一下十饥,大家參考一下就好。
my.cnf:mysql的配置祖乳,注意改變加密方式那個(gè)位置
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 數(shù)據(jù)庫唯一 ID逗堵,主從的標(biāo)識(shí)號(hào)絕對(duì)不能重復(fù)。
server-id = 1
# 開啟 bin-log眷昆,并指定文件目錄和文件名前綴
log-bin=/var/log/mysql/binlog
# bin-log 日志文件格式蜒秤,設(shè)置為 MIXED 可以防止主鍵重復(fù)。
binlog_format = mixed
# 改變加密方式隙赁,遠(yuǎn)程連接(這個(gè)很重要)
default_authentication_plugin=mysql_native_password
# 解決遠(yuǎn)程訪問慢問題
skip-name-resolve
[mysql]
default-character-set=utf8mb4
mzc.conf:主要配置ip域名映射垦藏,注意proxy_pass那兒的碼之初是docker-compose.yaml文件中指定的服務(wù)名梆暖。
upstream mazhichu {
server mazhichu:8082;
}
server {
listen 80;
server_name www.mazhichu.cn;
charset utf-8;
location / {
proxy_pass http://mazhichu;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
redis.conf:我這兒其實(shí)就是redis.conf的文件伞访,只是改變了里面的連接redis的密碼。
五轰驳、詳細(xì)步驟
1、將docker-build文件夾上傳到centos指定目錄中,使用命令:
scp -r docker-build mzc:/usr/local/server
友情提示:
直接使用scp拷貝文件提示無權(quán)限的時(shí)候办绝,需要加上一個(gè)-r就可以了试伙。
mzc:/usr/local/server:這兒我直接使用的遠(yuǎn)程服務(wù)器別名,是不是很方便勤哗,感興趣的可以看我這篇公眾號(hào):ssh使用別名免密登錄遠(yuǎn)程服務(wù)器
2抡爹、給log文件夾加上所有權(quán)限,然后重啟一下docker服務(wù)
3芒划、使用docker-compose build構(gòu)建服務(wù)
4冬竟、使用docker-compose up -d 啟動(dòng)并在后臺(tái)運(yùn)行yaml中定義的所有服務(wù)
至此欧穴,使用compose方式部署Spring Boot+Nginx+Redis+Mysql服務(wù)全部完成,訪問博客主頁http://www.mazhichu.cn泵殴,看到可以成功訪問涮帘。
docker-compose常用命令介紹
docker-compose --verbose:輸出更多的調(diào)試信息
docker-compose --version:查看compose的版本
docker-compose -f --file FILE:使用特定的compose模板文件,默認(rèn)為docker-compose.yaml笑诅。
docker-compose -p --project-name NAME 指定項(xiàng)目名稱调缨,默認(rèn)使用目錄名稱。
docker-compose build:構(gòu)建或重建服務(wù)
docker-compose ps:查看已經(jīng)啟動(dòng)的服務(wù)狀態(tài)
docker-compose kill:停止某個(gè)服務(wù)吆你、殺掉容器
docker-compose logs:可以查看某個(gè)服務(wù)的log弦叶、顯示容器的輸出內(nèi)容
docker-compose port:打印綁定的public port(開放端口)
docker-compose pull:拉取服務(wù)鏡像
docker-compose up:啟動(dòng)yml定義的所有服務(wù)
docker-compose stop:停止yml中定義的所有服務(wù)
docker-compose start:啟動(dòng)被停止的yml中的所有服務(wù)
docker-compose kill:強(qiáng)行停止yml中定義的所有服務(wù)
docker-compose rm:刪除yml中定義的所有服務(wù)
docker-compose restart:重啟yml中定義的所有服務(wù)
docker-compose scale:設(shè)置服務(wù)的容器數(shù)目
docker-compose run:運(yùn)行一個(gè)一次性命令
總結(jié)在寫這篇文章之前,我從來沒有接觸過compose早处,以前只關(guān)注過docker一些基礎(chǔ)知識(shí)湾蔓,整個(gè)部署過程花了我整整一天的時(shí)間,從看文檔到查資料再到不斷試錯(cuò)砌梆,最終又花了半天時(shí)間總結(jié)寫這篇文章默责。說了這么多,只是想表達(dá)如果你想學(xué)習(xí)一門語言或者技術(shù)咸包,那你就必須走近它桃序,必須動(dòng)手嘗試才能有真正的成長和體驗(yàn),就跟你看到一個(gè)漂亮的高冷小姐姐一樣烂瘫,你只有走近她才有接觸的機(jī)會(huì)媒熊,只有敢于追求才有成功脫單的機(jī)會(huì),道理是一樣一樣的坟比。最后芦鳍,原創(chuàng)不易,如果鄉(xiāng)親們覺得本文不錯(cuò)葛账,麻煩幫忙右下角點(diǎn)個(gè)在看或者分享給其他有需要的人柠衅,這就是給我最大的鼓勵(lì)和堅(jiān)持原創(chuàng)的動(dòng)力了,謝謝籍琳!