第一篇:Docker基础入门

一、Docker 简介

Docker是一个开源的应用容器引擎,他诞生于由 dotCloud 公司创始人 Solomon Hykes 发起的公司内部项目,于 2013年3月以 Apache 2.0 授权协议开源。主要项目托管在GitHub,后来还进入了Linux基金会并成立 开放容器联盟(OCI),目前围绕Docker生态环境也诞生了许多优秀项目:kubernetesSwarmOpenShiftRancher

Docker 使用Go语言开发实现,主要使用 Linux 内核的Cgroup(占用资源限制)、NameSpace(环境隔离, 宿主机可查看 /sys/fs/cgroup/memory/system.slice/docker-* 文件夹查看各容器分配情况)、Aufs(分层文件系统) 等技术来完成CPU、内存、进程、网络、文件系统的隔离以及文件系统的分层存储。在快速发展中,Docker 在容器的基础上完善了文件系统、存储、网络等资源管理工具,同时提供便利的操作指令和 API 供使用者使用,这些都很大程度上简化了容器的创建、使用和维护,使得Docker 技术比虚拟机技术更为轻便,也比其他容器技术更受关注。

Cgroup 控制 CPU、内存资源分配

Namespace 做进程、网络等资源隔离

AUFS 分层镜像

Docker 通过操作系统内核的能力,在操作系统内核的基础上实现轻量级的虚拟化隔离。下图展示其与虚拟机技术的区别:

二、Docker 能做什么

Docker 并没有让事情变得更简单,他只是让我们做的事情更加流程化、标准化。Docker 在工业流程体系中更像集装箱这样的运输工具,而不是生产工具。

所以 Docker 更适合在 CI/CD 领域有所建树。我们可以像操作沙盒一样干净透明地管理要部署应用的载体,可以更方便地管理和分配应用的占用资源,也可以很方便地通过启动、停止、扩容等方式管理应用。

使用Docker的主要优点有以下方面:

  • 高效的资源利用

Docker不需要进行硬件虚拟,也不需要运行完整的操作系统,而且他还有高效的资源隔离能力,这些特性使得Docker对资源的利用率更高,相同的硬件资源情况下,使用Docker可以比使用传统虚拟机运行更多的应用。

  • 可控的运行时环境,方便交付和部署

应用在各环境中运行的环境不一致是开发和运维中的一个常见问题,这样的问题一般也比较隐蔽,所以往往会浪费我们很多时间。使用容器化部署应用可以保证应用在各个环境中的环境是一致的,这就避免了环境污染的干扰。一般我们会将应用的环境信息定义在 Dockerfile 中,交付时以 Docker Image 的方式提供给发布者,这就避免了手动配置环境时的各种异常情况,使得环境的准备工作更加高效和标准。

  • 快速的运行

因为容器本身比较轻量,而且应用的运行时环境和应用是打包在一起的,所以在不同硬件环境下,都可以快速地完成应用的启动,这一特性也方便应用做底层运行架构调整。

  • 方便维护和扩展

Docker 分层存储的技术使得不同版本应用信息可以很方便地重用,也很方便做应用的升级或回滚操作。完善的API接口和插件机制也使得扩展开发更方便。

  • 完善的生态支持和活跃的社区

自从 Docker 开源以后,很快就吸引了世人的眼光,云服务商开放相关 Docker 托管服务,也有一大批开源组织和作者开放了一些高质量的镜像方便用户直接使用。线上线下也有很多论坛和组织提供相关技术交流活动,这些都使我们可以方便地使用 Docker。

三、Docker 基本概念

Docker 是目前最流行的容器引擎。基本的 Docker 生态主要包含以下内容:

  • 镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要格外小心,每一层尽量只包含该层需要添加的东西,任何多余的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

  • 容器实例

一个镜像启动后就生成了容器实例,镜像是静态的定义,容器实例是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 在Docker中,容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

注意的是容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。因此对于需要持久化的数据或日志等,可以存储在数据卷中保存以防止容器销毁时数据的丢失。

  • 数据卷

数据卷可以将一个正常的容器或外部存储作为数据卷,让其他容器通过挂载这个容器实现数据共享。数据卷容器会降低I/O性能,方便容器做数据持久化。Docker 也支持使用 NAS、Swift 等外接存储作为数据卷供容器使用。

  • 链接

我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:WEB 服务需要连接数据库。这时我们就可以在WEB 服务中通过链接(–link 参数)来访问DB服务。

  • 仓库

镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

具体仓库相关介绍会在 Docker 仓库 中介绍。

四、Docker 安装

  • 公司服务器安装Docker

公司内部服务器已配置了 Docker 的 yum 源,因为服务器操作系统版本为 CentosOS Linux release 7.2.1511,内核版本为3.10.0,所以安装最新版本Docker(截止本文最新稳定版为17.09)会报错,所以我们采用默认 yum 安装的方式。安装 docker 和 docker-compose 步骤如下:

yum install docker -y
# 设置开机启动
systemctl enable docker
systemctl start  docker
  • 私有服务器安装Docker
yum remove  docker \
            docker-common \
            docker-selinux \
            docker-engine​yum install -y yum-utils \
            device-mapper-persistent-data \
            lvm2
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum install docker-ce
  • 安装docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 添加 export PATH=$PATH:/usr/local/bin 到 /etc/profile, 并 source /etc/profile

五、Docker 基本指令

Docker 基本指令汇合了镜像查询和安装、镜像构建和发布、实例管理和维护 等一系列操作。可以通过 docker help 来查看所有指令。这些指令中本身包含了 docker image 、docker container、docker volumn、docker registry 、docker swarm 等一系列概念,从 1.13 版本之后,可以直接通过这些子命令直接操作。

指令 指令用途
image 操作  
docker images 展示当前所有本地Docker容器镜像
docker build 构建docker镜像,一般在一个包含Dockerfile 的文件夹中执行docker build -t ${image_name}:${tag} . 来构建名字为 ${image_name},版本号为 ${tag} 的镜像
docker pull 拉取镜像,如果不指定tag,默认拉取最新版本(latest)。比如 docker pull ubuntu, docker pull ubuntu:14.04
docker push 推送镜像到镜像库,一般镜像库会有权限验证,这时需要首先使用docker login完成认证
docker history 查看一个image 操作历史信息
docker save 将一个image保存到压缩包,比如 docker save mdp-app:latest > /tmp/mdp-app.tar
docker load 从一个压缩包中load出image,和save对照。比如 docker load < /tmp/mdp-app.tar
docker import 从一个一个容器快照文件导入为image,本指令和docker export对照,导入前为容器快照文件,导入后为镜像。如 docker import /tmp/export.tar mdp-app
docker inspect 展示一个镜像的基本信息
docker tag 给镜像打标签,一般用于提交仓库前统一命名
docker rmi 删除image
container 操作  
docker search 在Docker Hub查找镜像,比如 docker search ubuntu
docker commit 提交更改过的容器并生成新的镜像。这种方式一般不使用。比如 docker commit ${CONTAINER_ID} mdp-app:1.0.1
docker export 持久化容器,导出容器快照到文件。注意不是镜像。比如 docker export ${CONTAINER_ID} > /tmp/export.tar
docker run 启动容器,可以指定 link、network、volumn、entrypoint、cmd 等参数
docker stop 停止容器
docker stop 重启容器
docker ps 查看启动的容器,docker ps -a 可以查看到所有启动过的容器,包括已经停止或退出的。
docker exec 在启动的容器中执行指令,一般查问题时使用
docker attach 挂载到一个容器上,一般使用 docker attach –sig-proxy=false ${CONTAINER_ID} 来挂载,通过 ctrl+c 退出
docker cp 在本地文件和container之间传输文件
docker rm 删除容器,只能删除已经停止的容器,除非使用 -f 参数强制删除,但一般不建议这样用。
docker logs 查看容器的基本输出,可以通过-f 参数跟踪输出
其他常用操作  
docker network docker 网络指令,一般会用 docker network ls 查看网络,docker network create ${network_name} 创建网络
docker login 登陆docker registry

发表评论

电子邮件地址不会被公开。 必填项已用*标注