之前講解過(guò)Docker安裝單個(gè)服務(wù)的系列教程,沒(méi)看過(guò)的可以點(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)目才能訪問(wèn),雖然說(shuō)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等等越來(lái)越多的服務(wù),好像并沒(méi)有提高很多效率,那作為“萬(wàn)能”的程序員,有解決方法嗎?那必須有啊,下面就進(jìn)入本文的重點(diǎn):docker-compose。
docker-compose簡(jiǎn)介
Compose是用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具,是docker的服務(wù)編排工具,主要應(yīng)用于構(gòu)建基于Docker的復(fù)雜應(yīng)用,compose通過(guò)一個(gè)配置文件來(lái)管理多個(gè)docker容器,適合組合使用多個(gè)容器進(jìn)行開(kāi)發(fā)的場(chǎng)景。使用compose,可以使用yml或者yaml文件配置應(yīng)用程序的服務(wù)。然后,通過(guò)一個(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下載倉(cāng)庫(kù)
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、測(cè)試(查看版本)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)用程序。
下面我們來(lái)詳細(xì)講解上面的四個(gè)步驟。
docker-compose部署Spring Boot+Nginx+Redis+Mysql實(shí)戰(zhàn)
歷經(jīng)了一個(gè)月,終于將個(gè)人的博客發(fā)布上線了,原來(lái)準(zhǔn)備用傳統(tǒng)的方式先草草上線,可是對(duì)于一個(gè)對(duì)前沿技術(shù)有強(qiáng)迫癥的開(kāi)發(fā)者來(lái)說(shuō),哪怕不精通不擅長(zhǎng),至少要懂點(diǎn)皮毛,要在別人聊起的時(shí)候至少能聽(tīng)懂,于是果斷換了docker方式部署,可部署過(guò)程中發(fā)現(xiàn)既然都已經(jīng)開(kāi)始了,索性就再為難自己一下,干脆一次性到位好了,直接用compose方式。其實(shí)人很多時(shí)候都是在“為難自己”的過(guò)程中成長(zhǎng),只要你勇敢的邁出第一步。
好了,廢話少說(shuō),在大概的看了官方文檔,又谷哥度娘了幾篇相關(guān)文章,在失敗了7次,解決了4個(gè)問(wèn)題之后,最終如愿使用compose方式上線成功,下面就將整個(gè)過(guò)程記錄下來(lái)和大家分享,所有步驟都經(jīng)過(guò)本人親測(cè),希望對(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)聽(tīng)端口
RUN bash -c 'touch /mazhichu.jar':等同于上面的拷貝jar文件到容器
ENTRYPOINT...:?jiǎn)?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',
#這行代碼解決無(wú)法訪問(wèn)的問(wèn)題
'--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': 表示使用第三代語(yǔ)法來(lái)構(gòu)建 docker-compose.yaml 文件。
services: 用來(lái)表示 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ù)庫(kù)、密碼和權(quán)限信息。
ports: 表示對(duì)外開(kāi)放的端口
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èn)題。值為"服務(wù)名:別名"或者直接使用服務(wù)名
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以這個(gè)命令來(lái)啟動(dòng)項(xiàng)目,-Dspring-boot.run.profiles=prodr表示使用 application-prod.yml文件配置信息進(jìn)行啟動(dòng)。
networks:加入指定網(wǎng)絡(luò),我這兒沒(méi)用到。
四、config文件夾詳解
config文件夾下是將宿主機(jī)本地配置掛載到docker容器中的配置,在docker-compose.yaml文件中使用volumes指定。因?yàn)閱蝹€(gè)安裝這些服務(wù)時(shí)我們也會(huì)這樣做,可以見(jiàn)文章開(kāi)頭的相關(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ù)庫(kù)唯一 ID,主從的標(biāo)識(shí)號(hào)絕對(duì)不能重復(fù)。
server-id = 1
# 開(kāi)啟 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)程訪問(wèn)慢問(wè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拷貝文件提示無(wú)權(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ù)全部完成,訪問(wèn)博客主頁(yè)http://www.mazhichu.cn,看到可以成功訪問(wèn)。
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(開(kāi)放端口)
docker-compose pull:拉取服務(wù)鏡像
docker-compose up:?jiǎn)?dòng)yml定義的所有服務(wù)
docker-compose stop:停止yml中定義的所有服務(wù)
docker-compose start:?jiǎn)?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é)在寫這篇文章之前,我從來(lái)沒(méi)有接觸過(guò)compose,以前只關(guān)注過(guò)docker一些基礎(chǔ)知識(shí),整個(gè)部署過(guò)程花了我整整一天的時(shí)間,從看文檔到查資料再到不斷試錯(cuò),最終又花了半天時(shí)間總結(jié)寫這篇文章。說(shuō)了這么多,只是想表達(dá)如果你想學(xué)習(xí)一門語(yǔ)言或者技術(shù),那你就必須走近它,必須動(dòng)手嘗試才能有真正的成長(zhǎng)和體驗(yàn),就跟你看到一個(gè)漂亮的高冷小姐姐一樣,你只有走近她才有接觸的機(jī)會(huì),只有敢于追求才有成功脫單的機(jī)會(huì),道理是一樣一樣的。最后,原創(chuàng)不易,如果鄉(xiāng)親們覺(jué)得本文不錯(cuò),麻煩幫忙右下角點(diǎn)個(gè)在看或者分享給其他有需要的人,這就是給我最大的鼓勵(lì)和堅(jiān)持原創(chuàng)的動(dòng)力了,謝謝!