微服务项目容器编排docker-compose.yml、Dockerfile文件模板、相关配置文件、shell脚本

文章详细描述了如何使用Dockerfile构建Nacos、Redis、Nginx等基础镜像,并利用docker-compose管理多个服务容器,包括配置环境变量、数据卷和依赖关系,实现高效、统一的微服务部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nacos Dockerfile(不需要特殊处理,使用docker conpose可以不写)

# 基础镜像
FROM nacos/nacos-server
# author
MAINTAINER jianglifeng<jlifeng@foxmail.com>
# 复制conf文件到路径
COPY ./conf/application.properties /home/nacos/conf/application.properties

redis Dockerfile(不需要特殊处理,使用docker conpose可以不写)

# 基础镜像
FROM redis
# author
MAINTAINER jianglifeng<jlifeng@foxmail.com>
#执行命令
RUN mkdir -p /home/nc/redis
# 挂载目录
VOLUME /home/nc/redis
# 指定路径
WORKDIR /home/nc/redis
# 复制conf文件到路径
COPY ./conf/redis.conf /home/nc/redis/redis.conf

nginx Dockerfile (不需要特殊处理,使用docker conpose可以不写)

# 基础镜像
FROM nginx
# author
MAINTAINER jianglifeng<jlifeng@foxmail.com>
#执行脚本
RUN mkdir -p /home/nc/projects/nc-ui
# 挂载目录
VOLUME /home/nc/projects/nc-ui
# 指定路径
WORKDIR /home/nc/projects/nc-ui
# 复制conf文件到路径
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./html/dist /home/nc/projects/nc-ui

业务服务 Dockerfile(直接换上对应服务的jar)

# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER jianglifeng<jlifeng@foxmail.com>
#执行脚本
RUN mkdir -p /home/nc/projects/nc-ui
# 挂载目录
VOLUME /home/nc
# 指定路径
WORKDIR /home/nc
# 启动服务,启动环境从环境变量文件.env中获取
ENTRYPOINT java -jar $JAVA_OPTS jar文件名.jar

docker-compose.yml

version : '3.7'
services:
#  生产环境使用单独的nacos
  nc-nacos:
    container_name: nc-nacos
    image: nacos/nacos-server
    build:
      context: ./nacos
    environment:
      - MODE=standalone	
      - TZ=Asia/Shanghai
    volumes:
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
  nc-redis:
    container_name: nc-redis
    image: redis
    build:
      context: ./redis
    ports:
      - "6380:6379"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./redis/conf/redis.conf:/home/nc/redis/redis.conf
      - ./redis/data:/data
    command: redis-server /home/nc/redis/redis.conf
  nc-nginx:
    container_name: nc-nginx
    image: nginx
    build:
      context: ./nginx
    ports:
      - "70:80"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./nginx/html/dist:/home/nc/projects/nc-ui
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx
    depends_on:
      - nc-gateway
    links:
      - nc-gateway
  nc-gateway:
    container_name: nc-gateway
    build:
      context: ./nc/gateway
      dockerfile: dockerfile
    ports:
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=${JAVA_OPTS}      
    volumes:
      - ./logs/nc-gateway:/home/nc/logs/nc-gateway
      - ./nc/gateway/jar/xx-gateway.jar:/home/nc/xx-gateway.jar
    depends_on:
      - nc-redis
      - nc-nacos
    links:
      - nc-redis
      - nc-nacos
  nc-auth:
    container_name: nc-auth
    build:
      context: ./nc/auth
      dockerfile: dockerfile      
    ports:
      - "9200:9200"
    environment:
      - TZ=Asia/Shanghai 
      - JAVA_OPTS=${JAVA_OPTS}     
    volumes:
      - ./logs/nc-auth:/home/nc/logs/nc-auth
      - ./nc/auth/jar/xx-auth.jar:/home/nc/xx-auth.jar
    depends_on:
      - nc-redis
      - nc-nacos
    links:
      - nc-redis
      - nc-nacos
  nc-modules-system:
    container_name: nc-modules-system
    build:
      context: ./nc/modules/system
      dockerfile: dockerfile    
    ports:
      - "9201:9201"
    # 部分环境变量从.env文件中获取
    environment:
      - OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID}
      - OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET}
      - JAVA_OPTS=${JAVA_OPTS}
      - TZ=Asia/Shanghai      
    volumes:
      - ./logs/nc-system:/home/nc/logs/nc-system
      - ./nc/xx/system/jar/xx-modules-system.jar:/home/nc/xx-modules-system.jar
    depends_on:
      - nc-redis
      - nc-nacos
    links:
      - nc-redis
      - nc-nacos

nginx配置文件(https自行编写)

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /home/nc/projects/nc-ui;
            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_pass http://ruoyi-gateway:8080/;
        }

        # 避免actuator暴露
        if ($request_uri ~ "/actuator") {
            return 403;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

脚本

docker环境变量文件
在这里插入图片描述
如果定义的环境变量名与宿主机的一样,则优先宿主机上的。

# 对象存储AK
OSS_ACCESS_KEY_ID=123
OSS_ACCESS_KEY_SECRET=321
# jvm参数
JAVA_OPTS=-Dspring.profiles.active=prev

部署脚本deploy.sh

#!/bin/sh

# 使用说明,用来提示输入参数
usage() {
	echo "Usage: sh 执行脚本.sh [port|base|modules|stop|rm]"
	exit 1
}

active=.env.$2

# 启动基础环境(必须)
base(){
	docker-compose up -d nc-redis nc-nacos
}

# 启动程序模块(必须),指定启动环境(生产、非生产)
modules(){
	docker-compose --env-file $active up -d 容器名称列表
}

# 关闭所有环境/模块
stop(){
	docker-compose stop
}

# 删除所有环境/模块
rm(){
	docker-compose rm
}

# 删除所有镜像
rmi(){
	docker rmi 镜像名称列表
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
	port
;;
"base")
	base
;;
"modules")
	modules
;;
"stop")
	stop
;;
"rm")
	rm
;;
*)
	usage
;;
esac

批量复制文件到对应目录copy.sh

#!/bin/sh

# 复制项目的文件到对应docker路径,便于一键生成镜像。
usage() {
	echo "Usage: sh copy.sh"
	exit 1
}


# copy html
echo "begin copy html "
cp -r ../jar-dist/dist/** ./nginx/html/dist


# copy jar
echo "begin copy xx-gateway "
cp ../jar-dist/xx-gateway.jar ./nc/gateway/jar

echo "begin copy xx-auth "
cp ../jar-dist/xx-auth.jar ./nc/auth/jar

echo "begin copy xx-modules-system "
cp ../jar-dist/xx-modules-system.jar ./nc/modules/system/jar

echo "begin copy xx-modules-file "
cp ../jar-dist/xx-modules-file.jar ./nc/modules/file/jar

echo "begin copy xx-modules-marketing "
cp ../jar-dist/xx-modules-marketing.jar ./nc/modules/marketing/jar


目录结构

docker/
│  copy.sh
│  deploy.sh
│  docker-compose.yml
│
├─nacos
│  │  dockerfile
│  │
│  └─conf
│          application.properties
│
├─nc
│  ├─auth
│  │  │  dockerfile
│  │  │
│  │  └─jar
│  │          readme.txt
│  │
│  ├─gateway
│  │  │  dockerfile
│  │  │
│  │  └─jar
│  │          readme.txt
│  │
│  └─modules
│      ├─file
│      │  │  dockerfile
│      │  │
│      │  └─jar
│      │          readme.txt
│      │
│      ├─marketing
│      │  │  dockerfile
│      │  │
│      │  └─jar
│      └─system
│          │  dockerfile
│          │
│          └─jar
│                  readme.txt
│
├─nginx
│  │  dockerfile
│  │
│  ├─conf
│  │      nginx.conf
│  │
│  └─html
│      └─dist
│              readme.txt
│
└─redis
    │  dockerfile
    │
    └─conf
            redis.conf

日志输出模板logback.xml(放到resources目录下)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日志存放路径 -->
	<property name="log.path" value="logs/nc-xx" />
   <!-- 日志输出格式 -->
	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>

    <!-- 系统日志输出 -->
	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
			<!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
			<!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 系统模块日志级别控制  -->
	<logger name="com.xx" level="info" />
	<!-- Spring日志级别控制  -->
	<logger name="org.springframework" level="warn" />

	<root level="info">
		<appender-ref ref="console" />
	</root>

	<!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值