docker部署前后端项目
学习docker部署前后端,记录步骤和报错
前置
云服务器、防火墙(防火墙关闭就不用)开放前后端端口,服务器中已有docker
防火墙相关命令:
关闭防火墙:systemctl stop firewalld
查询已开放的端口列表:firewall-cmd --zone=public --list-ports
查看想开的端口是否已开:firewall-cmd --query-port=123/tcp
添加指定需要开放的端口:firewall-cmd --add-port=123/tcp --permanent
重载入添加的端口:firewall-cmd --reload
查询指定端口是否开启成功:firewall-cmd --query-port=123/tcp
移除指定端口:firewall-cmd --permanent --remove-port=123/tcp
Docker 启动nginx 并部署前端项目
- 拉取nginx镜像:docker pull nginx
- 已对前端项目打包,可以先在idea中进行打包上传至服务器,也可以将项目上传至服务器(服务器中有npm)再打包,打包完成后会生成dist文件:
# 服务器前端打包
npm install --registry=http://registry.npmmirror.com
npm run build
- nginx配置文件挂载
创建/docker_data/nginx:mkdir -pv /docker_data/nginx
在nginx目录下创建log、conf、conf.d文件夹:mkdir log conf conf.d
dist文件复制到/docker_data/nginx/中:cp -r dist /docker_data/nginx/
- 先启动一次nginx(已有配置文件直接跳到第六步)
docker run -d -p 80:80 --name nginx nginx
- 复制nginx 的配置文件,并进行修改(已有配置文件直接下一步即可,不用操作这一步)
容器中相关位置:
日志位置:/var/log/nginx/
配置文件位置:/etc/nginx/
项目位置:/usr/share/nginx/html
配置文件复制:
docker cp nginx:/etc/nginx/nginx.conf /docker_data/nginx/conf/
docker cp nginx:/etc/nginx/conf.d /docker_data/nginx/conf.d/
cd到对应目录:
cd /docker_data/nginx/conf/
cd /docker_data/nginx/conf.d/
修改配置文件(我的配置文件在最后,可以参照修改):
vi nginx.conf
vi default.conf
- 启动容器
# 7000是我的前端端口号
docker run --name nginx -d -p 7000:7000 -v /docker_data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -v /docker_data/nginx/conf.d/default.conf:/etc/nginx/comf.d/default.conf:ro -v /docker_data/nginx/dist:/usr/share/nginx/html:rw -v /docker_data/nginx/log:/var/log/nginx nginx
部署中遇到的各种报错与解决
- 报错:没有启动成功
查看日志:docker logs nginx
原因: 配置文件出错,按照报错信息重新修改挂载文件,重启容器 docker restart nginx - 报错:nginx刷新404
解决:在配置文件中添加配置(主要在try_files上,其他是自带配置)
location / {
root /usr/share/nignx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
docker打包jar项目
- 创建目录存放jar包、已解压的jdk文件
mkdir -pv /docker_data/jar
- 将后端jar包和jdk文件放在 /docker_data/jar目录中
- 在该目录中编辑Dockerfile文件,保存退出
cd /docker_data/jar
vi Dockerfile
Dockerfile文件内容(根据自己需要更改,发现了占用更小的文件写法,文件内容在最后面):
# 基础镜像
FROM centos:centos7.9.2009
# 创建镜像中存放上传文件的文件夹,设置工作路径
RUN mkdir -pv /mydata
WORKDIR /mydata
#复制jdk文件夹到新镜像的路径下,注意:COPY上传的是文件夹里的文件
COPY jdk1.8.0_181 ./jdk1.8.0_181
# 改名,顺便看看是否有该文件夹
RUN cd /mydata && mv jdk1.8.0_181 java8
# 设置环境变量
ENV JAVA_HOME=/mydata/java8
ENV CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:$JAVA_HOME/bin
# 复制jar包
COPY app.jar ./app.jar
# 暴露端口
EXPOSE 19090
# 入口,jar文件的启动命令 # 这里app.jar就是我的jar文件
ENTRYPOINT ["java","-jar","app.jar"]
- 就在该目录下进行docker镜像构建
docker build -f Dockerfile -t myjar .
- 查看镜像
docker images
docker运行mysql容器和打包的jar容器
- 拉取mysql镜像
docker pull mysql:8.0.20
- 创建mysql挂载目录,存放数据和日志
mkdir -pv /docker_data/mysql/mysql
mkdir -pv /docker_data/mysql/log
- 运行mysql容器
docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker_data/mysql/mysql:/var/lib/mysql -v /docker_data/mysql/log:/var/log/mysql mysql:8.0.20
- 通过navicat远程连接,新建数据库并运行sql文件
- 运行myjar容器
# 19090是我的后端端口
docker run -d -p 19090:19090 --name myjar myjar
- 最后就可以通过ip:前端端口登录系统啦
部署中遇到的报错
- 报错:
原因:主要是因为在启动docker容器的时候或做docker配置的时候,还对防火墙设置重新启动等配置,这样会清除docker的相关配置,导致在查询防火墙规则的时候显示不到docker的解决方式:
# 重启docker
systemctl restart docker
- 报错:navicat运行sql文件
原因:索引字段过长
解决方法:在运行sql文件之前先对数据库进行查询操作
set global innodb_large_prefix=on;
set global innodb_file_per_table=on;
set global innodb_file_format=BARRACUDA;
set global innodb_file_format_max=BARRACUDA;
nginx相关配置文件
nginx.conf(根据自己需求修改)
# 80是项目前端端口
user nginx;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html;
#root /data/cm_app/cm_vue;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ip:后端端口/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
default.conf(根据自己需求修改)
# 80是项目前端端口
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
#root /data/cm_app/cm_vue;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ip:后端端口/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
关于dockerfile
今天看到自己的myjar镜像占用的比较多,想看看有没有更小点的打包jar包方式,于是有了下面的结果
将基础镜像换成了openjdk:8
文件内容如下,和上面的文件内容相比少了很多行:
FROM openjdk:8
# 复制jar包
COPY app.jar /tmp/app.jar
# 暴露端口
EXPOSE 19090
# 入口,jar文件的启动命令
# 这里app.jar就是我的jar文件
ENTRYPOINT ["java","-jar","/tmp/app.jar"]
之后还是通过docker build就能够打包镜像了
docker build -f dockerfile -t myjar_1 .