Docker部署快搭鸭
前置准备
卸载服务器已安装的老版本Docker(没有安装过则跳过)
老版本的docker也被叫做:docker或docker-engine。 如果你安装这些版本,那么请卸载它,以及它的依赖项目。
1.停用全部运行中的容器:
docker stop $(docker ps -a -q)
2.删除全部容器:
docker rm $(docker ps -a -q)
3、删除所有镜像
docker rmi -f $(docker images -qa)
4、卸载docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
umount /var/lib/docker/devicemapper
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
rm -rf /var/lib/dockershim
rm -rf /etc/docker
5、查看系统已经安装了哪些docker包
yum list installed | grep docker
6、卸载相关包
yum remove docker相关包名
Linux安装Docker
默认安装:
yum install docker-ce -y
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
如果需要安装在其他位置:
1.建立软连接
ln -s /var/lib/docker 自定义安装路径
2.然后再执行默认安装指令
Linux安装Docker-Compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
对Docker-Compose授权
sudo chmod +x /usr/local/bin/docker-compose
默认安装路径为/usr/local/bin,如需更改就把以上两个指令中的默认路径替换为自定义路径即可
启动Docker
systemctl start docker
设置开机自启
systemctl enable docker.service
Windows与MacOS安装Docker Desktop:https://www.docker.com
Windows系统在安装Docker时需要在BIOS中开启虚拟化。
预留端口
部署前检查以下端口是否被占用,端口查询指令:
netstat -anp|grep 端口号
- 3306(mysql服务)
- 80、443(nginx服务)
- 6379(redis服务)
- 9000、9001(minio服务)
- 8080(快搭鸭)
如果所需端口被其他进程占用,可选择性的使用以下指令释放端口。
kill -9 进程PID
如果不想释放占用的进程,可以更改在docker文件夹中的docker-compose.yml配置文件。
3306端口被占用,更改第15行ports:- "自定义端口号:3306"。例如将mysql服务的端口改为3307则将配置文件修改为ports: - "3307:3306",下同。
80、443端口被占用,更改第38-39行ports。
6379端口被占用,更改第56行ports。
9000、9001端口被占用,更改第74、76行ports。
8080端口被占用,更改第108行ports。
1.打包后端项目
使用idea打开后端项目,在maven插件中点击切换到Profiles下的prod,再选择KuaiDaYa->->Lifecycle->package(打包前建议先使用clean)。
等待项目打包完成后,在kuaidaya-admin文件夹中添加Dockerfile文件,文件内容如下:
FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER kuaidaya
RUN mkdir -p /kuaidaya/server
RUN mkdir -p /kuaidaya/server/logs
WORKDIR /kuaidaya/server
EXPOSE 8080
ADD ../../kuaidaya-admin/target/kuaidaya-admin.jar ./app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
进入项目根目录下的script/docker文件夹中,在该文件夹中打开shell终端(Windows8.1以上可使用系统自带的Powershell,其他版本Windows自行安装shell终端),在终端中执行后续操作。
在本地Docker仓库创建项目镜像,并从本地Docker仓库中将该镜像提取为tar包:
./manage.sh pa
执行完毕后,确认当前文件夹中项目tar包完整性,一切无误后,将整个docker文件夹复制到所需部署的服务器中。
2.服务器端装载镜像
检查script/docker/docker-compose.yml文件第11行MYSQL_ROOT_PASSWORD是否与kuaidaya-admin/src/main/resources/application-prod.yml中的数据库密码一致性,以及script/docker/redis中requirepss与kuaidaya-admin/src/main/resources/application-prod.yml中redis密码的一致性。
完成上一步后在服务器端的终端中打开docker文件夹,首先对两个脚本文件授权:
sudo chmod +x ./manage.sh ./deploy.sh
将本地打包好的项目镜像装载到服务器的docker仓库中:
./manage.sh la
3.后端项目启动
镜像装载完毕后放置挂载文件:
./deploy.sh mount
启动mysql
./deploy.sh mysql
启动nginx-web
./deploy.sh nginx-web
启动redis
./deploy.sh redis
启动minio
./deploy.sh minio
启动程序模块
./deploy.sh start
停止程序模块
./deploy.sh stop
关闭所有模块
./deploy.sh stopall
重启单个服务
docker-compose restart 服务名 --(例:docker-compose restart nginx-web)
4.前端项目打包
在终端中打开kuaidaya-ui文件夹
安装前端依赖
npm install
前端项目打包
npm run build:prod
打包完成后将目录下的dist文件夹复制到服务器中nginx配置的目录下即可,PC端路径/docker/kuaidaya-web/html/kuaidaya-ui/,移动端路径/docker/kuaidaya-web/html/kuaidaya-app/。
5.相关脚本
manage.sh
#!/bin/bash
usage() {
echo "Usage: sh 执行脚本.sh [install|pa|pm|la|lm|p-all|l-all]"
exit 1
}
installDocker(){
yum install docker-ce -y & ce_pid=$(jobs -p | tail -1)
wait "${ce_pid}"
# install docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
}
installDockerCompose(){
# install docker-compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# add executable permissions
sudo chmod +x /usr/local/bin/docker-compose
# start docker
systemctl start docker
#setting autostart
systemctl enable docker.service
}
#only package admin's image
pa(){
# package the image
output=`docker build -t kuaidaya/kuaidaya-server -f ../../kuaidaya-admin/Dockerfile ../../`
# save image locally
docker save kuaidaya/kuaidaya-server>kuaidaya-server.tar
}
#only package monitor's image
pm(){
# package the image
output=`docker build -t kuaidaya/kuaidaya-monitor-admin -f ../../kuaidaya-extend/kuaidaya-monitor-admin/Dockerfile ../../`
# save image locally
docker save kuaidaya/kuaidaya-monitor-admin>kuaidaya-monitor.tar
}
#package all images
packageAll(){
output=`docker build -t kuaidaya/kuaidaya-server -f ../../kuaidaya-admin/Dockerfile ../../`
docker save kuaidaya/kuaidaya-server>kuaidaya-server.tar
output=`docker build -t kuaidaya/kuaidaya-monitor-admin -f ../../kuaidaya-extend/kuaidaya-monitor-admin/Dockerfile ../../`
docker save kuaidaya/kuaidaya-monitor-admin>kuaidaya-monitor.tar
}
la(){
docker load<kuaidaya-server.tar
}
lm(){
docker load<kuaidaya-monitor.tar
}
loadAll(){
docker load<kuaidaya-server.tar
docker load<kuaidaya-monitor.tar
}
progress() {
#进度条程序
local main_pid=$1
local length=20
local ratio=1
while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do
mark='>'
progress_bar=
for i in $(seq 1 "${length}"); do
if [ "$i" -gt "${ratio}" ] ; then
mark='-'
fi
progress_bar="${progress_bar}${mark}"
done
printf "Progress: ${progress_bar}\r"
ratio=$((ratio+1))
#ratio=`expr ${ratio} + 1`
if [ "${ratio}" -gt "${length}" ] ; then
ratio=1
fi
sleep 0.1
done
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"install")
installDocker & docker_pid=$(jobs -p | tail -1)
wait "${docker_pid}"
installDockerCompose
printf "Progress: install success \n"
;;
"pa")
pa
printf "Progress: package admin success \n"
;;
"pm")
pm
printf "Progress: package admin success \n"
;;
"la")
la & la_pid=$(jobs -p | tail -1)
progress "${la_pid}" &
progress_pid=$(jobs -p | tail -1)
wait "${la_pid}"
printf "Progress: load admin success \n"
;;
"lm")
lm & lm_pid=$(jobs -p | tail -1)
progress "${lm_pid}" &
progress_pid=$(jobs -p | tail -1)
wait "${lm_pid}"
printf "Progress: load monitor success \n"
;;
"p-all")
packageAll
printf "Progress: package all success \n"
;;
"l-all")
loadAll & loadAll_pid=$(jobs -p | tail -1)
progress "${loadAll_pid}" &
progress_pid=$(jobs -p | tail -1)
wait "${loadAll_pid}"
printf "Progress: load all image success \n"
;;
*)
usage
;;
esac
deploy.sh
#!/bin/bash
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [port|mount|monitor|base|mysql|nginx-web|redis|minio|start|stop|stopall|rm|rmiNoneTag]"
exit 1
}
#开启所需端口(生产环境不推荐开启)
port(){
# mysql 端口
firewall-cmd --add-port=3306/tcp --permanent
# redis 端口
firewall-cmd --add-port=6379/tcp --permanent
# minio api 端口
firewall-cmd --add-port=9000/tcp --permanent
# minio 控制台端口
firewall-cmd --add-port=9001/tcp --permanent
# 重启防火墙
service firewalld restart
}
##放置挂载文件
mount(){
#挂载 nginx 配置文件
if test ! -f "/docker/nginx/conf/nginx.conf" ;then
mkdir -p /docker/kuaidaya-web/conf
cp nginx/nginx.conf /docker/kuaidaya-web/conf/nginx.conf
fi
#挂载 redis 配置文件
if test ! -f "/docker/redis/conf/redis.conf" ;then
mkdir -p /docker/redis/conf
cp redis/redis.conf /docker/redis/conf/redis.conf
fi
# license 公钥
tar zxvf license.tgz -C /home
}
#启动基础模块
base(){
docker-compose up -d mysql nginx-web redis minio
}
#启动mysql
mysql(){
docker-compose up -d mysql
}
#启动nginx-web
nginx-web(){
docker-compose up -d nginx-web
}
#启动redis
redis(){
docker-compose up -d redis
}
#启动minio
minio(){
docker-compose up -d minio
}
#启动基础模块
monitor(){
docker-compose up -d kuaidaya-monitor-admin
}
#启动程序模块
start(){
docker-compose up -d kuaidaya-server1
}
#停止程序模块
stop(){
docker-compose stop kuaidaya-server1
}
#关闭所有模块
stopall(){
docker-compose stop
}
#删除所有模块
rm(){
docker-compose rm
}
#删除Tag为空的镜像
rmiNoneTag(){
docker images|grep none|awk '{print $3}'|xargs docker rmi -f
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
port
;;
"mount")
mount
;;
"base")
base
;;
"mysql")
mysql
;;
"nginx-web")
nginx-web
;;
"redis")
redis
;;
"minio")
minio
;;
"monitor")
monitor
;;
"start")
start
;;
"stop")
stop
;;
"stopall")
stopall
;;
"rm")
rm
;;
"rmiNoneTag")
rmiNoneTag
;;
*)
usage
;;
esac