Docker 在部署中的重要性
- 直接把程序安装或部署在Linux操作系统上面,很容易引发资源冲突
- 程序卸载不干净,导致无法安装或部署新程序
- 每次部署之前要安装很多软件,修改复杂的配置文件
- 无法让服务器硬件资源实现多租户服务
- 增大了在Linux系统上部署集群和分布式的难度
Vmware 和Docker的对比
Vmware 是重量级虚拟机,每个虚拟机实例都虚拟了完整的硬件环境,所以对硬件要求较高
Docker 是轻量级虚拟机,只虚拟了少量的硬件设备,虚拟实例共享使用Linux内核
Linux之外可以用Docker吗
Docker 是跨平台的轻量级虚拟机,但是在Windows和MacOS上面有部分功能无法使用
比如说安装Keepalived程序,配置虚拟IP
云计算中的Docker虚拟机
安装Docker服务
- 安装Docker之前要先关闭centOS内置的SELINUX服务。
SELINUX是CentOS 系统捆绑的安全服务程序,因为安全策略太过于严格,所以建议大家关闭这项服务。
修改/etc/selinux/config
文件,设置SELINUX=disabled
,修改之后必须重启系统才生效。 - 使用yum命令可以很方便的安装Docker服务,并且Docker服务的管理指令也非常简单。
yum install docker -y #-y代表默认安装,不再需要确认
service docker start # 启动docker服务
service docker stop # 停止docker服务
service docker restart # 重启docker服务
什么是DockerHub?
DockerHub是Docker公共镜像库,为用户提供了大量的镜像文件。
DockerHub官方网站:https://hub.docker.com/
由于DockerHub服务器都架设在国外,国内网络访问DockerHub很慢,无法下载镜像文件,我们可以使用Docker加速器
配置Docker加速器
DaoCloud加速器采用自主研发的智能路由及缓存技术,并引入了先进的协议层优化,极大提升拉取镜像的速度和体验
# 安装DaoCloud
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
修改 /etc/docker/daemon.json
文件,去掉结尾的逗号。如果存在逗号,重启docker服务时将会报错。
[root@VM-20-14-centos ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
Docker 环境的常用指令
- 什么是Docker镜像
为了快速打包和部署软件环境,Docker引入了镜像机制
镜像是一个配置好的只读层软件环境
我们可以通过dockerfile文件创建出镜像,也可以从Docker仓库下载到镜像
- 什么是Docker容器
容器是在镜像基础上创建出的虚拟实例,内容可读可写
一个Docker 镜像可以创建出多个容器,而且容器之间互相隔离,部署的程序不会互相干扰
所有的容器直接使用宿主机的Linux内核、内存和硬盘,所以容器的性能非常接近于宿主机。(当然每个容器也支持设置占用cpu核心数、内存的上限)
- 常用的Docker命令
镜像相关
# 从DockerHub下载python 3.8镜像
docker pull python:3.8
# 查看docker已安装的镜像
docker images
# 查看镜像信息
docker inspect python:3.8
# 将安装的python镜像导出至压缩文件
docker save python:3.8 > /root/python.tar
# 删除镜像
docker rmi python:3.8
#如果有容器关联了该镜像是不允许删除的
#本地导入镜像
docker load < /root/python.tar
容器相关
# 创建Docker容器
docker run -it --name=p1 python:3.8 bash
# 容器创建后会自动进入容器,退出指令用exit,退出后容器就停止运行了,如果加上参数-d,就可以设置默认后台运行,除非执行stop命令
#查看容器状态
docker ps -a
# 重新启动容器
docker start p1
# 暂停容器运行
docker pause p1
# 恢复运行
docker unpause p1
# 进入到已经运行的容器中
docker exec -it p1 bash
# 此时执行exit命令就不会影响容器的运行
# 查看容器信息
docker inspect p1
# 删除容器
docker rm p1
# 不可以删除正在运行的容器
Docker 网络环境
默认情况下,Docker环境会给容器分配动态的IP地址,这就导致下次启动容器的时候IP地址就变了
我们可以单独创建一个Docker内部的网段,比如(172.18.0.X)
# 创建新网段,命名为mynet
docker network create --subnet=172.18.0.0/16 mynet
# 查看Docker环境已存在的网段
docker network ls
# 删除已创建网段
docker network rm mynet
# 创建容器p1,绑定IP地址(172.18.0.1是网关地址,不能用)
docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.8 bash
# 查看当前IP地址
ip addr
Docker 端口映射
默认情况下,除了宿主机之外,任何主机无法远程访问Docker容器
通过端口映射,可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了
映射到宿主机的端口,不需要设置防火墙规则,便可以使用
# 把容器的5000端口映射到宿主机的9500端口上
docker run -it -p 9500:5000 python:3.8 bash
# 可以同时映射多个端口
docker run -it -p 9500:5000 -p 9600:3306 python:3.8 bash
注意:容器只有在运行中,端口映射才生效
Docker目录挂载
为了能把一部分业务数据保存在Docker环境之外,或者把宿主机的文件传入容器,所以需要挂在宿主机的目录
Docker 环境只支持目录挂载,不支持文件挂载,而且一个容器可以挂载多个目录
# 宿主机文件夹路径:容器文件夹路径
docker run -it -v /root/test:/root/project python:3.8 bash
项目部署
创建python容器
- 创建容器
docker run -it -d --name=p1 -p 9500:5000 -v /root/project:/root/project --net mynet --ip 172.18.0.2 python:3.8 bash
- 加速pip安装拓展程序
为了加快pip命令下载安装拓展程序,可以使用国内镜像来提速
比如清华大学的镜像:https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
创建MySQL容器
- 下载MySQL镜像
# 下载指定版本的镜像
docker pull mysql:8.0.18
# 下载最新版本镜像
docker pull mysql
- 用docker run 命令创建MySQL容器,并且做好端口映射和目录挂载
# 创建mysql容器不需要-it
docker run --name=m1 -p 4306:3306 --net mynet --ip 172.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:8.0.18
创建后就可以通过软件来 连接这个数据库了
启动项目
- 将项目文件复制到容器映射的文件夹下,容器就可以直接读取了
- 运行flask项目
cd /root/project/project_2/
nohup python app.pyc > logs.txt
# nohup 可以是程序后台运行,打印内容输出至log.txt文件上
# 使用nohup,并不会回到命令行
拓展:Pypy环境
Python SDK环境内置的是Cpython解释器,而PypySDK环境内置的是Python解释器,而且带有JIT功能
通常来说同样的Python程序,在Pypy环境中,运行速度比PythonSDK快6~10倍
Pypy下载官网:http://pypy.org/download.html
# 下载Pypy镜像
docker pull pypy:3.6-7.2.0
# 创建Pypy容器
docker run -it -d --name=p2 --net mynet --ip 172.18.0.4 -p 9600:5000 -v /root/pypy_project:/root/pypy_project pypy:3.6-7.2.0 bash
# pypy环境中-it不可缺少,否则会出现闪退
# 查看pypy版本
pypy3 --version
# 进入pypy命令行
pypy3