Python全栈开发之Docker

No.1 概念

为什么会出现Docker?

一款产品从生产到上线,从操作系统,到运行环境,再到应用配置,往往在开发那里可以正常运行,到了运维那里就挂了,特别是版本升级,不同版本之间的兼容问题,也让运维人员头疼不已,docker应运而生,docker将运行文件、配置环境、运行环境、运行依赖包、操作系统、内核打包成镜像

Docker理念

Docker的目标是Build,Ship and Run Any APP,Anywhere,就是对应用的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能够做到一次封装,处处运行

Docker三组件

  • 镜像一个只读的模板,可以用来创建Docker容器,一个镜像可以创建多个容器,就相当于Python中的类,可以同过类创建对象
  • 容器 容器可以开发、运行应用,容器就是用镜像创建的运行实例,它可以被启动、删除、停止、开始,每个容器都是相互隔离的,这样能保证平台的安全性
  • 仓库集中存放镜像文件的场所,每个仓库存放好多个镜像,每个镜像有不同的标签(tag),最大的仓库是DockerHub,存放了数据庞大的镜像

    Docker为什么这么快

    Python全栈开发之Docker
    Python全栈开发之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

镜像加速

# 针对安装了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

镜像加速

# 针对安装了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生成新的镜像,那么当容器删除后,数据就丢失了

特点

  • 数据卷可以在容器之间共享数据和重用数据
  • 数据卷的更改可以直接生效
  • 数据卷的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

    创建并使用数据卷

    1. 创建容器卷
      # container表示宿主机的绝对路径,data表示容器内的目录,容器和数据之间数据是共享的,容器停止后,宿主机修改数据后,重新进入容器,数据同步
      docker run -it -v /container:/data centos 
      # 同上,区别是允许宿主机读写,容器内只能读取宿主机的数据,不能修改
      docker run -it -v /container:/data ro centos 
    2. 查看容器卷是否挂在成功
      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

猜你喜欢

转载自blog.51cto.com/13559120/2307471
今日推荐