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

环境准备

以虚拟机为例,需要在互联网下安装docker环境。准备镜像有nginx、redis、mysql、后端jar包

1.nginx镜像(前端程序挂载到宿主机)
2.redis镜像
3. mysql镜像
4.后端包镜像

mysql

使用官方镜像

直接运行mysql,sql文件后期mysql安装完成后导出,不打包镜像。

  1. 下载mysql镜像
# docker pull mysql  默认下载最新版本
docker pull mysql:{版本号}

# 查看当前镜像是否安装成功
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 --net jnet --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

reids

Redis无特殊配置,直接使用官方镜像即可。

# 查找镜像
docker search redis

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

# 运行镜像 前为宿主机端口
docker run --name redis01 -d -p 16379:6379 redis:latest

# 使用redis-cli测试
docker exec -it redis01 /bin/bash

redis配置文件、日志文件等需要映射到宿主机的可运行

docker run -p 16379:6379 --net jnet --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

前端部署

nginx 不包含前端代码

验证启动nginx

# nginx镜像中不包含vue前端项目,nginx的配置文件挂载到宿主机指定位置
# 验证 nginx配置文件
# docker exec nginx容器名称 nginx -t
docker exec nginx1 nginx -t

# 热启动 修改完配置文件后的nginx
# docker exec nginx容器名称 nginx -s reload
docker exec nginx1 nginx -s reload

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

配置后端地址转发

在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网络中,这样它们才能互相解析对方的容器名称。

docker网络

自定义docker网络

自定义docker容器之间的网络地址,保证docker容器之间的通信。

# docker有默认网络但是默认不能直接通过容器名访问, 必须使用--link指定, 可以自定义一个网络来实现
# 查看现有网络
docker network ls

# 新增网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 jnet

查看docker容器的ip地址

使用 docker inspect 命令

# docker inspect 命令可以提供容器的详细信息,包括 IP 地址。以下是具体步骤:
# 获取容器的 ID 或名称。可以通过 docker ps 命令查看正在运行的容器列表。
docker ps

# 使用 docker inspect 命令获取容器的详细信息,并通过 grep 或 jq 工具过滤出 IP 地址。
docker inspect <container_id_or_name> | grep '"IPAddress"' | head -n 1 | awk '{print $2}' | tr -d '",'

# 或者使用 jq 工具(如果已安装):
docker inspect <container_id_or_name> | jq -r '.[0].NetworkSettings.IPAddress'

防火墙端口

防火墙端口开放

在CentOS 7上,可以使用firewalld来开放端口。以下是如何操作的步骤:

  1. 确保firewalld正在运行:
# 启动防火墙服务
systemctl start firewalld

# 停止防火墙服务
systemctl stop firewalld

# 重启防火墙服务
systemctl restart firewalld

# 查看防火墙服务状态
systemctl status firewalld

# 防火墙服务 设置开机自启
systemctl enable firewalld

# 防火墙服务 取消开机自启
systemctl disable firewalld
  1. 查看当前的防火墙规则:
firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client http ssh
  ports: 13306/tcp 8080/tcp 80/tcp 13307/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  1. 开放指定的端口(例如,开放TCP端口8080):
firewall-cmd --zone=public --add-port=8080/tcp --permanent

防火墙管理区域

阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
 
注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
  1. 重新加载防火墙以应用更改:
# 重启防火墙
firewall-cmd --reload

确保您已将上述命令中的端口号(这里是8080)和协议(这里是tcp)替换为您需要开放的实际端口号和协议。如果您需要为UDP端口开放规则,请将tcp替换为udp。

  1. 是否容器端口未与宿主机端口映射

映射方式:通过 -p 宿主机端口:容器端口

例如: # docker run -d -p 8080:80 nginx

防火墙端口开放访问不通问题排查

  1. 检查端口是否已开放
# 查看当前端口开放
firewall-cmd --list-all
  1. 关闭防火墙
# 停止防火墙
systemctl stop firewalld
# 停止并禁用开机启动
systemctl disable firewalld
  1. 检查转发是否开启
cat /proc/sys/net/ipv4/ip_forward
0

返回0, 说明没有开启
开启IP转发

# 打开/etc/sysctl.conf文件
# 配置 net.ipv4.ip_forward=1,保存并退出
vim  /etc/sysctl.conf

# 重启服务,让配置生效
systemctl restart network
  1. 检查端口开放区域是否正确

后端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 --net jnet --name=jserver -d -p 8080:8080 --link redis --link mysql jserver:1.0

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

docker-compose 应用

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

安装docker-compose

docker-compose是docker官方开源的项目, 需要额外安装。

# 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/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

启动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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值