Skip to main content

项目部署

前言

docker这个技术已经非常成熟,同事的公司80%的项目都会用docker部署。

说docker简单,它也的确简单,只要Dockerfike和compose.yml配置好,整个项目两非常流畅和灵活。

说docker难,它也确实难,想要写好一份好的Dockerfile至少得了解docker分层的概念,充分利用分阶段构建来构建出最小最优的项目镜像。不同环境用不同的.env文件配置好compose,这都是非常考验经验又杀神的事,经常半天去了,环境还没搭建满意,就不说代码有没有码了。

构建顺序

# 首先构建数据库
# momgo
# redis

docker-compose.yaml

networks:
wxyibu:
name: wxyibu
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24

services:
redis:
image: redis:6.0.9
container_name: wxyibu-redis
networks:
wxyibu:
ipv4_address: 172.25.0.102
# restart: unless-stopped
volumes:
- /home/test/Project/app/redis/redis.conf:/app/redis.conf
- /home/test/Project/app/redis/data:/app/data
command: redis-server /app/redis.conf
ports:
- "6379:6379"

mongo:
image: mongo:4.4
container_name: wxyibu-mongodb
networks:
wxyibu:
ipv4_address: 172.25.0.103
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
volumes:
- /home/test/Project/app/db/data:/app/data
- /home/test/Project/app/db/log:/app/log
- /home/test/Project/app/db/mongodb.yaml:/app/mongodb.yaml
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
# restart: unless-stopped
command: mongod --config /app/mongodb.yaml
ports:
- "27017:27017"

# server:
# image: yibuwx-app-test:latest
# container_name: wxyibu-server
# networks:
# wxyibu:
# ipv4_address: 172.25.0.100
# command: /bin/bash
# ports:
# - "7001:7001"


Dockerfile

mongodb

初始化时创建一个权限账号:/docker-entrypoint-initdb.d/init-mongo.js

var dbname = ""
var username = ""
var passwd = ""


var db = db.getSiblingDB(dbname);
var currentTime = new Date();
var currentTimeBeijing = new Date(currentTime.getTime() + (8 * 60 * 60 * 1000));

db.createCollection("init")
db.init.insert({"init_time_UTC":currentTime, "init_time_Beijing":currentTimeBeijing })
db.createUser({user:username,pwd:passwd,roles:[{role:"dbOwner",db:dbname}]})

dockerfile

FROM mongo:4.4
LABEL maintainer="capsion@qq373704015"

# ARG DB_USER_NAME
# ARG DB_PASSWORD
ARG USER_UID
ARG USER_GID
ARG APP_PATH

# 设置 MongoDB 配置文件和初始化脚本的路径变量
# ENV MONGO_INITDB_ROOT_USERNAME=${DB_USER_NAME}
# ENV MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
ENV USER_UID=${USER_UID}
ENV USER_GID=${USER_GID}
ENV TZ=Asia/Shanghai

WORKDIR /app

# 复制 MongoDB 配置文件和初始化脚本
COPY ./init-mongo.js /docker-entrypoint-initdb.d/init-mongo.js

# 安装fixuid修复权限问题
# ADD https://github.com/boxboat/fixuid/releases/download/v0.6.0/fixuid-0.6.0-linux-amd64.tar.gz
ADD ./fixuid-0.6.0-linux-amd64.tar.gz /usr/local/bin

RUN chmod 4755 /usr/local/bin/fixuid
RUN mkdir -p /etc/fixuid
RUN echo "user: ${USER_UID}" > /etc/fixuid/config.yml
RUN echo "group: ${USER_UID}" >> /etc/fixuid/config.yml

ENV PATH=$PATH:/app

ENTRYPOINT ["fixuid"]

# CMD ["mongod", "--config", "/app/mongodb.yaml"]
CMD ["/bin/bash","-c","while true; do echo hello world; sleep 3600; done"]

EXPOSE 27017

build.sh + docker-compose.yaml

# !/bin/bash
NETWORK_NAME='TyphoonUI'

# 指定 Docker Compose 文件路径(根据实际情况修改)
DOCKER_COMPOSE_FILE="./docker compose.yaml"

# 获取当前用户的用户名
CURRENT_USER=$(whoami)

# 获取当前用户的UID和GID
CURRENT_UID=$(id -u "$CURRENT_USER")
CURRENT_GID=$(id -g "$CURRENT_USER")
APP_PATH=/home/typhoon/app/db
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=admin.typhoon

# 将UID和GID设置为全局环境变量
export CURRENT_UID CURRENT_GID APP_PATH MONGO_INITDB_ROOT_USERNAME MONGO_INITDB_ROOT_PASSWORD

# 检查指定网络是否存在
docker network inspect "$NETWORK_NAME" &>/dev/null

# 如果返回非零状态,表示网络不存在
if [ $? -ne 0 ]; then
echo "网络 $NETWORK_NAME 不存在,正在创建网络..."
docker network create --subnet=173.25.0.0/24 "$NETWORK_NAME"
if [ $? -eq 0 ]; then
echo "网络 $NETWORK_NAME 创建成功"
else
echo "创建网络 $NETWORK_NAME 失败,脚本退出"
exit 1
fi
else
echo "网络 $NETWORK_NAME 已经存在"
fi


# 执行 docker compose config,检查配置文件是否有效
docker compose config &>/dev/null

if [ $? -eq 0 ]; then
echo "docker compose 配置有效,正在启动服务..."
docker compose up -d
if [ $? -eq 0 ]; then
echo "docker compose 服务启动成功"
else
echo "docker compose 服务启动失败"
exit 1
fi
else
echo "docker compose 配置无效,请检查配置文件"
exit 1
fi

# 本文件需要配合build.sh使用
# 需要重新获取当前项目用户
# 使用docker部署容易发生权限问题
# 通过指定USER_GID和USER_UID来修复数据库文件挂载后的权限问题
networks:
TyphoonUI:
name: TyphoonUI
driver: bridge
external: true
ipam:
driver: default
config:
- subnet: 173.25.0.0/24

services:
mongo:
image: mongo:4.4
container_name: TyphoonUI-mongodb
user: "${CURRENT_UID}:${CURRENT_GID}"
networks:
TyphoonUI:
ipv4_address: 173.25.0.101
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
volumes:
- ${APP_PATH}/db:/app
- ${APP_PATH}/docker/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
command: mongod --config /app/mongodb.yaml
privileged: true
ports:
- "27018:27017"