一. 认识Docker
- Docker的目标:
通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用级别的一次封装,到处运行。
Docker虚拟化的优点
环境隔离
通过cgroups和namesapce进行实现资源隔离,实现一台机器运行多个容器互不影响。
更快速的交付部署
开发,测试和运维人员可以直接通过使用相同的环境来部署代码。
更高效的资源利用
docker容器的运行不需要额外的虚拟化管理程序的支持
内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低
更易迁移扩展
docker容器几乎可以在任意的平台上运行,包括乌力吉、虚拟机、公有云、私有云、个人电脑、服务器等
更简单的更新管理
使用Dockerfile,只需要小小的配置修改,就可以替代以往的大量的更新工作。
并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理
虚拟化与Docker对比
虚拟化定义:
虚拟化是一种资源管理技术,它是将计算机的各种实体资源予以抽象、转换后呈现出来,打破实体结构间不可切割的障碍,使用户得以更好的方式来应用这些资源。
这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。
一般所指的虚拟化资源包括计算能力和数据存储全虚拟化(Hypervisor Virtualization).
在 HostOS 中通过 Hypervisor 层实现安装多个 GuestOS.
每个 GuestOS 都有自己的内核, GuestOS 之间完全隔离。容器虚拟化(Operation System Virtualization)
使用 Linux 内核中的 namespaces 和 cgroups 实现进程组之间的隔离。
是用内核技术实现的隔离,所以它是一个共享内核的虚拟化技术。
容器虚拟化只是为运行 App 提供的一个依赖的环境,它提供的镜像是一个删减版本的系统镜像.
二. 核心概念
镜像
镜像就是一个只读的模板,可以用来创建 Docker 容器
- 创建Docker镜像本身多数是在一个现有镜像基础上创建新镜像
容器
容器是从镜像创建的运行应用的一个实例.
- 它可以被 启动, 开始, 停止, 删除.
- 每个容器都是相互隔离的,保证安全的平台.
- 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
仓库
仓库时集中存放镜像文件的场所.
有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签.
三. 镜像的基本操作
获取镜像
命令:
docker pull [<Domain>://]image-name
说明:- 镜像时Docker运行容器的前提
- 用户可以使用上面的 docker pull 从仓库里面下载镜像.
- 对镜像而言,如果不显式地指定tag, 则默认会选择 latest 标签, 即是下载仓库中最新版本的镜像.
- 默认是从 docker 官方下载镜像.也只有docker官方的镜像可以不加命名空间前缀直接进行下载.
查看镜像列表
命令:
docker images
说明:- 列出本地主机上已有的镜像
- 信息含义:来自于哪个仓库、镜像的标签信息、镜像的ID号(唯一)、创建时间、镜像大小.
查看镜像信息
命令:
docker inspect <IMAGE_ID>
说明:- 返回的是一个JSON的格式消息
- 只查看其中一项内容时,可以使用 -f 参数指定,具体格式如下:
docker inspect -f {{.Config}} <IMAGE_ID>
查找镜像
命令:
docker search <IMAGE_NAME_[TAG]>
说明:- 搜索远端仓库中共享的镜像,
- 默认搜索Docker hub官方仓库中的镜像.
删除镜像
命令:
docker rmi <IMAGE_ID | IMAGE_NAME_[TAG]>
说明:- 当同一个镜像拥有多个标签,docker rmi只是删除该镜像多个标签中的指定标签而已,而不影响镜像文件
- 如果一个镜像就有一个tag的话,删除tag就删除了镜像的本身.
- 当有该镜像创建的容器存在时,镜像文件默认是无法被删除的.
创建镜像
命令:
docker commit [OPTIONS]
参数:
-a, --author 作者信息
-m, --message 提交信息
-p, --pause=true 提交时暂停容器运行
说明:- 镜像是从某一个容器来创建的
迁出镜像
命令:
docker save [OPTIONS] <IMAGE|IMAGE_ID>
参数:
-o, --output string Write to a file, instead of STDOUT
载入镜像
命令:
docker load [OPTIONS] <IMAGE|IMAGE_ID>
参数:
-i, --input string Write to a file, instead of STDIN
上传镜像
命令:
docker push [OPTIONS] NAME[:TAG]
参数:
--disable-content-trust Skip image signing (default true)
四. 容器的基本操作
创建容器
创建停止状态的容器
docker create -ti ubuntu
创建并启动容器
docker run ubuntu/bin/echo "Hello World"
docker run 背后的故事:
STEP-1)
检查本地是否存在制定的镜像,不存在就从公有仓库下载。
STEP-2)
利用本地镜像创建并启动一个容器。
STEP-3)
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
STEP-4)
从宿主机配置的网桥接口桥接一个虚拟接口到容器中去。
STEP-5)
从地址池配置一个IP地址给容器。
STEP-6)
执行用户的指定的用户程序。
STEP-7)
执行完毕后容器被终止。一条简单命令
docker run -it ubuntu /bin/bash
-t : 让docker分配一个伪终端并绑定到容器的标准输入上。
-i : 让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,exit命令退出容器。
退出后,容器自动处于终止状态。守护台模式运行
-d : 让Docker容器运行在后台以守护态(daemonized)形式运行
docker run -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 1;done"
终止容器
docker ps [-a]
docker start/stop <CONTAINER_ID>
进入容器
docker exec -it <CONTAINER_ID> bash
守护台运行时,exec进入容器后,exit 容器不退出, 仍会在后台执行删除容器
docker rm <CONTAINER_ID>
删除正在运行的容器,需要停止容器在进行删除
使用docker rm –f 命令进行强制删除导入和导出容器
docker export/import
五. 数据管理
数据卷
数据卷是一个可供容器使用的特殊目录
,其特性如下:- 数据卷可以在容器之间共享和重用
- 数据卷修改会立即生效
- 数据卷的更新不会影响镜像
- 如果有容器使用数据卷,该卷会一直存在
在容器内创建数据卷
docker run -dti -v ${PWD}/webapp:/root/webapp:ro ubuntu bash
说明:- -v 标记可以在容器内创建一个数据卷
数据卷容器
数据卷容器用于用户需要在容器间共享一些持续更新的数据,数据卷容器专门提供数据卷供其它容器挂载使用
创建数据卷容器 db1
docker run -dti --name db1 -v /dbdata ubuntu bash
创建容器db2与db1共享dbdata的数据
docker run -dti --name db2 --volumes-from db1 ubuntu bash
数据卷容器操作需要看详细文档
数据卷容器的删除/备份/恢复