SpringBoot项目docker部署过程说明--内网

环境准备

以虚拟机为例,需要安装docker环境。内网部署与互联网部署基本一致,需要在联网的服务器上下载好对应的镜像,传输到内网服务器上,再进行安装部署。

安装yum

CentOS 7 默认安装了 YUM 包管理器。
确认 YUM 是否安装以及其版本,可以使用以下命令:

yum --version

安装docker

下载docker

下载地址
https://download.docker.com/linux/static/stable/x86_64/

本次安装版本为docker-26.1.4.tgz

上传安装包

将docker离线安装包上传到虚拟机中,通过cmd命令窗口上传,或者通过xftp上传。

# 命令行上传安装包到服务器的/usr/local/docker
scp F:/wwj/Downloads/docker-26.1.4.tgz root@192.168.198.102:/usr/local/docker
# 需要输入服务器root账号密码

在虚拟机上显示对应上传的安装包。

# 进入对应的文件位置
cd /usr/local/docker
# 显示当前文件夹下的文件
ll

解压安装包

# 通过tar 命令解压安装包
tar -zxvf docker-26.1.4.tgz
# 将解压后的文件移到 /usr/bin/ 目录下
cp docker/* /usr/bin

注册docker为系统服务

打开 /ect/systemd/system/docker.service 文件

vi /etc/systemd/system/docker.service

并插入如下配置信息

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

给docker.service配置文件添加执行权限,并重新加载配置文件。

# 添加权限
chmod +x /etc/systemd/system/docker.service
# 重新加载
systemctl daemon-reload

操作docker

启动docker服务

systemctl start docker

设置docker开机自启

# 设置开机自启动
systemctl enable docker
# 关闭开机自启动
systemctl disable docker
# 查看docker是否为开机自启
 systemctl is-enabled docker

查看docker状态

systemctl status docker

停止docker服务

systemctl stop docker

reids

redis在有网络的服务器上下载镜像

# 查找镜像
docker search redis

# 下载镜像, 默认最新版本
docker pull redis:[tag]

将redis镜像保存为本地文件

将redis的镜像文件保存在当前目录下,命名为redis_images.tar的文件。

# 保存镜像文件
docker save -o redis_image.tar redis:latest

# 下载镜像, 默认最新版本
docker pull redis:[tag]

利用scp将镜像文件传输到第二台服务器

# 传输文件到/usr/local/docker/redis目录下
scp redis_images.tar root@192.168.198.102:/usr/local/docker/redis/

在第二台服务器上导入镜像

# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/redis
# 导入redis镜像
docker load -i redis_image.tar

验证镜像是否导入成功

# 查看镜像
docker images

运行容器

redis配置文件、日志文件等需要映射到宿主机的可运行,当前配置映射宿主机端口为16379,redis配置文件/usr/local/docker/redis/conf/redis.config,

# 运行redis容器
docker run -p 16379:6379 --name redis -v /usr/local/docker/redis/conf/redis.config:/etc/redis/redis.conf -v /usr/local/docker/redis/data:/data -v /usr/local/docker/redis/logs:/logs -d redis redis-server /etc/redis/redis.conf
# 查看redis容器是否运行
docker ps -a

mysql

mysql安装部署与redis相同,只有镜像和运行命令配置文件不同。

获取镜像

# docker pull mysql  默认下载最新版本
docker pull mysql:{版本号}
# 保存镜像文件
docker save -o mysql_image.tar mysql:5.7
# 传输文件到/usr/local/docker/mysql目录下
scp mysql_images.tar root@192.168.198.102:/usr/local/docker/mysql/
# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/mysql
# 导入mysql镜像
docker load -i mysql_image.tar
# 查看镜像
docker images

运行容器

  1. 创建mysql配置文件my.cnf
[client]
# 端口号
port=3306
 
[mysql]
no-beep
default-character-set=utf8mb4
 
[mysqld]
# 端口号
port=3306
# 数据目录
datadir=/var/lib/mysql
# 新模式或表时将使用的默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 将 SQL 模式设置为严格
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
#  最大连接数
max_connections=1024
# 表缓存
table_open_cache=2000
# 表内存
tmp_table_size=16M
# 线程缓存
thread_cache_size=10
# 设置大小写不敏感
lower_case_table_names=1
 
# myisam设置
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=8M
read_buffer_size=0
read_rnd_buffer_size=0
 
# innodb设置
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=48M
innodb_thread_concurrency=33
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
# 其他设置
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4161
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000
  1. 运行mysql

配置mysql宿主机映射端口、配置文件,密码等信息。

docker run --name mysql -d -p 13306:3306 --restart unless-stopped -v /usr/local/docker/mysql/log:/var/log/mysql -v /usr/local/docker/mysql/data:/var/lib/mysql -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=wwj123 mysql:5.7

后端jar包部署

后端程序打包成镜像

编写Dockerfile文件

# 使用官方Java运行环境作为基础镜像
FROM anapsix/alpine-java:8_server-jre_unlimited
# 作者
MAINTAINER wwj

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 将工作目录设置为jar
WORKDIR /jar
# 为暴露容器运行时的监听端口给外部
EXPOSE 8080
# 复制命令,将文件复制到镜像中。
ADD ./houseNumberSys-3.4.3.jar ./
# 复制配置文件到镜像中
ADD ./application-test.yml ./

# 设置容器启动时运行的命令
CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -Dspring.config.additional-location=./application-test.yml -jar houseNumberSys-3.4.3.jar

上传服务器指定位置,在该目录下打包jar后端镜像。

# 后端打包,在Dockerfile文件同级目录下执行,-t 容器名称:版本号
docker build -f Dockerfile -t jserver:1.0 .

运行后端镜像

镜像打包完成后,运行镜像,连接需要的容器,如mysql,redis等。

# 后端运行
# --net docker 自定义网络, --link 需要连接的容器名称, -p 与宿主机映射的端口,宿主机端口:容器端口
docker run --name=jserver -d -p 8080:8080 --link redis --link mysql jserver:1.0

# 查看实时日志
docker logs -f jserver01

前端部署

nginx 不包含前端代码

nginx镜像和redis一致

获取镜像

# docker pull nginx  默认下载最新版本
docker pull nginx:{版本号}
# 保存镜像文件
docker save -o nginx_image.tar nginx:latest
# 传输文件到/usr/local/docker/nginx目录下
scp nginx_images.tar root@192.168.198.102:/usr/local/docker/nginx/
# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/nginx
# 导入mysql镜像
docker load -i nginx_image.tar
# 查看镜像
docker images

nginx配置文件、日志文件、项目文件等需要映射到宿主机的可运行,保证项目文件,配置文件能方便修改。

docker run -d --name nginx -p 9000:80 -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/docker/nginx/logs:/var/log/nginx -v /usr/local/docker/nginx/html:/usr/share/nginx/html nginx

导入项目文件

打包后项目文件dist上传到服务器/usr/local/docker/nginx/html/,配置nginx的配置文件,如:

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
}

需要重载nginx配置:

# 重载配置
# docker exec <容器名称> nginx -s reload
docker exec nginx nginx -s reload

配置后端地址转发

在Docker容器中,由于IP地址不是固定的,通常不能直接在Nginx配置文件中写死后端服务的IP地址。但是,可以使用DNS解析或者Docker内置的服务发现机制来解决这个问题。
以下是一个使用Docker内置的DNS服务发现的例子:

  1. 确保你的容器都连接到同一个Docker网络。
  2. 使用容器名称而不是IP地址配置后端服务。
  3. 在Nginx配置文件中使用容器名称而不是IP地址。
    例如,假设你有一个后端服务的容器名称为backend-service,你可以这样配置Nginx:
upstream jserver {
	# jserver01 对应docker容器名称
    server jserver01:8080;
}
 
server {
    listen 80;
 
    location / {
        proxy_pass http://jserver;
    }
}

当Nginx容器启动时,它会通过Docker内置的DNS服务器解析backend-service,并且Nginx会使用解析到的正确的IP地址转发请求。
记得,每次容器启动时,确保它们都在相同的Docker网络中,这样它们才能互相解析对方的容器名称。
由于nginx配置文件是映射文件,修改完/usr/local/docker/nginx/conf.d/default.conf,需要重载nginx配置。

docker-compose 应用

一个项目涉及到redis,mysql、nginx、jar程序包多个镜像,一一启动太麻烦,docker-compose可以批量启动。

离线安装docker-compose

docker-compose是docker官方开源的项目, 需要额外安装。通过其他服务器下载docker-compose

# docker-compose是docker官方开源的项目, 需要额外安装
# 本例使用的虚拟机 centos7 
# compose 安装说明
# https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/docker/docker-compose
# 添加权限
sudo chmod +x /usr/local/bin/docker-compose
# 用scp 传输docker-compose 到另一台服务器
scp /usr/local/docker/docker-compose root@192.168.198.102:/usr/local/docker/

启动docker-compose

编写docker-compose.yml文件,例如:

# docker-compose版本, 2 指令最多, 1将被弃用
version: '2'
# 服务
services:
  # 服务名
  mysql:
    # 镜像, 可以是线上的 也可以是本地的
    image: mysql:5.7
    # 变量
    environment:
      MYSQL_ROOT_PASSWORD: wwj123
    restart: always
    # 容器名称
    container_name: mysql01
    # 启动命令, 使用command可以覆盖容器启动后默认执行的命令
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    # 映射端口
    ports:
      - 13306:3306
    # 映射docker中的日志、配置文件等挂载到宿主机上,宿主机原路径:docker容器路径
    volumes:
      - /usr/local/docker/mysql/log:/var/log/mysql
      - /usr/local/docker/mysql/data:/var/lib/mysql
      - /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf

  # redis
  # jeecg-boot-redis:
  redis:
    # 如果本地没有, 则会去仓库下载
    image: redis:latest
    # 端口映射
    ports:
      - 16379:6379
    restart: always
    # 容器名称
    container_name: redis01
    volumes:
      - /usr/local/docker/redis/conf/redis.config:/etc/redis/redis.conf
      - /usr/local/docker/redis/data:/data
      - /usr/local/docker/redis/logs:/logs

  # 后台服务
  jserver:
    # 镜像
    # image: 81.70.17.111:5000/jeecg-boot-system:1.0
    image: jserver:1.0
    restart: always
    container_name: jserver01
    # 文件路径挂载 宿主机:容器
    volumes:
      - /data/config:/jeecg-boot/config
    ports:
      - 8080:8080
    links:
      # 此处关联的是本文件中服务的名字
      - mysql
      - redis
    # 增加关联配置, server依赖 redis和mysql
    depends_on:
      - mysql
      - redis

  # web
  front:
    # image: 81.70.17.111:5000/nginxhtml
    image: front:1.0
    restart: always
    container_name: jfront01
    ports:
      - 80:80
    # 增加容器访问link
    links:
      # 此处关联的是本文件中服务的名字
      - jserver
    # 增加关联配置, 前端依赖后端server
    depends_on:
      - jserver

  # nginx
  nginx:
    # image: 81.70.17.111:5000/nginxhtml
    image: nginx:latest
    restart: always
    container_name: nginx01
    ports:
      - 9000:80
    volumes:
      - /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d
      - /usr/local/docker/nginx/logs:/var/log/nginx
      - /usr/local/docker/nginx/html:/usr/share/nginx/html
    # 增加容器访问link
    links:
      # 此处关联的是本文件中服务的名字
      - jserver
    # 增加关联配置, 前端依赖后端server
    depends_on:
      - jserver

编写完成上传到指定目录下,清除所有容器,在docker-compose.yml同级目录下运行,即可一键启动。

# 清除之前的容器
docker ps -aq|xargs docker stop|xargs docker rm

# 执行 docker-compose, 在docker-compose.yml同目录下执行
docker-compose up -d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值