CentOS 7.6 + Docker20 服务器部署记录
00. 前置说明
本案例使用 XShell 7 远程连接 CentOS 服务器,其中的一些操作说明如下:
CTRL + INSERT 复制SHIFT + INSERT 粘贴vi / vim 使用文本编辑器
- 其中,按
a / i / o 可以进入插入(INSERT)模式开始编辑。 - 按
ESC 退出编辑模式,回到命令模式,可以进行文件保存和退出操作。 - 在命令模式下输入
:wq 保存退出,输入 :q! 不保存强制退出。 - 详细操作可以参考 https://blog.csdn.net/sinat_33479559/article/details/81988515
mv 文件(夹)移动
01. 搭建环境
服务器采用容器化部署,将 MySQL:8.0.29,nginx,以及 jar 包分别安装于对应的一个容器 container 之中,容器由镜像 image 制作而成。
因此,常见的步骤是先拉取一个镜像,再使用镜像制作容器。
1.在 CentOS 中下载 jdk 17
参考链接:https://blog.csdn.net/chenshm/article/details/124358714
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar xf jdk-17_linux-x64_bin.tar.gz
mkdir -p /usr/lib/jvm && mv jdk-17.0.4.1 $_
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.4.1
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
java -version
2.创建 mysql:8.0.29 容器
docker pull mysql:8.0.29
docker run -itd -p 3306:3306 --name localhost \
-e MYSQL_ROOT_PASSWORD=[password] mysql:8.0.29
docker exec -it localhost bash
mysql -u root -p
use mysql;
create user root@'%' identified by '[password]';
grant all privileges on *.* to root@'%' with grant option;
flush privileges;
exit;
exit;
踩坑点:
- mysql 8+ 的开放权限的方式与过去的版本不太一样,如果并非 mysql 8+ 的版本可以自行搜索对应版本的权限设置方式。
- 此时可以在 navicat 上尝试连接自己的数据库,如果连接不成功,可能是防火墙设置没有开放
3306 端口!
3.创建 nginx 容器
这里 nginx 用于进行反向代理,动静分离(静态资源与 api 接口分开)以及ssl 证书配置。
由于进入 nginx 容器频繁修改配置可能较为麻烦(其实不太了解具体的步骤,有兴趣的可以自行尝试),本案例采用的是:
- 先在本机创建编辑配置文件,然后在创建容器的时候,再将本机的配置文件映射(复制)到容器之中。
- 需要先创建一个临时的 nginx 容器,并将容器中的默认配置文件复制到本机,在此基础上进行修改。
踩坑点:
- 需要特别注意的是,此后如果再次修改位于本机的配置文件,需要 重新生成 nginx 容器 。即将新的配置文件复制到新的容器之中。
- 如果要配置开放静态资源的访问,一定要将 本机中静态资源所在的文件夹 映射到 容器之中。
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/cert
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
docker run --name nginx -p 80:80 -d nginx
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html /home/nginx/
① 修改 nginx 配置:
本案例默认需要进行 ssl 配置,无需配置 ssl 的可以略过下面的上传步骤和 nginx 配置文件中监听 443 端口的 server 块。
上传 ssl 证书至对应的目录: 需要上传 crt 后缀的证书 和 key 后缀的私钥文件。
cd /home/nginx/cert
rz -be
修改 nginx 的配置文件:
vi /home/nginx/conf/nginx.conf
下面是 nginx 的配置文件:
- 其中 server 块中的
server_name 填写自己网站的域名或者 ip。 ssl_certificate / ssl_certificate_key 将 abc.com.crt 修改为自己的证书的文件名。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name abc.com;
rewrite ^ https://$http_host$request_uri? permanent;
}
server {
listen 443;
server_name abc.com;
ssl on;
ssl_certificate /etc/nginx/cert/abc.com.crt;
ssl_certificate_key /etc/nginx/cert/abc.com.key;
ssl_session_timeout 5m;
location /img/ {
root /public/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://172.17.0.3:8080/;
proxy_redirect off;
}
}
}
② 制作 nginx 容器并运行
如果需要开放访问静态文件夹的,需要在最后的 -v 下面添加一行 如 -v /public:/public 将本机的静态资源文件夹映射到容器中 否则会出现 404 Not Found 错误!
后续进行 nginx 配置文件修改,只需要重新执行下面的脚本重新生成容器即可。
docker run \
-p 80:80 \
-p 443:443 \
--restart=always \
--name nginx \
-v /home/nginx/cert:/etc/nginx/cert \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx
02. 部署 jar 包
我们需要将 jar 包制作为一个镜像,并以此创建一个容器。 第一次部署 jar 包的步骤如下,后文再具体讲述更新步骤。
1. 上传 jar 包
选择一个目录存储 jar 包并进入该目录。
rz -be
2. 编写 Dockerfile
可以复制下面的文本相应编辑后保存为 Dockerfile (无后缀),并上传到 jar 包所在目录。
或者直接通过 XShell 在 jar 包所在的目录输入 vi Dockerfile 命令创建 Dockerfile 文件,进行编辑。
修改 ADD 行和 CMD 行的 jar 包名字 ADD [目录下的jar包名字].jar /[容器中的 jar 包名字(自定义)].jar CMD ["java","-jar","[容器中的 jar 包名字].jar" ]
FROM openjdk:17
VOLUME /tmp
ADD bounty-task-0.0.1-SNAPSHOT.jar /bounty-task.jar
EXPOSE 80
ENV JAVA_HOME /usr/lib/jvm/jdk-17.0.4.1
ENV PATH $PATH:$JAVA_HOME/bin
CMD ["java","-jar","bounty-task.jar"]
3. 制作容器
在 jar 包和 Dockerfile 所在的目录执行下列的命令:
docker build -t bountytask .
docker run -itd \
–restart=always \
–name bountytask \
-p 8080:8080 \
–link localhost:localhost \
bountytask
可以先重启一次 docker:由于之前的容器都设置了 --restart=always 因此会自动随着 docker 启动而启动。
systemctl restart docker
然后通过 docker ps 可以查看正在运行的 docker 容器及其端口号。
这里如果 STATUS 显示 Restarting 可能是 jar 包有问题。 可以通过 docker logs [容器名] 可以查看 jar 包运行日志。
查看 jar 包容器的实际 ip 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bountytask
本案例是 172.17.0.4 ,需要修改之前的 nginx 的配置文件中请求转发的 ip 地址及端口号 proxy_pass ,这里的端口号为上文 制作 jar 包容器 时映射的端口号(本案例为 8080 )。
然后重新制作 nginx 容器(参见上文):
vi /home/nginx/nginx.conf
4. 测试接口
03. jar 包更新
jar 包更新,相当于上述 02 中的上传 jar 包 + 制作容器,因为 Dockerfile 是可以复用的。
① 上传新的 jar 包
其中,上传新的 jar 包前,要将原先同名的 jar 包删除:
rm -rf [jar包名]
rz -be
② 清除旧容器 & 镜像,根据新的 jar 包制作新的镜像 & 容器
这里顺序需要注意: 一定是先清除容器,才能清除镜像。 而制作时需要先制作镜像,才能制作容器。
由于 jar 包需要频繁更新,因此,可以将上面的制作镜像和容器的命令写成一个脚本,方便进行替换。
update.sh 脚本如下,具体配置自行修改,然后上传到 jar 包所在的目录:
#!/bin/bash
jarName=bountytask
function clear_old_container {
echo "################## 正在清除旧容器... ####################################"
docker stop $jarName
docker rm $jarName
}
function clear_old_image {
echo "################## 正在清除旧镜像... ####################################"
docker image rm -f $jarName || true
}
function build_image {
echo "################## $1 镜像构建中... ####################################"
echo "$1 image building..."
docker build -t $1 $2
}
clear_old_container
clear_old_image
build_image $jarName .
docker run -itd --restart=always --name $jarName -p 8080:8080 --link localhost:localhost $jarName
echo "$jarName image runing..."
echo "############## 部署完成 ############################"
由于脚本文件中存在一些换行符,会导致运行出错,因此需要先将那些换行符替换掉:
sed 's/\r//' update.sh>update2.sh
mv update2.sh update.sh
运行 update.sh 即可进行容器更新:
bash update.sh
04. 后话
半瓶水的前端第一次接触服务器相关的东西,踩了很多坑,可能容器架构的也不是很合适,特别是 jar 包与 MySQL 通信这里,因为时间的原因也没有继续深究下去。 如果大家有遇到什么问题或者有好的建议,欢迎在评论区一起探讨。
|