Docker理论知识

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
  Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
  Docker EE专为企业的发展和IT团队建立,为企业提供最安全的容器平台,以应用为中心的平台,有专门的团队支持,可在经过认证的操作系统和云提供商中使用,并可运行来自DockerStore的经过认证的容器和插件。
  Docker CE是免费的Docker产品的新名称,Docker CE包含了完整的Docker平台,非常适合开发人员和运维团队构建容器APP。

1.Docker的三个基本概念

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

2.Docker架构

Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker SDK与 Docker 的守护进程通信。
Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry:Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

3.Docker的优点

灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:可以即时部署更新和升级。
便携式:可以在本地构建,部署到云,并在任何地方运行。
可扩展:可以增加并自动分发容器副本。
可堆叠:可以垂直和即时堆叠服务。
在同一硬件上运行更多工作负载。
允许高度可移植的工作负载

4.Docker私有仓库

  官方的Docker Hub是一个用于管理公共镜像的仓库,用户可以在上面找到需要的镜像,也可以把私有镜像推送上去。但是,在生产环境中,往往需要拥有一个私有的镜像仓库用于管理镜像,通过开源软件Registry可以实现这个目标。
  Registry在Github上有两份代码:老代码库和新代码库。老代码是采用Python编写的,存在pull和push的性能问题,在0.9.1版本之后就标志为deprecated,意思为不再继续开发。从2.0版本开始,Registry就在新代码库进行开发,新代码库采用Go语言编写,修改了镜像id的生成算法、Registry上镜像的保存结构,大大优化了pull和push镜像的效率。官方在Docker Hub上提供了Registry的镜像,可以直接使用该Registry镜像来构建一个容器,搭建私有仓库服务。

5.Docker镜像及容器的使用

可将Docker镜像看作只读模板,通过它可以创建Docker容器。例如,某个镜像可能包含一个Ubuntu操作系统、一个Apache HTTP Server以及用户开发的Web应用。
  镜像有多种生成方法:
     ①可以从无到有开始创建镜像。
     ②可以下载并使用别人创建好的现成的镜像。
     ③可以在现有镜像上创建新的镜像。
  可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作Dockerfile,通过执行docker build 命令可以构建出Docker镜像。
  容器是一种轻量级的、可移植的、自包含的软件打包技术,使应用程序几乎可以在任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
  容器由应用程序本身和依赖两部分组成。容器在宿主机操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。
  容器使软件具备了超强的可移植能力。Docker Hub提供了很多镜像,但在实际工作中,Docker Hub中的镜像并不能满足工作的需要,往往需要构建自定义镜像。构建自定义镜像主要有两种方式:docker commit和Dockerfile。可以将docker commit视为在以往版本控制系统里提交变更,然后进行变更的提交即可。docker commit、docker export和docker add类似都可以输出image,但是最好的生成image的方法还是使用Dockerfile。
  Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大地简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随各种方法、命令和参数,其产出为一个新的可以用于创建容器的镜像。

6. 容器编排

  Docker让容器变成了主流。自项目发布以来,Docker着重于提升开发者的体验。基本理念是可以在整个行业中,在一个标准的框架上,构建、交付并且运行应用。理论上,一个机构能够从一个笔记本上构建出一个持续集成和持续开发的流程,然后将其应用到生产环境。
  起初的一个挑战是数据中心编排。与VMware vSphere不同,当时少有能在生产环境中大规模管理负载的工具,运行一个容器就像一个单独的乐器,单独播放它的交响乐乐谱。容器编排允许指挥家通过管理和塑造整个乐团的声音来统一管弦乐队。
  容器编排工具提供了有用且功能强大的解决方案,用于跨多个主机协调创建、管理和更新多个容器。最重要的是,业务流程允许异步地在服务和流程任务之间共享数据。在生产环境中,可以在多个服务器上运行每个服务的多个实例,以使应用程序具有高可用性。越简化编排,就可以深越入了解应用程序并分解更小的微服务。目前主流的容器编排工具有Swarm、Kubernetes和Amazon ECS,其它的还有docker-compose和Mesos等等。
  Swarm是Docker自己的编排工具,现在与Docker Engine完全集成,并使用标准API和网络。Swarm模式内置于Docker CLI中,无需额外安装,并且易于获取新的Swarm命令。部署服务可以像使用docker service create命令一样简单。Docker Swarm正在与Kubernetes竞争,通过在性能、灵活性和简单性方面取得进步来获得用户的认可。
  Kubernetes正在成为容器编排领域的领导者,由于其可配置性、可靠性和大型社区的支持,从而超越了Docker Swarm。Kubernetes由Google创建,作为一个开源项目,与整个Google云平台协调工作。此外,它几乎适用于任何基础设施。
  Amazon ECS是亚马逊专有的容器调度程序,旨在与其他AWS服务协调工作。这意味着以AWS为中心的解决方案(如监控,负载均衡和存储)可轻松集成到用户的服务中。如果用户正在使用亚马逊之外的云提供商,或者在本地运行工作负载,那么ECS可能不合适。
  Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。

Docker引擎安装

到官网去寻找合适的软件包进行下载:
https://download.docker.com

基础环境配置

将压缩包Docker.tar.gz上传至/root目录并解压:

# tar -zxvf Docker.tar.gz

创建挂载目录,挂载本地镜像:

# mkdir /opt/cd
# mount /dev/cdrom /opt/cd

配置本地yum源:

# vi /etc/yum.repod.s/local.repo
[centos]
name=centos
baseurl=file:///opt/cd
gpgcheck=0
enabled=1
[Docker]
name=Docker
baseurl=file:///root/Docker
gpgcheck=0
enabled=1

升级系统内核(我的虚拟机使用的是centos7.5的镜像,需要升级系统内核):

# yum upgrade -y

配置防火墙及SELinux:

# systemctl stop firewalld && systemctl disable firewalld
# iptables -F
# iptables -X
# iptables -Z
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

重启虚拟主机。
开启路由转发:

# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# modprobe br_netfilter	//启动模块
# sysctl -p	//载入sysctl配置文件(/etc/sysctl.conf)
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

安装Docker引擎

安装依赖包:

# yum install -y yum-utils device-mapper-persistent-data

安装docker-ce:

# yum install -y docker-ce

至此Docker引擎安装完成。
启动Docker:

# systemctl daemon-reload
# systemctl restart docker
# systemctl enable docker

查看Docker的系统信息:

# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.6
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-1062.4.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.777GiB
Name: master
ID: RDWH:YMOP:2RJ6:ZN4V:GO7J:H25E:PMA7:PGYJ:22GW:VKJC:HNBP:J4R7
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https:///v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine