背景
內(nèi)網(wǎng)環(huán)境部署一套微服務(wù)應(yīng)用系統(tǒng),采用docker方式部署。包括mysql、redis、nginx、nacos、gateway以及應(yīng)用程序的jar包。下面記錄部署的過(guò)程和遇到的問(wèn)題。
一、內(nèi)網(wǎng)dockcer部署mysql服務(wù)
內(nèi)網(wǎng)生成mysql鏡像
- 在一個(gè)可以連接外網(wǎng)的環(huán)境中,下載mysql鏡像:
docker pull mysql:5.7
- 將鏡像打包:
docker save -o mysql.tar mysql:5.7
- 將打好的mysql.tar包傳到內(nèi)網(wǎng)服務(wù)器中,解壓:
docker load -i mysql.tar
此時(shí),內(nèi)網(wǎng)環(huán)境中就具備了mysql鏡像。執(zhí)行docker images命令可以查看是否有mysql鏡像。
mysql容器啟動(dòng)
- 在內(nèi)網(wǎng)宿主機(jī)上創(chuàng)建mysql容器的掛載目錄,分別為:
創(chuàng)建數(shù)據(jù)目錄:
mkdir /usr/local/mysql/data
創(chuàng)建配置文件目錄:
mkdir /usr/local/mysql/conf
創(chuàng)建日志目錄:
mkdir /usr/local/mysql/logs
創(chuàng)建配置文件:
cd /usr/local/mysql/conf
touch my.cnf
- 啟動(dòng)mysql容器:
docker run -p 3306:3306 --name mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.40
其中,通過(guò)-e 參數(shù)設(shè)置mysql的登錄密碼。
啟動(dòng)容器后,在/data目錄下,就有了數(shù)據(jù)庫(kù)的數(shù)據(jù)文件。
- 遠(yuǎn)程連接數(shù)據(jù)庫(kù),創(chuàng)建數(shù)據(jù)庫(kù)。至此,mysql部署完成。
踩坑記錄
如果啟動(dòng)docker容器時(shí),查看容器的日志報(bào)錯(cuò):(13: Permission denied)。
查閱資料給出的解決方案是docker啟動(dòng)容器命令增加 --privileged=true 參數(shù),但是并沒(méi)有效果。經(jīng)過(guò)多次嘗試,通過(guò)賦予宿主機(jī)mysql掛載文件權(quán)限接口:
chmod -R 777 /usr/local/mysql/
這樣就解決了容器日志報(bào)權(quán)限不足的問(wèn)題。在下面的redis容器,nginx容器部署時(shí),也報(bào)這個(gè)錯(cuò)誤,解決方案都是給掛載文件目錄賦予權(quán)限解決。
二、內(nèi)網(wǎng)dockcer部署redis服務(wù)
與mysql步驟類(lèi)似,下面記錄一下步驟過(guò)程:
- 外網(wǎng)環(huán)境拉取redis鏡像:
docker pull redis
- 鏡像文件打包:
docker save -o redis.tar redis
- 將redis.tar復(fù)制到內(nèi)網(wǎng)環(huán)境,解壓:
docker load -i redis.tar
- 內(nèi)網(wǎng)宿主機(jī)創(chuàng)建掛載目錄:
mkdir /usr/local/redis/conf
mkdir /usr/local/redis/data
touch /usr/local/redis/redis.log
chmod 777 redis.log
- 配置redis配置文件redis.conf
#bind 127.0.0.1 #注釋掉這部分,使redis可以外部訪(fǎng)問(wèn)
requirepass 123456
logfile /data/redis.log
protected-mode no
# 設(shè)置 RDB 文件名和文件路徑
dbfilename dump.rdb
dir /data
#----------------------------------------------------------------------(下面的不用修改)
# RDB 默認(rèn)的設(shè)置 ,可以按照如下規(guī)則,根據(jù)自己的實(shí)際請(qǐng)求壓力進(jìn)行設(shè)置調(diào)整。
# 如果900秒內(nèi)有1條Key信息發(fā)生變化,則進(jìn)行快照;
save 900 1
#如果300秒內(nèi)有10條Key信息發(fā)生變化,則進(jìn)行快照;
save 300 10
#如果60秒內(nèi)有10000條Key信息發(fā)生變化,則進(jìn)行快照。
save 60 10000
# 啟動(dòng)備份文件壓縮
rdbcompression yes
#redis 5之后,64位的CRC冗余校驗(yàn)碼會(huì)放在RDB文件的末尾,以對(duì)文件完整性進(jìn)行驗(yàn)證,但是在保存和加載RDB文件時(shí),會(huì)損失10%左右的性能
rdbchecksum yes
# 如果持久化出錯(cuò),主進(jìn)程是否停止寫(xiě)入
stop-writes-on-bgsave-error yes
#———————AOF配置文件—————————
# 開(kāi)啟AOF 備份
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通過(guò)dir參數(shù)設(shè)置的
dir /data
# AOF持久化的文件名,默認(rèn)是appendonly.aof
appendfilename "appendonly.aof"
# 同步策略
# appendfsync always
appendfsync everysec
# appendfsync no
# aof重寫(xiě)期間是否同步
no-appendfsync-on-rewrite no
# 觸發(fā)設(shè)置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加載aof出錯(cuò)如何處理
aof-load-truncated yes
# 文件重寫(xiě)策略
aof-rewrite-incremental-fsync yes
- 將redis.conf傳到宿主機(jī)/usr/local/redis/conf目錄下
- 啟動(dòng)鏡像:
docker run -d --name redis -p 6379:6379 --restart=always -v /usr/local/redis/conf:/usr/local/etc/redis -v /usr/local/redis/data:/data redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
三、內(nèi)網(wǎng)docker部署nginx服務(wù)
- 外網(wǎng)環(huán)境下載nginx鏡像:
docker pull nginx
docker save -o nginx.tar nginx
- 將tar包放入內(nèi)網(wǎng)環(huán)境,解壓:
docker load -i nginx.tar
- 宿主機(jī)創(chuàng)建掛載目錄:
mkdir /usr/local/nginx/web
- 第一次啟動(dòng)nginx容器,目的是復(fù)制容器內(nèi)部nginx相關(guān)文件到宿主機(jī):
docker run -d --name nginx -p 3100:80 -v /usr/local/nginx/web:/usr/share/nginx/html nginx
- 復(fù)制文件到宿主機(jī):
docker cp nginx:/etc/nginx /usr/local/nginx
此時(shí),在/usr/local/nginx/nginx下就有了nginx的相關(guān)文件,如下圖:
6. 停止并刪除剛剛啟動(dòng)的nginx容器:
docker stop nginx
docker rm nginx
- 修改上圖中conf.d/default.conf文件,配置nginx轉(zhuǎn)發(fā)信息
server {
listen 3100;
server_name localhost;
location / {
root /usr/share/nginx/html/xxx/portal; #/usr/share/nginx/html對(duì)應(yīng)/usr/local/nginx/web路徑,后面填項(xiàng)目路徑
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
location ^~ /xxx-gateway/{
proxy_pass http://xxx.xxx.xxx.xxx:9999/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 將前端工程放入到web路徑下。
- 啟動(dòng)nginx容器:
docker run -d --name nginx -p 3100:3100 -v /usr/local/nginx/nginx/:/etc/nginx -v /usr/local/nginx/web:/usr/share/nginx/html nginx
四、java服務(wù)jar包鏡像制作
nacos、gateway和應(yīng)用微服務(wù)都采用jar包形式部署,這里以nacos為例,記錄部署過(guò)程,其他服務(wù)部署方式步驟一致。
- 外網(wǎng)環(huán)境下載jdk鏡像,打包:
docker pull java:8
docker save -o java_8.tar java:8
- 將java_8.tar傳入內(nèi)網(wǎng)環(huán)境,解壓:
docker load -i java_8.tar
- 制作Dockerfile文件
FROM java:8
MAINTAINER xiaoxiaosu
#VOLUME指定臨時(shí)文件目錄為tmp,在主機(jī)/var/lib/docker目錄下創(chuàng)建一個(gè)臨時(shí)文件并連接到容器的tmp
#VOLUME /tmp
ADD jeecg-cloud-nacos-3.5.0.jar jeecg-cloud-nacos-3.5.0.jar
#運(yùn)行jar包
RUN bash -c 'touch jeecg-cloud-nacos-3.5.0.jar'
ENTRYPOINT ["java","-jar","jeecg-cloud-nacos-3.5.0.jar"]
EXPOSE 8848
- 將Dockerfile和nacos.jar傳入內(nèi)網(wǎng)服務(wù)器,且在一個(gè)目錄下,生成鏡像:
docker build -t nacos .
至此jar包鏡像生成。
- 啟動(dòng)jar包鏡像:
docker run -d --network host -p 8848:8848 --name nacos nacos
注意: --network host參數(shù)是為了讓容器共用宿主機(jī)ip,這樣就可以通過(guò)宿主機(jī)ip訪(fǎng)問(wèn)nacos了。否則無(wú)法通過(guò)宿主機(jī)ip訪(fǎng)問(wèn)nacos。其他jar包程序也是一樣。
五、使用docker-compose編排微服務(wù)
上述用了mysql、nginx、redis、nacos、gateway和三個(gè)業(yè)務(wù)微服務(wù),一個(gè)一個(gè)啟動(dòng)容器很費(fèi)力,因此使用docker-compose編排啟動(dòng)微服務(wù)。
踩坑
起初,通過(guò)depends_on參數(shù)指定各個(gè)微服務(wù)的啟動(dòng)順序。發(fā)現(xiàn)業(yè)務(wù)微服務(wù)無(wú)法注冊(cè)到nacos上,報(bào)錯(cuò)為連接nacos失敗,微服務(wù)也起不來(lái)。
網(wǎng)上搜索資料得知,depends_on是微服務(wù)啟動(dòng)成功后,依賴(lài)于它的其他微服務(wù)就立即啟動(dòng)。而nacos微服務(wù)啟動(dòng)成功后,還需等待一段時(shí)間,才能讓其他微服務(wù)去注冊(cè)。因此會(huì)出現(xiàn)注冊(cè)連接失敗的問(wèn)題。
網(wǎng)上給出的方案是使用wait-for-it腳本進(jìn)行解決。博主嘗試了一下并沒(méi)有成功,而是用另一種方式進(jìn)行了解決。
解決方案
寫(xiě)了兩個(gè)docker-compose.yml文件,一個(gè)文件里定義nginx、redis、mysql、nacos這些基礎(chǔ)組件。另一個(gè)文件里定義gateway和三個(gè)業(yè)務(wù)微服務(wù)。先一鍵啟動(dòng)有nacos的編排,再啟動(dòng)業(yè)務(wù)微服務(wù)編排。
兩個(gè)docker-compose.yml放在兩個(gè)文件夾,啟動(dòng)即可。
version: "3"
services:
nacos:
image: xxx_nacos
ports:
- "8848:8848"
networks:
- bonc
depends_on:
- mysql
nginx:
image: nginx
ports:
- "3100:3100"
volumes:
- /usr/local/nginx/nginx/:/etc/nginx
- /usr/local/nginx/web:/usr/share/nginx/html
networks:
- bonc
mysql:
image: mysql:5.7.40
container_name: mysql
ports:
- "3306:3306"
volumes:
- /usr/local/mysql/conf:/etc/mysql/conf.d
- /usr/local/mysql/logs:/logs
- /usr/local/mysql/data:/var/lib/mysql
networks:
- bonc
environment:
MYSQL_ROOT_PASSWORD: 123456
redis:
image: redis
ports:
- "6379:6379"
volumes:
- /usr/local/redis/conf:/usr/local/etc/redis
- /usr/local/redis/data:/data
networks:
- bonc
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
networks:
bonc:
external: true
version: "3"
services:
gateway:
image: xxx_gateway
ports:
- "9999:9999"
networks:
- bonc
xxxsystem:
image: xxx_xxxsystem
ports:
- "7001:7001"
networks:
- bonc
xxxsystem:
image: xxx_system
ports:
- "7019:7019"
networks:
- bonc
xxx:
image: xxx
ports:
- "7018:7018"
networks:
- bonc
networks:
bonc:
external: true
需要注意的是docker-compose需要定義自定義網(wǎng)絡(luò),然后在yml里配置networks項(xiàng)。
分別進(jìn)入兩個(gè)yml目錄下,執(zhí)行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-563092.html
docker-compose up -d
參考文章:
內(nèi)網(wǎng)如何下載docker鏡像
docker安裝mysql5.7
Nginx 的 Docker 鏡像使用教程
Docker安裝Redis鏡像文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-563092.html
到了這里,關(guān)于內(nèi)網(wǎng)環(huán)境使用docker部署微服務(wù)系統(tǒng)記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!