总体概述
docker是什么
是什么?
- 开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
- 完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),且容器性能开销极低
- 基于 Go 语言开源的应用容器引擎,遵从 Apache2.0 协议开源
为什么?
- 一次构建,随处运行
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维;
- 一次构建,随处运行
Docker与虚拟机对比
Docker的镜像层一般很小,只有几十KB,而虚拟机则通常以GB为单位。
性能方面,Docker依附于宿主机,所以性能接近宿主机,而虚拟机相对于原主机来说性能较差。资源利用率方面,Docker的资源利用率较高,而虚拟机的资源利用率较低。隔离性方面,Docker和虚拟机都具有安全隔离的特性。Docker直接在宿主机内核上运行,而虚拟机运行在隔离层Hypervisor上。
Docker可同时运行
上千个容器,而虚拟机相对厚重,最多只能启动几十个。在运行速度方面,Docker优于虚拟机,Docker容器的启动和停止可以在
秒级实现,而传统的虚拟机方式要慢得多
架构
三个基础概念
镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器
- 镜像唯一标识是其 ID 和摘要,而一个镜像可以有多个标签
- 并非是像一个
ISO那样的打包文件,是一个虚拟的概念。是由一组文件系统组成,或者说,由多层文件系统联合组成
容器(container): Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。 可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写
仓库(repository):仓库(Repository)是集中存放镜像文件的场所
仓库注册服务器上存放着多个仓库,每个仓库中包含多个镜像,每个镜像有不同的标签(tag)
使用镜像
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像
获取镜像
Docker 镜像仓库获取镜像的命令是
docker pull$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]对Docker Hub,如果不给出用户名,则默认为
library,就是官方镜像$ docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu 92dc2a97ff99: Pull complete be13a9d27eb8: Pull complete c8299583700a: Pull complete Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26 Status: Downloaded newer image for ubuntu:18.04 docker.io/library/ubuntu:18.04
运行镜像
以
ubuntu:18.04为例,如果打算启动里面的bash并且进行交互式操作的话$ docker run -it --rm ubuntu:18.04 bash root@e7009c6ce357:/# cat /etc/os-release NAME="Ubuntu" VERSION="18.04.1 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.1 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionicdocker run就是运行容器的命令,通过exit退出了这个容器--rm:这个参数是说容器退出后随之将其删除。默认情况,为排障需求,退出的容器并不会立即删除,除非手动
docker rm。这里随便执行命令,看结果,不需要排障和保留结果,使用--rm避免浪费空间
列出镜像
要想列出已经下载下来的镜像,可以使用
docker image ls$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 5f515359c7f8 5 days ago 183 MB nginx latest 05a60462f8ba 5 days ago 181 MB列出部分镜像
$ docker image ls ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 329ed837d508 3 days ago 63.3MB ubuntu bionic 329ed837d508 3 days ago
镜像体积
- Docker Hub 所显示的大小是网络传输中更关心的流量大小。而
docker image ls显示的是镜像下载到本地后,展开的大小 docker image ls列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用
- Docker Hub 所显示的大小是网络传输中更关心的流量大小。而
删除镜像
可使用
docker image rm命令$ docker image rm [选项] <镜像1> [<镜像2> ...]<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
镜像的完整 ID,称为
长 ID短 ID一般取前3个字符以上,只要足够区分别的镜像删除行为分为两类
Untagged信息:是将满足我们要求的所有镜像标签都删除Delete信息:一个镜像对应多个标签,当我们删除了所指定的标签后,可能别的标签指向了这个镜像,那么就不删
并非所有
docker image rm都产生删除镜像行为,有可能是取消了某个标签