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 -y
systemctl start sshd.service
systemctl 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 docker
systemctl 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