Docker+Django项目部署-从Linux+Windows实战
一、概述
1. 什么是Docker
Docker 是一个开源的应用容器引擎,支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境,比传统的虚拟机极大的节省资源 。
- 为什么要创建隔离的环境?
假设你先在有一个centos7.6系统运行程序,而这个程序需要依赖【ubuntu系统的服务A】 + 【centos7.9的服务B】- 传统的方式:买新服务器- 虚拟化方式:在原来的NB服务器上利用虚拟化技术创建虚拟机(vmware、kvm等),用虚拟机做隔离去跑新的业务。- docker的方式:利用docker软件创建一个新的容器,用容器去做隔离区跑新的业务。
- 为什么docker可以比虚拟机极大的节省资源?
- 虚拟机的方式,是在电脑完整的创建一个操作系统。- docker的方式,创建的容器不是完整的操作系统,而是充分利用宿主机内核+进程,只是创建了一些必备的资源。

2. 概念

- DockerHub,远程镜像仓库。https://hub.docker.com/
仓库中有官方的一些镜像文件,也有开发者自定义的镜像文件。 - Images,本地镜像仓库。
可以去远程仓库下载镜像到本地仓库,后续再根据镜像为“模版”去创建容器。本地的镜像也可以发布到远程镜像库。- 镜像是之前用虚拟机创建操作系统时的ISO文件吗?
不是,此处是docker中的特殊的文件- 镜像是个什么样的文件?
镜像就是充当模版来使用,在他得内部包含打包好了的:运行所需依赖 + 业务代码。 后期基于镜像一键创建出的容器也就会自动包含依赖和业务代码,直接就可以运行了,不需要再安装+拷贝代码了。 - Containers,容器
容器就是根据镜像创造出来的一个个隔离的环境。
二、服务器准备

- 学习环境:win电脑 -> centos7虚拟机【docker】 -> docker容器
- 线上环境:云平台 -> 购买云主机【docker】 -> docker容器
1. 环境准备
- 在win电脑安装:vmware工具 + 创建centos系统(初始化)
1.1 VMware
- 下载安装:

- 虚拟化支持:


注意:开启后重启即可,如果电脑提示无法启动,则需要先进入bios在主板中设置开启支持Hyper-V。
2. CentOS系统
清华大学开源软件镜像站














>>>uname -r
>>>cat /etc/redhat-release

3. 网络配置
- 默认登录无法上网,需要配置下网络才行
3.1 Win电脑
配置DNS和网关

3.2 CentOS主机



TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 由原来的dhcp改成static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cfbd5cd7-fa17-48e6-9d13-715f33e1f08d
DEVICE=ens33
ONBOOT=yes # 由原来的no改成yes
IPADDR=192.168.115.133 # 新增,当前主机的IP
GATEWAY=192.168.115.2 # 网关
NETMASK=255.255.255.0 # 掩码
DNS1=8.8.8.8 # NDS服务器
DNS2=8.8.4.4 # NDS服务器

service network restart
systemctl restart network
重启后,可以ping百度测试:
ping baidu.com

4. 系统初始化
- 关闭selinux (vi /etc/selinux/config)
- 查看状态
getenforce - 临时关闭
setenforce 0 - 永久关闭
vi /etc/selinux/config# 设置为disabled SELINUX=disabled
- 查看状态
- 防火墙
- 查看防火墙状态
systemctl status firewalld - 关闭
systemctl stop firewalld - 关闭开机启动防火墙
systemctl disable firewalld
- 查看防火墙状态
- net-tools
yum install net-tools -y - openssh-server
yum install openssh-server -ysystemctl start sshd.servicesystemctl enable sshd.service - 可以在win上用xshell等工具SSH连接centos
- wget
yum install wget -y - centos常用工具包
yum install -y wget bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel
三、安装Docker
1. 安装docker-ce社区版
- 配置repo源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum clean all && yum makecache
- 查看可下载版本
yum list docker-ce --showduplicates | sort -r - 安装
# 最新版 yum install -y docker-ce# 指定版本 yum install -y docker-ce-23.0.6
2. 启动docker-ce社区版
-
设置开机启动
systemctl enable docker -
启动docker
systemctl start dockersystemctl restart docker

-
下载镜像
docker pull ubuntu

-
停止docker
systemctl stop docker -
其他
## 查看docker信息 docker version## 查看docker信息 docker info## docker-client which docker## docker daemon ps -ef |grep docker
3. 宿主机网卡转发(端口转发)
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/docker.conf

4. 配置镜像加速
- 类似于pip源,以后在docker中下载镜像时,使用加速器,下载就会比较快。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors注册自己的帐号

- https://www.daocloud.io/mirror#accelerator-doc注册账号也有加速器地址

sudo mkdir -p /etc/docker # 指定目录
sudo tee /etc/docker/daemon.json <<-'EOF' # 创建目录后创建文件(daemon.json),写入内容
{"registry-mirrors": ["https://t57hdrx1.mirror.aliyuncs.com","http://f1361db2.m.daocloud.io"]
}
EOF

systemctl daemon-reload
systemctl restart docker

四、实战篇:部署Flask网站
需求:基于docker创建在Ubuntu18.04系统上运行开发的Flask网站。
流程:
- 在centos7.9+安装docker
- 基于docker软件
- 获取基础镜像Ubuntu18.04
- 在基础镜像基础上构建自定义镜像【Ubuntu18.04+python+代码】
- 基于镜像创建容器+运行
4.1 下载基础镜像
https://hub.docker.com/_/ubuntu/tags



[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@192 ~]#
[root@192 ~]#
[root@192 ~]# docker pull ubuntu:18.04
[root@192 ~]#
[root@192 ~]#
18.04: Pulling from library/ubuntu
284055322776: Pull complete
Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
[root@192 ~]#
[root@192 ~]#
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 5a214d77f5d7 20 months ago 63.1MB
[root@192 ~]#
[root@192 ~]#

4.2 构建镜像
4.2.1 编写Dockerfile+语法
- 在docker宿主机centos7.9创建2个文件:
- Dockerfile
- app.py
# Dockerfile# Base images 基础镜像
FROM ubuntu:18.04 # from就是基于那个基础的镜像(基于Ubuntu:18.04)#MAINTAINER 维护者信息
LABEL MAINTAINER xxx xxx@live.com # 自定义的作者是谁#RUN 执行以下命令
RUN apt update
RUN apt install python3 python3-pip -y
RUN pip3 install flask
RUN mkdir -p /data/www/#拷贝文件至工作目录
COPY app.py /data/www/app.py#工作目录
WORKDIR /data/www/#EXPOSE 映射端口
EXPOSE 80#容器启动时执行命令
CMD ["python3","app.py"]
from flask import Flaskapp = Flask(__name__)@app.route("/index")
def index():return "欢迎光临红浪漫"if __name__ == "__main__":app.run(host="0.0.0.0",port=8000)
4.2.2 命令创建自定义镜像(模板)
docker build -t Stara/v0:0.1 . -f Dockerfile # docker build:用于从 Dockerfile 构建一个 Docker 镜像。
# -t:--tag 的简写,用于指定镜像的名称和标签。
# Stara/v0:0.1 - Stara 是镜像的仓库名称(repository)。- v0 是镜像的名称(name)。- 0.1 是镜像的标签(tag),通常用于版本控制。. 表示当前目录下寻找 Dockerfile 并构建镜像。-f 是 --file 的简写,用于指定 Dockerfile 的文件名。


4.2.3 基于镜像创建容器+运行
docker run xxx/web1:1.0
# 但是网站对外访问不了,要做端口转发

docker run -p 80:8000 xxx/web1:1.0
# 80 当前宿主机centos监听的端口,转发给8000(代码写的8000)



docker run -d -p 80:8000 xxx/web1:1.0
# -d表示在后台运行,代码不需要停止,返回的这一串是创建的容器id


docker ps
# 罗列出来目前正在运行的所有容器,用的同一个镜像,容器名字随机生成的

docker run -d -p 84:8000 --name v222 xxx/web1:1.0
# 指定名字叫v222

# 查看所有容器,包括正在运行的和已经停止的docker ps -a

# 停止容器 ID 为 550(前三位id数字) 的容器
docker stop 550

# 停下来没有用了,删除
docker rm 550

4.3 在Dockerfile编写的指令意思
- FROM 指定基础镜像,必须为第一个命令
格式:FROM <image>FROM <image>:<tag> 示例:FROM mysql:5.7 注意:tag是可选的,如果不使用tag时,会使用latest版本的基础镜像 - MAINTAINER 镜像维护者的信息
格式:MAINTAINER <name> 示例:MAINTAINER xxxMAINTAINER xxx@live.comMAINTAINER xxx<wupeiqi@live.com> - ENV
格式:ENV <key> <value>ENV <key>=<value> 示例:ENV myName JohnENV myCat=fluffy - COPY|ADD 添加本地文件到镜像中
格式:COPY <src>... <dest> 示例:ADD hom* /mydir/ # 添加所有以"hom"开头的文件ADD test relativeDir/ # 添加 "test" 到 $WORKDIR/relativeDir/ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/注意:针对压缩包使用ADD的话,会自动解压。 - WORKDIR 工作目录
格式:WORKDIR /path/to/workdir 示例:WORKDIR /a (这时工作目录为/a) 注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行 - RUN 构建镜像过程中执行命令
格式:RUN <command> 示例:RUN yum install nginxRUN pip install djangoRUN mkdir test && rm -rf /var/lib/unusedfiles 注意:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
相关文章:
Docker+Django项目部署-从Linux+Windows实战
一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎,支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境,比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境? 假设你先在有一个centos7.…...
前端 JS 实用操作总结
目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…...
11.15 机器学习-集成学习方法-随机森林
# 机器学习中有一种大类叫**集成学习**(Ensemble Learning),集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话: # 三个臭皮匠,…...
【SQL】E-R模型(实体-联系模型)
目录 一、介绍 1、实体集 定义和性质 属性 E-R图表示 2. 联系集 定义和性质 属性 E-R图表示 一、介绍 实体-联系数据模型(E-R数据模型)被开发来方便数据库的设计,它是通过允许定义代表数据库全局逻辑结构的企业模式…...
C/C++静态库引用过程中出现符号未定义的处理方式
问题背景: 在接入新库(静态库)时遇到了符号未定义问题,并发现改变静态库的链接顺序可以解决问题。 问题根源: 静态库是由 .o 文件拼接而成的,链接静态库时,链接器以 .o 文件为单位进行处理。链接…...
『VUE』27. 透传属性与inheritAttrs(详细图文注释)
目录 什么是透传属性(Forwarding Attributes)使用条件唯一根节点禁用透传属性继承总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 什么是透传属性(Forwarding Attributes) 在 V…...
借助Excel实现Word表格快速排序
实例需求:Word中的表格如下图所示,为了强化记忆,希望能够将表格内容随机排序,表格第一列仍然按照顺序编号,即编号不跟随表格行内容调整。 乱序之后的效果如下图所示(每次运行代码的结果都不一定相同&#x…...
数据结构 ——— 层序遍历链式二叉树
目录 链式二叉树示意图编辑 何为层序遍历 手搓一个链式二叉树 实现层序遍历链式二叉树 链式二叉树示意图 何为层序遍历 和前中后序遍历不同,前中后序遍历链式二叉树需要利用递归才能遍历 而层序遍历是非递归的形式,如上图:层序遍历的…...
使用 Prompt API 与您的对象聊天
tl;dr:GET、PUT、PROMPT。现在,可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中,我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机: 对象存储和 S3 API 的无处不在…...
SpringBoot整合Mybatis-Plus实践汇总
相关依赖 MyBatis-Plus涉及的依赖主要是Mybatis-start、和分页插件的依赖,不考虑使用额外分页插件的前提下,只需要mybatis-plus-boot-starter一个依赖即可与SpringBoot集成: <!--Mybatis-plugs--><dependency><groupId>co…...
基于Spring Boot的在线性格测试系统设计与实现(源码+定制+开发)智能性格测试与用户个性分析平台、在线心理测评系统的开发、性格测试与个性数据管理系统
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Python实现人脸识别算法并封装为类库
引言 人脸识别技术在现代社会中应用广泛,从安全监控到智能门锁,再到社交媒体中的照片标记功能,都离不开这项技术。本文将详细介绍如何使用Python实现基本的人脸识别算法,并将其封装为一个类库,以便在多个项目中复用。…...
uniapp小程序分享使用canvas自定义绘制 vue3
使用混入结合canvas做小程序的分享 在混入里面定义一个全局共享的分享样式,在遇到特殊页面需要单独处理 utils/share.js import { ref } from vue; export default {onShow() {// 创建时设置统一页面的默认值uni.$mpShare {title: 分享的标题,path: /pages/home/…...
SpringCloud核心组件(四)
文章目录 NacosNacos 配置中心1.起源2.基本概念ProfileData IDGroup 3.基础配置a. bootstrap.ymlb. application.ymlc. nacos 中的配置 DataIDd.测试读取配置中心配置内容 4.配置隔离a.命名空间b.DataIDc.bootstrap.ymld.service 隔离 5.配置拆分a.配置拆分策略b.DataID 配置c.…...
如何把本地docker 镜像下载用到centos系统中呢?
如果需要将镜像下载到本地或在 CentOS 系统上使用该镜像,你可以按照以下步骤操作: 1. 拉取镜像 如果想将镜像从 Docker Hub 或其他镜像仓库下载到本地,可以使用 docker pull 命令。 如果使用的是本地构建的镜像(如 isc:v1.0.0&…...
Godot的开发框架应当是什么样子的?
目录 前言 全局协程还是实例协程? 存档! 全局管理类? UI框架? Godot中的异步(多线程)加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈,主要内容是对我…...
GitHub新手入门 - 从创建仓库到协作管理
GitHub新手入门 - 从创建仓库到协作管理 GitHub 是开发者的社交平台,同时也是代码托管的强大工具。无论是个人项目、开源协作,还是团队开发,GitHub 都能让你轻松管理代码、版本控制和团队协作。今天,我们将从基础开始,…...
作业25 深度搜索3
作业: #include <iostream> using namespace std; bool b[100][100]{0}; char map[100][100]{0}; int dx[4]{0,1,0,-1}; int dy[4]{1,0,-1,0}; int n,m; int sx,sy,ex,ey; int mink2147483647; void dfs(int,int,int); int main(){cin>>n>>m;for(…...
ubuntu20.04 colmap 安装2024.11最新
很多教程都很落后了,需要下载压缩包解压编译的很麻烦 现在就只需要apt install就可以了 apt更新 sudo apt update && sudo apt-get upgrade安装依赖 #安装依赖 sudo apt-get install git cmake ninja-build build-essential libboost-program-options-de…...
WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇
WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule [WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇](本文) WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 的算法。 class Solution {public int searchInsert(int[] nums, …...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
