Appearance
1、什么是 Docker
理解虚拟化技术
人们为了提高系统及硬件资源的利用率而引入了虚拟化技术。虚拟化是一种资源管理技术,它可以各种实体资源抽像后再分隔,从而打破实体结构的限制,最大程度的提高资源的利用率。
虚拟化的目的是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理和容错容灾等好处。
从实现形式来分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。
基于软件的虚拟化
软件虚拟化是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。
对软件虚拟化进行细分,又可以分为以下几类:
- 完全虚拟化
- 硬件辅助虚拟化
- 部分虚拟化
- 平行虚拟化
- 操作系统层虚拟化
Docker容器技术就是属于操作系统层虚拟化的范畴。
虚拟化是通过软件的方式模拟实体服务器,其初衷是为了解决“一种应用占用一台服务器”模式所带来的服务器数量剧增的问题,从而降低数据中心复杂度,简化管理难度。
虚拟机和Docker
容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源。
虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。
虚拟机和 Docker 的对比
图解物理机,虚拟机与容器
物理机

虚拟机
容器

虚拟机和Docker容器各自有自己的应用场景,虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。
而 Docker 通常用于隔离不同的应用 ,例如前端,后端以及数据库。
2、Docker 基本概念
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker Registry 公开服务和私有 Docker Registry
Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:https://hub.docker.com/open in new window 。官方是这样介绍 Docker Hub 的:
Docker Hub 是 Docker 官方提供的一项服务,用于与您的团队查找和共享容器镜像。
比如我们想要搜索自己想要的镜像:

在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:
- OFFICIAL Image:代表镜像为 Docker 官方提供和维护,相对来说稳定性和安全性较高。
- Stars:和点赞差不多的意思,类似 GitHub 的 Star。
- Downloads:代表镜像被拉取的次数,基本上能够表示镜像被使用的频度。
除了直接通过 Docker Hub 网站搜索镜像这种方式外,我们还可以通过 docker search 这个命令搜索 Docker Hub 中的镜像,搜索的结果是一致的。
➜ ~ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 8763 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3073 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 650 [OK]在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 阿里云镜像库。
除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry 。
Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
3、基本命令
基本命令
docker version # 查看docker版本
docker images # 查看所有已下载镜像,等价于:docker image ls 命令
docker container ls # 查看所有容器
docker ps #查看正在运行的容器
docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;拉取镜像
docker search mysql # 查看mysql相关镜像
docker pull mysql:5.7 # 拉取mysql镜像
docker image ls # 查看所有已下载镜像删除镜像
比如我们要删除我们下载的 mysql 镜像。
通过 docker rmi [image] (等价于docker image rm [image])删除镜像之前首先要确保这个镜像没有被容器引用(可以通过标签名称或者镜像 ID 删除)。
通过我们前面讲的docker ps命令即可查看。
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4cd691d9f80 mysql:5.7 "docker-entrypoint.s…" 7 weeks ago Up 12 days 0.0.0.0:3306->3306/tcp, 33060/tcp mysql可以看到 mysql 正在被 id 为 c4cd691d9f80 的容器引用,我们需要首先通过 docker stop c4cd691d9f80 或者 docker stop mysql暂停这个容器。
然后查看 mysql 镜像的 id
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f6509bac4980 3 months ago 373MB通过 IMAGE ID 或者 REPOSITORY 名字即可删除
docker rmi f6509bac4980 # 或者 docker rmi mysql4、Build Ship and Run
搜索 Docker 官网,会发现如下的字样:“Docker - Build, Ship, and Run Any App, Anywhere”。
- Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。
- Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样。
- Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。
Docker 运行过程是会去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。
Docker 也被称为码头工人或码头装卸工,这和 Docker 的中文翻译搬运工人如出一辙。

参考
