# Docker 基础

# Docker 简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

我们的开发⼈员可以通过 DockerApp 变成⼀种 标准化的可移植的⾃管理的组件,我们可以在任何主流的操作系统中开发、调试和运⾏。

# Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

# Docker vs 虚拟机

从概念上来看 Docker 和我们传统的 虚拟机 ⽐较类似,只是更加轻量级,更加⽅便使,Docker 和虚拟机最主要的区别有⼀下⼏点:

  • 虚拟化技术依赖的是 物理CPU内存,是 硬件级别 的;⽽我们的 Docker 是构建在 操作系统层⾯ 的,利⽤操作系统的 容器化技术,所以 Docker 同样的可以运⾏在虚拟机上⾯。
  • 我们知道虚拟机中的系统就是我们常说的操作系统镜像,⽐较复杂;⽽ Docker ⽐较 轻量级,我们的可以⽤ Docker 部署⼀个独⽴的 Redis,就类似于在虚拟机当中安装⼀个 Redis 应⽤,但是我们⽤ Docker 部署的应⽤是 完全隔离 的。
  • 我们都知道传统的虚拟化技术是通过 快照来保存状态 的;⽽ Docker 引⼊了类似于源码管理的机制,将容器的快照历史版本⼀⼀记录下来,切换成本⾮常之低。
  • 传统虚拟化技术在构建系统的时候⾮常复杂;⽽ Docker 可以通过⼀个简单的 Dockerfile ⽂件来 构建整个容器,更重要的是 Dockerfile 可以⼿动编写,这样应⽤程序开发⼈员可以通过发布 Dockerfile 来定义应⽤的 环境依赖 ,这样对于持续交付⾮常有利。

Docker vs 虚拟机

# Docker vs 进程

对于进程来说,它的静态表现就是程序,平常都安安静静地待在磁盘上;而一旦运行起来,它就变成了计算机里的 数据和状态的总和,这就是它的动态表现。

容器技术的核心功能,就是通过 约束和修改进程的动态表现,从而为其创造出一个“边界”

对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来 制造约束 的主要手段,而 Namespace 技术则是用来 修改进程视图 的主要方法。

Docker 容器这个听起来玄而又玄的概念,实际上是在 创建容器进程 时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。

容器,其实是一种特殊的进程而已

Namespace 技术实际上修改了 应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了 限制,只能“看到”某些指定的内容。

# Docker Engine 核心

Docker Engine 是⼀个C/S架构的应⽤程序,主要包含下⾯⼏个组件:

  • 常驻后台进程 docker daemon(dockerd)
  • ⼀个⽤来和 dockerd 交互的 REST API Server
  • 命令⾏ CLI 接⼝,通过和 REST API 进⾏交互(我们经常使⽤的 docker 命令)

Docker_Engine

# Docker 架构

Docker 使⽤ C/S (客户端/服务器)体系的架构,Docker 客户端与 Docker 守护进程 通信,Docker 守护进程 负责 构建运⾏分发 Docker 容器。Docker 客户端守护进程 可以在同⼀个系统上运⾏,也可以将 Docker 客户端 连接到 远程 Docker 守护进程Docker 客户端守护进程 使⽤ REST API 通过 UNIX 套接字⽹络接⼝ 进⾏通信。

architecture

  • Docker Damon:dockerd,⽤来监听 Docker API 的请求和管理 Docker 对象,⽐如 镜像容器⽹络Volume
  • Docker Client:docker client 是我们和 Docker 进⾏交互的最主要的⽅式⽅法,⽐如我们可以通过 docker run 命令来运⾏⼀个容器,然后我们的这个 client 会把命令发送给上⾯的 Dockerd,让他来做真正事情。
  • Docker Registry:⽤来存储 Docker 镜像的 仓库Docker HubDocker 官⽅提供的⼀个公共仓库,⽽且 Docker 默认也是从 Docker Hub 上查找镜像的,当然你也可以很⽅便的运⾏⼀个私有仓库,当我们使⽤ docker pull 或者 docker run 命令时,就会从我们配置的 Docker 镜像仓库中去 拉取镜像,使⽤ docker push 命令时,会将我们构建的镜像 推送 到对应的镜像仓库中。
  • Images:镜像,镜像是⼀个 只读模板,带有创建 Docker 容器的说明,⼀般来说的,镜像会基于另外的⼀些基础镜像并加上⼀些 额外的⾃定义功能。⽐如,你可以构建⼀个基于 Centos 的镜像,然后在这个基础镜像上⾯安装⼀个 Nginx 服务器,这样就可以构成⼀个属于我们⾃⼰的镜像了。
  • Containers:容器,容器 是⼀个镜像的 可运⾏的实例,可以使⽤ Docker REST API 或者 CLI 来操作容器,容器的实质是 进程,但与直接在宿主执⾏的进程不同,容器进程运⾏于属于⾃⼰的 独⽴的命名空间。因此容器可以拥有⾃⼰的 root ⽂件系统、⾃⼰的 ⽹络配置、⾃⼰的 进程空间,甚⾄⾃⼰的 ⽤户 ID 空间。容器内的进程是运⾏在⼀个 隔离的环境⾥,使⽤起来,就好像是在⼀个独⽴于宿主的系统下操作⼀样。这种特性使得容器封装的应⽤⽐直接在宿主运⾏ 更加安全
  • 底层技术⽀持:Namespaces(做隔离)CGroups(做资源限制)UnionFS(镜像和容器的分层)

# 安装Docker

# CentOS 7

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

# Ubuntu 14.04/16.04

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 开启Docker服务

在完成 Docker 安装之后,我们需要先启动 docker daemon 使其能够为我们提供 Docker 服务,这样我们才能正常使用 Docker

在我们通过软件包的形式安装 Docker Engine 时,安装包已经为我们在 Linux 系统中注册了一个 Docker 服务,所以我们不需要直接启动 docker daemon 对应的 dockerd 这个程序,而是直接启动 Docker 服务即可。

sudo systemctl start docker
sudo systemctl enable docker

# docker version

docker version

docker version

这个命令能够显示 Docker C/S 结构中的 服务端 ( docker daemon )客户端 ( docker CLI ) 相关的版本信息。在默认情况下,docker CLI 连接的是本机运行的 docker daemon ,由于 docker daemondocker CLI 通过 RESTful 接口 进行了 解耦,所以我们也能修改配置用于操作其他机器上运行的 docker daemon

# 配置Docker镜像源

# 修改镜像源

我们拉取Docker镜像时,一般默认会去 Docker 官方源拉取镜像。所以我们更换为 阿里云镜像仓库 源进行镜像下载加速。

创建或修改 /etc/docker/daemon.json 文件,修改为如下形式:

{
  "registry-mirrors": ["https://1bm18xvd.mirror.aliyuncs.com"]
}

# 加载重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看是否生效

docker info

docker info

docker info 这条命令的结果中,我们可以看到正在运行的 Docker Engine 实例中运行的 容器数量存储的引擎镜像源 等等信息。

# 参考

更新时间: 8/13/2020, 9:27:29 PM