简介
Docker源于集装箱。
一个集装箱装一样东西,多个集装箱可以装在同一个船上,各个集装箱之间互不影响。
类似于集装箱的标准化,Docker是一个虚拟环境容器,可以将开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。
应用场景举例:
- 不同的应用程序可能会有不同的应用环境,各种不同的环境可能还会有冲突。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小。
- 如果开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,docker可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
- 在服务器负载方面,如果单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
Docker相比于传统虚拟化方式的特点:
- docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动
- docker 需要的资源更少, docker 在操作系统级别进行虚拟化,docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化
- docker 更轻量, docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境, Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高
- 与虚拟机相比, docker 隔离性更弱, docker 属于进程之间的隔离,虚拟机可实现系统级别隔离
- 安全性: docker 的安全性也更弱。 Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击
- 可管理性: docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力
- 高可用和可恢复性: docker 对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性
- 快速创建、删除:虚拟化创建是分钟级别的, Docker 容器创建是秒级别的, Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间
- 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。 Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署
Docker的三个基本概念
Docker的三个基本概念:镜像Image、容器Container、仓库repository。
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。
-
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
-
容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
-
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。
安装
Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费,支持周期 7 个月), EE 即企业版,强调安全,付费使用,支持周期 24 个月。
以CentOS为例,安装步骤如下:
- 卸载旧版本Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
- 安装依赖包:
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 安装Docker
sudo yum install docker
- 查看版本,确认安装成功
docker version
# or
docker info
- 启动Docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
简单应用——Hello World
安装完成后,先来个简单的应用Hello World,体验一下Docker。
步骤如下:
# 将名为 hello-world 的 image 文件从仓库抓取到本地
docker pull library/hello-world # library/hello-world 是 image 文件在仓库里面的位置,其中 library 是 image 文件所在的组, hello-world 是 image 文件的名字
# 查看镜像
docker images
# 运行 image 文件
docker run hello-world
# 输出提示以后,hello world 就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。
上面可以看出, docker 的功能是十分强大的,除此之外,我们还可以拉去一些 Ubuntu , Apache 等镜像。
Docker架构
Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。
客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
Docker 的核心组件包括:
-
Docker Client
- Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。
- 客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。
- 最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。
-
Docker daemon
- Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。
- 负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。
- 该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。
- 启动 Docker Daemon 的命令:
docker --daemon = true/docker –d/docker –d = true
- 默认配置下, Docker daemon 只能响应来自本地 Host 的客户端请求。
-
Docker Image
- Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
- 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。
-
Docker Registry
- Docker registry 是存储 docker image 的仓库
- 运行docker push、docker pull、docker search时,实际上是通过 docker daemon 与 docker registry 通信。
-
Docker Container
- Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。
- Docker Container 提供了系统硬件环境,我们可以使用 Docker Images 这些制作好的系统盘,再加上我们所编写好的项目代码, run 一下就可以提供服务啦。
Docker 组件协作运行容器可以分为以下几个过程:
- Docker 客户端执行 docker run 命令
- Docker daemon 发现本地没有我们需要的镜像
- daemon 从 Docker Hub 下载镜像
- 下载完成后,镜像被保存到本地
- Docker daemon 启动容器
Docker常用命令
通过 docker -h 查看命令的详细的帮助文档。
-
查看镜像是否存在:
docker search centos
-
拉取镜像:
docker pull image_name
-
从 Docker Hub 上去下载某个镜像:
docker pull centos:latest
- centos:lastest 是镜像的名称, Docker daemon 发现本地没有我们需要的镜像,会自动去 Docker Hub 上去下载镜像,下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。
-
查看主机下镜像:
docker images
-
查看运行中的容器:
docker ps -a
-
容器启动,重启和停止:
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id
-
进入到容器使用 attach 命令:
docker attach container_name/container_id
-
运行容器中的镜像,并且调用镜像里面的 bash:
docker run -t -i container_name/container_id /bin/bash
-
删除镜像:
- 由于Image被某个Container引用,需要先停止容器:
docker ps -a; docker stop container_name/container_id
- 删除容器:
docker rm container_name/container_id
- 删除镜像:
docker rmi image_name
- 由于Image被某个Container引用,需要先停止容器: