前置知识:
Docker 是开源的应用容器引擎。
Docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。
Portainer是一个轻量级的docker环境管理UI。
Nginx是一个高性能的HTTP和反向代理服务器。
前置安装:
安装docker
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置阿里源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
列出docker版本
yum list docker-ce --showduplicates | sort -r
安装指定版本docker
yum install -y --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
设置docker自启
sudo systemctl enable docker
启动docker
sudo systemctl start docker
安装Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
查看compose版本
docker-compose --version
准备所需镜像(根据项目实际需要拉取对应版本镜像)
docker pull mysql:5.7
docker pull redis:5.0
docker pull openjdk:8-jdk-alpine
docker pull portainer/portainer:1.22.2
文件夹目录
Dockerfile
admin-api
admin
nginx
mysql
mysql
# docker-compose.yml
version: "3"
services:
mysql:
image: mysql:5.7
restart: always
container_name: mysql
ports:
- 3306:3306
command: mysqld --transaction-isolation='READ-COMMITTED' --max_connections=1000 --sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
environment:
- MYSQL_ROOT_PASSWORD=root
- TZ=Asia/Shanghai
volumes:
- ./cache:/var/lib/mysql
启动容器
docker-compose up -d
redis
docker network create mynet
docker run -d -p 6379:6379 --network=mynet --network-alias=redis --name=redis --restart=always redis:5.0
portainer
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer --restart always portainer/portainer:1.22.2
部署admin后台
# Dockerfile
FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY api.jar .
ENV TZ Asia/Shanghai
ENV JAVA_OPS -Duser.timezone=Asia/Shanghai
EXPOSE 8088
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","./api.jar"
运行项目脚本 run.sh(./deploy/admin/api),部署api
#!/usr/bin/env bash
# 设置系统时间
DATE=$(date +%Y%m%d%H%M)
# 设置Docker镜像&容器名称
SERVER_NAME=api
#SERVER_NAME=wx-api
# 容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
# 镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
# 杀掉当前的容器及镜像
echo "The service will be stop"
docker stop $CID
# docker rmi $IID
docker rm $CID
echo "stop success!!!"
# build镜像
docker build -t $SERVER_NAME:$DATE .
echo "The service will be starting"
# 运行容器
docker run --name $SERVER_NAME -d -p 8088:8088 -v /opt/logs:/opt/logs --network mynet $SERVER_NAME:$DATE
# 钉钉消息通知机器人
curl 'https://oapi.dingtalk.com/robot/send?access_token=****************' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text",
"text": {
"content": "admin后台部署成功!!!"
}
}'
echo "starting success!!!"
部署admin 前端:
前端需要在admin文件夹下放置dist和index.html文件
docker run -d -p 8080:80 -v /Dockerfile/admin:/usr/share/nginx/html/kyjb-admin-web --nameweb nginx
nginx配置域名和证书
目录结构:
Dockerfile
nginx
cert
default.conf
docker-compose.yaml
# docker-compose.yaml
version: "3"
services:
nginx:
restart: always
container_name: nginx
image: nginx:latest
ports:
- 80:80
- 443:443
volumes:
- /Dockerfile/nginx/default.conf:/etc/nginx/conf.d/default.conf
- /Dockerfile/nginx/cert:/etc/nginx/cert
# default.conf
server {
# listen 80;
listen 443 ssl; #这个是https访问的端口
server_name ***.***.com; #域名地址
#增加ssl
#ssl on; #如果强制HTTPs访问,这行要打开
ssl_certificate cert/***.pem;#你的xxxx.pem文件名称
ssl_certificate_key cert/***.key;#你的xxxx.key文件名称
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#ssl_protocols SSLv2 SSLv3 TLSv1.2;# 指定密码为openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式
ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
#跨域Content Security Policy配置解决https中混杂http请求的问题
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /web {
proxy_pass http://****:8090;
}
location /admin {
proxy_pass http://****:8088;
}
error_page 404 /404.html;
}
注意需要在cert文件夹下放置证书(.pem和.key文件)
问题
我在windows编写的shell脚本,放在linux服务器中提示 \r命令错误。
实际上在windows中回车键都是\r\n,而在linux里没有这种情况,所以我们需要在linux里删除\r。
# 以二进制打开sh脚本
vi -b **.h
# 删除其中^M的字符