Python全栈开发之Docker
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈开发之Docker相关的知识,希望对你有一定的参考价值。
No.1 概念
为什么会出现Docker?
一款产品从生产到上线,从操作系统,到运行环境,再到应用配置,往往在开发那里可以正常运行,到了运维那里就挂了,特别是版本升级,不同版本之间的兼容问题,也让运维人员头疼不已,docker应运而生,docker将运行文件、配置环境、运行环境、运行依赖包、操作系统、内核打包成镜像
Docker理念
Docker的目标是Build,Ship and Run Any APP,Anywhere,就是对应用的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能够做到一次封装,处处运行
Docker三组件
- 镜像一个只读的模板,可以用来创建Docker容器,一个镜像可以创建多个容器,就相当于Python中的类,可以同过类创建对象
- 容器 容器可以开发、运行应用,容器就是用镜像创建的运行实例,它可以被启动、删除、停止、开始,每个容器都是相互隔离的,这样能保证平台的安全性
- 仓库集中存放镜像文件的场所,每个仓库存放好多个镜像,每个镜像有不同的标签(tag),最大的仓库是DockerHub,存放了数据庞大的镜像
Docker为什么这么快
Docker的接触是Linux(LXC)技术,在LXC的基础上进行了进一步的封装,让用户不需要考虑容器的管理,使操作更加简单,从结构上来看,虚拟机的Guest OS层和Hypervisor层被Docker Engine层所取代,我们知道Guest OS是一个完整的操作系统,Hypervisor是一个硬件虚拟化平台,Docker有着比虚拟机更加少的抽象层,不许你硬件虚拟化,运行在Docker中的应用直接使用物理机的硬件资源,因此,Docker的效率更高,Docker使用宿主机的内核,不需要Guest OS,不关心操作系统,我只需要知道我下面有一个系统就够了,从而减少了操作系统内核的时间和资源的消耗No.2 安装与配置
Ubuntu
查看本机内核版本,Docker要求内核版本必须高于3.10
uname -r
使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-‘EOF‘ { "registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
Centos
使用yum进行安装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 安装必要的一些系统工具
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker- 添加软件源信息ce/linux/centos/docker-ce.repo 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF‘
{
"registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Windows
安装Docker
- 对于Windows 10以下的用户,推荐使用Docker Toolbox
- 对于Windows 10以上的用户 推荐使用Docker for Windows
镜像加速
# 针对安装了Docker Toolbox的用户
docker-machine create --engine-registry-mirror=https://q6trwb9o.mirror.aliyuncs.com -d virtualbox default
docker-machine env default
eval "$(docker-machine env default)"
docker info
# 针对安装了Docker for Windows的用户
在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Daemon。编辑窗口内的JSON串,填写下方加速器地址:
{
"registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"]
}
Mac
安装Docker
- 对于10.10.3以下的用户 推荐使用Docker Toolbox
- 对于10.10.3以上的用户 推荐使用Docker for Mac
镜像加速
# 针对安装了Docker Toolbox的用户,
docker-machine create --engine-registry-mirror=https://q6trwb9o.mirror.aliyuncs.com -d virtualbox default
docker-machine env default
eval "$(docker-machine env default)"
docker info
# 针对安装了Docker for Mac的用户
右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中将
https://q6trwb9o.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮
No.3 Docker常用命令
帮助命令
docker version # 查看docker版本号
docker info # 显示系统相关信息
docker --help # 查看帮助信息
镜像命令
docker images [OPTIONS]列出本地主机上的镜像
OPTIONS
-a 列出本地所有的镜像
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
docker search [OPTIONS] 镜像名称 查找镜像
OPTIONS
--no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定值的镜像
--automated 只列出antomated build类型的镜像
docker rmi
docker rmi -f 镜像ID[ 镜像ID] 删除一个或多个镜像
docker rmi -f $ (docker images -qa) 删除全部镜像
容器命令
创建并启动容器 docker run [OPTIONS] image COMMAND
OPTIONS
--name 为容器指定一个新的名称
-d 后台运行容器,并返回容器ID
-i 以交互模式运行容器,通常以-t同时使用
-t 为容器重新分配一个伪输入终端
-P 随机端口映射
-p 指定端口映射
查看docker中正在运行的容器 docker ps [OPTIONS]
OPTIONS
-a 列出当前所有正在运行的容器和历史运行的容器
-l 显示最近创建的容器
-n 显示最近创建的n个容器
-q 静默模式,只显示容器编号
--no-trunc 不截断退出
退出容器
exit 容器停止并退出
ctrl+P+Q 容易不停止退出
启动容器 docker start 容器ID
重启容器 docker restart 容器ID
停止容器 docker stop 容器ID
强制停止容器 docker kill 容器ID
删除已停止的容器 docker rm 容器ID
启动守护式容器 docker run -d 容器
查看容器日志 docker logs -f -t --tail 容器ID
-t 加入时间戳
-f 跟随最新的日志打印
--tail n 显示最后n条
查看容器内运行的进程 docker top 容器ID
查看容器内部细节 docker inspect 容器ID
进入正在运行的容器并以命令行交互 docker exec -it 容器ID bashShell
docker attach 容器ID
区别是attach直接进入容器启动命令的终端,不会启动新的进程,而exec是在容器中打开新的终端,并且可以启动新的进程
从容器内拷贝文件到主机上 docker cp 容器ID:容器内路径 宿主机路径
其他命令
create # 创建一个新的容器,同 run,但不启动容器
diff # 查看 docker 容器变化
events # 从 docker 服务获取容器实时事件
export # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history # 展示一个镜像形成历史
import # 从tar包中的内容创建一个新的文件系统映像[对应export]
load # 从一个 tar 包中加载一个镜像[对应 save]
login # 注册或者登陆一个 docker 源服务器
logout # 从当前 Docker registry 退出
port # 查看映射端口对应的容器内部源端口
pause # 暂停容器
restart # 重启运行的容器
save # 保存一个镜像为一个 tar 包[对应 load]
start # 启动容器
stop # 停止容器
tag 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
wait # 截取容器停止时的退出状态值
No.4 Docker容器数据卷
容器数据卷解决什么问题
将运行的代码、环境打包成容器运行,运行可以伴随容器,但是我们希望数据是持久化的,容器之间能够共享数据,Docker容器产生的数据,如果不通过commit生成新的镜像,那么当容器删除后,数据就丢失了
特点
- 数据卷可以在容器之间共享数据和重用数据
- 数据卷的更改可以直接生效
- 数据卷的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
创建并使用数据卷
- 创建容器卷
# container表示宿主机的绝对路径,data表示容器内的目录,容器和数据之间数据是共享的,容器停止后,宿主机修改数据后,重新进入容器,数据同步 docker run -it -v /container:/data centos # 同上,区别是允许宿主机读写,容器内只能读取宿主机的数据,不能修改 docker run -it -v /container:/data ro centos
- 查看容器卷是否挂在成功
docker inspect 容器ID
数据卷容器
- 创建容器卷
什么是数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
容器间传递共享(--volumes-from)
# 先启动一个父容器dc01
docker run -it --name dc01 kernel/centos
# 在dataVolumeContainer1新增内容
touch dc01_test.txt
# dc02/dc03继承自dc01
docker run -it --name dc02 --volumes-from dc01 kernel/centos
docker run -it --name dc03 --volumes-from dc01 kernel/centos
# dc02/dc03分别在dataVolumeContainer1各自新增内容
touch dc02_test.txt
touch dc03_test.txt
# 回到dc01发现数据共享了
# 删除dc01,发现dc02和dc03能继续共享
# 删除dc02后dc03还能继续访问
# 新建dc04继承于dc03,删除dc03,dc04能继续访问
# 由此,容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
No.5 DockerFile
dockerfile是什么
dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤
-
dockerfile
-
docker build
- docker run
dockerfile解析流程
-
docker从基础镜像运行一个容器
-
执行一条指令并对容器进行修改
-
执行类似docker commit的操作提交一个新的镜像层
-
docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
docker保留关键字
- FROM 基础镜像,当前新镜像基于哪个镜像
- MAINTAINER 镜像维护者的姓名和邮箱地址
- RUN 容器构建时需要运行的命令
- EXPOSE 当前容器对外暴露的端口
- WORKDIR 指定容器被创建后,终端默认登录进来的工作目录
- ENV 用来构建镜像过程中设置的环境变量
- ADD 将宿主机目录下的文件拷贝到镜像并且ADD可以自动处理URL和解压tar包
- COPY 类似于ADD
- VOLUME 容器数据卷,用于数据保存和持久化操作
- CMD 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD,但只有最后一个生效,CMD会被docker run之后的参数替换
- ENTRYPOINT 和CMD类似,docker run之后的参数不会覆盖ENTRYPOINT,而是追加
- ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
No.6 本地镜像发布到阿里云
- 在阿里云开发者平台新建仓库镜像
- 将镜像推送到registry
以上是关于Python全栈开发之Docker的主要内容,如果未能解决你的问题,请参考以下文章