SDKJ_NAV《docker部署》
一. 单容器部署(前后端数据库不分离)
1. 下载ubuntu/nginx镜像,并创建容器
1.官网下载,这里选择的是 ubuntu/nginx:1.18-20.04_beta 版本
2. 通过镜像创建容器
docker run -idt --name sdkj-nav -v A:\Desktop\ubt:/home/ubuntu -p 10083:80 -p 5000:5000 ubuntu/nginx:1.18-20.04_beta
2.基础环境配置
apt update
apt install vim
apt install systemctl
...
3. 配置nginx(前端站点)
由于镜像自带了nginx,所以不需要在单独去安装
检查
service nginx status
或
systemctl status nginx
如果正在运行,打印 * nginx is running
a.创建一个Nginx站点配置文件
vim /etc/nginx/sites-available/sdkj-nav
b.将以下配置复制到文件中
server {
listen 80;
server_name localhost;
root /home/ubuntu/SDKJ_NAV/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
c. 创建一个符号链接到sites-enabled目录
ln -s /etc/nginx/sites-available/sdkj-nav /etc/nginx/sites-enabled/
d. 测试Nginx配置是否正确
nginx -t
如果配置正确,则应该看到以下输出:
nginx: configuration file /etc/nginx/nginx.conf test is successful
e. 重新启动Nginx
service nginx retart
或
systemctl restart nginx
4. 配置python环境(后端环境)
1.前往 Anaconda 官网,下载适用于 Linux 的 Anaconda 安装包
2.将下载好的安装包传输到 Ubuntu 20.04 服务器上,可以通过docker的 volume的共享文件夹
3.在 Ubuntu 20.04 服务器上安装 Anaconda,使用以下命令
bash Anaconda3-2022.10-Linux-x86_64.sh
5. 配置mongodb
0.安装 ca-certificates,用于根证书签发
apt install ca-certificates
1.添加MongoDB官方GPG密钥:
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
正确的提示语是 ok,但如果提示
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of
them is required for this operation
则补充执行安装
apt install gnupg
2.添加MongoDB软件包源:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list
echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list
3.更新APT软件包列表:
apt update
4.安装MongoDB:
apt install mongodb-org
5.启动MongoDB服务:
systemctl start mongod
6.确认MongoDB服务已经启动:
systemctl status mongod
如果服务已经启动,将会看到"active (running)"的状态。
7.设置MongoDB服务开机自启:
systemctl enable mongod
6. 配置 redis
1.安装 redis
apt install redis-server
2.运行redis
service redis-server start
或
systemctl start redis-server
3.验证redis状态
service redis-server status
或
systemctl status redis-server
二. 多容器部署(前端,后端、数据库,分离)
前后端分离是符合docker的容器单一职责的理论的,比如多个项目都要用数据库,如果每个项目都单独装一个数据库则对资源是浪费的。多容器部署具体步骤参照上面即可,这里这列出多容器部署的一些特有的需要。
例如 flask服务器中如果要访问redis和mongo数据库,如果是同一个容器中是可以访问的,如果是多个容器则无法访问,因为服务器容器中的localhost的范围仅在服务器容器本身内部,如果redis和mongo都用一个单独的容器来部署,那么部署就需要一些技术的加持,例如:容器间通信、使用Docker主机网络、等
1. 容器间通信
需要两个步骤:创建容器时候 --network=networkname、服务器配置数据库的主机名对应上容器名。
1.修改创建容器时的代码
# 创建网络
docker network create mynetwork
# 运行 Redis 和 MongoDB 容器,并将它们连接到 mynetwork
docker run -d --network=mynetwork --name=mongo -p 27017:27017 mongo:7.0
docker run -d --network=mynetwork --name=redis -p 6379:6379 redis:7.0
# 运行 Flask 容器,并将其连接到 mynetwork
docker run -itd --name sdkj_nav_backend --network=mynetwork -v A:\Desktop\ubt:/home/ubuntu -p 5000:5000 sdkj-nav-backend:1.0
2.修改服务器配置主机名部分的代码
mongodb:
db: "指南针导航系统"
# host: "localhost" #原
host: "mongo" #改
port: 27017
redis:
# host: "localhost" #原
host: "redis" #改
port: 6379
db: 0
参考代码中的引用部分(无需改动)
app = Flask(name)
app.config['MONGODB_SETTINGS'] = { # connection to databse
'db': Common.settings['mongodb']['db'],
'host': Common.settings['mongodb']['host'],
'port': Common.settings['mongodb']['port']
}
import redis
redis = redis.StrictRedis(host=Common.settings['redis']['host'],
port=Common.settings['redis']['port'],
db=Common.settings['redis']['db'])
2.使用Docker主机网络
… 实验失败
三. Dockerfile
Dockerfile 是用于构建 Docker 镜像的脚本文件。
1.前端 Dockerfile
以下是一个该项目前端Vue3的 多阶段Dockerfile(注意这是用node和nginx镜像作为基底的,文章前面手动配置的是以ubuntu/nginx作为基底的,这是不同的) :
# 使用基础镜像
FROM node:20.2.0 as builder
# 设置工作目录
WORKDIR /app
# 复制本地文件到容器中
# 其中第一个点是宿主机当前目录,第二个点是容器中的WORDIR工作目录
COPY . .
# 安装项目依赖
RUN npm install
# 执行构建
RUN npm run build
# 使用 Nginx 镜像作为运行环境
FROM nginx:1.25
# 复制构建生成的文件到 Nginx 的默认站点目录
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制自定义的 NGINX 配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露 Nginx 默认端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
# 其他配置...
}
通过Dockerfile创建自定义镜像
docker build -t sdkj-nav-front-image:1.0 .
通过镜像创建容器
docker run -itd --name sdkj-nav-front-container:1.0 -p 10080:80 sdkj-nav-front-image:1.0
2.后端Dockerfile
Dockerfile
# 使用基础镜像
FROM ubuntu:20.04
# 设置工作目录
WORKDIR /home/ubuntu/app
# 复制本地文件到容器中
COPY . .
# 下载 或 拷贝 Anaconda 安装脚本
ADD https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh /home/ubuntu/app/anaconda-installer.sh
# COPY Anaconda3-2022.10-Linux-x86_64.sh /home/ubuntu/app/anaconda-installer.sh
# 安装 Anaconda
RUN bash anaconda-installer.sh -b -p /opt/anaconda3 && \
rm anaconda-installer.sh
# 设置环境变量
ENV PATH /opt/anaconda3/bin:$PATH
# 手动激活 conda base 环境
RUN /opt/anaconda3/bin/conda init bash && \
. ~/.bashrc && \
conda activate base
# 切换 shell
SHELL ["/bin/bash", "-c"]
# 安装 pip 依赖
RUN pip install -r requirements.txt
# 运行 Python 应用
CMD ["python3", "main.py"]
创建镜像
docker build -t sdkj-nav-backend-image:1.0 .
创建容器
docker run -idt --name sdkj-nav-backend-container-1.0 --network=mynetwork -p 5000:5000 sdkj-nav-backend-image:1.0
四. Docker Compose
需要注意的是 Dockerfile 通常用于定义镜像内部的构建步骤,无法定义容器间网络,无法端口映射,等。容器间的网络通常可以通过 Docker Compose 或者 Docker 命令行中的网络配置来实现。
1.编写docker-compose.yml
version: '3.8'
services:
frontend:
image: sdkj-nav-front-cps-img:1.0 # 指定镜像名(可选)(存在则直接使用且不再运行build)(默认为 none)
container_name: sdkj-nav-Front-cps-ctn # 指定容器名 (可选)
# build context 可以去找 SDKJ_NAV_Front目录 下的 dockerfile 来生成镜像
build:
context: ./SDKJ_NAV_Front
ports:
- "80:80"
backend:
image: sdkj-nav-back-cps-img:1.0
container_name: sdkj-nav-back-cps-ctn
build:
context: ./SDKJ_NAV_Back
ports:
- "5000:5000"
depends_on:
- redis
- mongodb
networks:
- mynetwork # 通过容器间网络 mynetwork,后端就可以访问到redis和mongodb了
redis:
image: "redis:7.0"
ports:
- "6379:6379"
networks:
- mynetwork
container_name: redis # 这也是redis服务器的主机名, 后端代码 redis host 需要改为 redis(一般默认为 localhost)
mongodb:
image: "mongo:7.0"
ports:
- "27017:27017"
networks:
- mynetwork
container_name: mongo # 这也是mongo 服务器的主机名, 后端代码 mongo host 需要改为 redis(一般默认为 localhost)
# 定义网络
networks:
# 容器间网络 mynetwork,用于容器间通信
mynetwork:
driver: bridge
2.修改后端配置文件(redis和mongodb的主机名):
mongodb:
db: "xxxxxx"
host: "mongo" # 原为"localhost",现在与 redis 容器名对应
port: 27017
redis:
host: "redis" # 原为"localhost",现在与 mongo 容器名对应
port: 6379
db: 0
3.执行docker-compose.yml
docker-compose up --build
或(指定compose名字)
docker-compose -p sdkj_nav_cps up --build