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
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_潜行者

赐予我力量吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值