引言

如今 Docker 的使用已经非常普遍,特别是在一线互联网公司。使用 Docker 技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker 的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker 的完美组合,更加方便微服务架构运维部署落地。


一、Docker 概述

1. 什么是Docker?

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。

官方网址

mark

  • Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

  • Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

2. 为什么用 Docker

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

  • 更快速的交付和部署
    对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
    开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

  • 更高效的虚拟化
    Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

  • 更轻松的迁移和扩展
    Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

  • 更简单的管理
    使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

3. Docker VS 虚拟机

  • VM 是一个运行在宿主机之上的完整的操作系统,VM 运行自身操作系统会占用较多的 CPU、内存、硬盘资源。

  • Docker 不同于 VM,只包含应用程序以及依赖库,基于 libcontainer 运行在宿主机上,并处于一个隔离的环境中,这使得 Docker 更加轻量高效,启动容器只需几秒钟之内完成。由于 Docker 轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。

  • 但 Docker 目前还不够完善,比如隔离效果不如 VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。

  • Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

  • 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

不同点containerVM
启动速度秒级分钟级
运行性能接近原生,直接在内核中运行10%~20%50%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级别系统级别,更加彻底
操作系统主要支持Linux几乎所有
封装程度只封装目标代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

4. Docker 应用场景

  • 打包应用程序简单部署
  • 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
  • 持续集成和持续交付(CI/CD):开发到测试发布
  • 部署微服务
  • 提供 PAAS 产品(平台即服务)
    OpenStack的云主机类似于阿里云的 ECS,属于IAAS;Docker (K8S) 属于PAAS

5. Docker 引擎

Docker Engine 是具有以下主要组件的 C/S 客户端—服务器应用程序

  • server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)
  • CLIENT端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
通过client客户端传入命令
docker run:运行
docker start:开启
docker rm:删除
与sever端进行交互,控制server端进行应命令的操作

6. Docker 三大组件

  • 镜像(Image)
    Docker 镜像是创建容器的基础,类似于虚拟机的快照,可以理解为是一个面向 Docker 容器引擎的只读模板

  • 容器(Docker container)
    Docker 的容器是从镜像创建的运行时状态,它可以被启动、停止和删除,容器即服务;
    创建的每一个容器都是相互隔离、互不可见的,相互之间隔离性超强,从而保证平台的安全性;
    可以把容器看做是一个简易版本的 Linux 环境,Docker 可以利用容器来运行和隔离一个个应用

  • 仓库(Docker reqistry)
    Docker 仓库是用来集中保存镜像的地方,创建完自己的镜像后,可以使用 push 命令将其上传至公共仓库(public)私有仓库(Private),之后在另一台机器上需要使用这个镜像,直接pull下来就可以了;
    仓库注册服务器Registry是存放仓库的地方,其中包含了多个仓库,每个仓库存放某一类镜像,并使用不同的标签tag来区分它们

目前最大的公共仓库是 Docker Hub

7. 名称空间(Namespaces)

Docker 使用一种称为 namespaces 提供容器的隔离工作区的技术,运行容器时,Docker 会为该容器创建一组名称空间,这些名称空间提供了一层隔离,容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间

docker 引擎对内核版本是有要求的,至少要求3.8+,因为docker 需要cgroups 的资源管理功能

  • 容器完美的实现了6个名称空间隔离 (namespace资源隔离—用容器化技术封装)
    mount:文件系统,挂载点
    user:操作进程的用户和用户组
    pid:进程编号
    uts:主机名和主机域
    ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
    net:网络设备、网络协议栈、端口等

  • 控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
    控制组允许 Docker Engine 将可用的硬件资源共享给容器,并有选择地实施限制和约束

二、安装部署 Docker

1. 环境配置

systemctl stop firewalld
systemctl disable firewalld

vim /etc/selinux/config
SELINUX=disabled

vim /etc/resolv.conf
nameserver 114.114.114.114

2. 安装依赖包

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

#yum-utils——》增强性yum工具
#device-mapper-persistent-data——》容器的驱动引擎
#lvm2——》逻辑卷的增强模式

3. 设置阿里云镜像源

cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4. 安装 docker-ce 社区版

yum install -y docker-ce

systemctl start docker
systemctl enable docker

5. 配置镜像加速

官方镜像加速注册网址,登录容器镜像服务控制台后,在左侧导航栏选择镜像工具 > 镜像加速器,在镜像加速器页面就会显示为您独立分配的加速器地址

  • 通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器
mkdir -p /etc/docker
直接命令行输入以下内容:
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload							#重载守护进程
systemctl restart docker						

6. 网络优化

vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker
docker images 或 docker image ls	 						#查询镜像列表

在这里插入图片描述

7. 常用命令

  • 查看docker版本
docker -v		
docker version

在这里插入图片描述

  • 显示 docker 的系统级信息,比如内核,镜像数,容器数等
docker info

在这里插入图片描述

8. 配置文件解析

#docker配置文件还可以添加以下的建立配置
vim /etc/docker/daemon.json		
"graph" : "/data/docker"				#存储docker镜像的数据位置 /var/lib/docker
"storage-driver":"overlay2"  			#存储引擎,早期的时候存储引擎使用的是aufs—》overlay2存储引擎
"insecure-registries": [" registry.access.redhat.com"," quary.io"] 	#私有仓库位置
"bip" : "172.7.5.1/24" 					#docker网络,控制网段的位置,需要创建新的网桥,系统默认的docker0是不变的
"exec-opts" : [ "native.cgroupdriver=systemd" ] 					#启动时候的额外参数(驱动,k8s使用)
"live-restore":true						#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)

docker 的网络建议和宿主机的IP "对照”
比如宿主机10.2.5.6容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置

三、Docker 镜像相关操作

1. 运行镜像

docker run hello-world		 		#运行hello-world镜像

run代表
pull dockerhub	仓库中项目//镜像
start hello-world image

在这里插入图片描述

The Docker client contacted the Docker daemon. dockerclient
客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restfulapi典型的C/S架构

The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)
由docker服务端的守护进程从docker hub上下载了镜像(服务端会先检查本地系统是否有此镜像)

The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
服务端创建了一个新的容器,然后从拉取的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用

The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
docker服务端把这些信息流(传递)返回到客户端并展示出来,(展示在终端上)
docker client 可以是多种形式,比如"docker"命令工具所在的终端

2. 搜索镜像

docker search nginx		 			#搜索镜像nginx
docker search centos: 7		 		#搜索镜像centos:7

在这里插入图片描述

3. 下载镜像

docker pull 镜像名称
docker pull nginx				#下载nginx最新的镜像

在这里插入图片描述

4. 查看镜像

docker  images	 						#查看镜像列表
docker images -q	 					#查询镜像过滤ID,q:代表过滤,只过滤容器ID

在这里插入图片描述

5. 查看当前docker下的镜像详细信息

docker inspect 镜像ID	 

在这里插入图片描述

6. 添加镜像标签

docker image tag 镜像ID 镜像名:版本号
可自定义镜像名和版本号

docker tag hello-world:latest hello-world:lamp

在这里插入图片描述

7. 删除镜像

删除镜像时若有容器则需要先删除容器

docker rmi  镜像名称 					
docker rmi  镜像标签   		

 docker rmi `docker images -aq`     	#批量删除镜像

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 删除标签
docker rmi hello-world:lamp		   					#删除hello-world的lamp标签

在这里插入图片描述

8. 镜像的导入和导出

  • 导出
docker save -o 文件名镜像名
docker load < 

docker save -o hello-world hello-world

在这里插入图片描述

  • 导入
scp hello-world root@192.168.8.15:/opt		 
docker load < hello-world						 #进行镜像导入 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用场景:有的生产环境,企业不直接使用 docker 私有仓库,而是存放在一个 ftp 服务器中,按需上传下载

四、Docker 容器相关操作

1. 查询容器

docker ps -a									#显示所有的容器,包括未运行的

docker ps -aq		 							#查询容器的id
q:代表过滤;只过滤容器ID

2. 创建容器

docker create -it nginx:latest /bin/bash

-i:让容器的标准输入保持打开
-t:分配一个伪终端
-d:后台守护进程的方式运行

在这里插入图片描述

3. 启动容器

  • 启动容器
docker start 容器id 

在这里插入图片描述

  • 启动容器 (一次性运行)
docker run nginx:latest /bin/bash
docker run centos:7 /usr/bin/bash -c ls /

执行了一次以后直接就退出了

在这里插入图片描述
在这里插入图片描述

  • 持续后台运行
docker run -d centos:7 /bin/bash -c "while true;do echo hello world;done"

-itd 选项表示分配一个伪终端让其在后台守护进程的方式运行

在这里插入图片描述
在这里插入图片描述

  • 容器的几种状态
created:已经被创建 (使用 docker ps -a 命令可以列出)但是还没有被启动 (使用 docker ps 命令还无法列出)
running:运行中
paused:容器的进程被暂停了
restarting:容器的进程正在重启过程中
exited:stopped 状态,表示容器之前运行过但是现在处于停止状态(要区别于 created 状态,它是指一个新创出的尚未运行过的容器)。可以通过 start 命令使其重新进入 running 状态
destroyed:容器被删除了,再也不存在了

4. 删除容器

  • 删除容器
docker rm 容器ID											 #删除退出状态的容器不需要加-f
docker rm -f 容器ID										 #强制删除正在运行的容器

在这里插入图片描述

  • 批量删除容器(正则匹配)
#批量删除容器(正则匹配);$1:是容器的id
docker ps -a | awk '{print "docker rm "$1}' | bash		 

#批量删除"exit"状态(指定状态)的容器
for i in `docker ps -a | grep -i exit | awk '{print$1}'`; do docker rm -f $i;done
	
docker rm -f `docker ps -aq`							#删除所有容器 
docker rm -f `docker ps -q`								#强制批量删除非up状态的容器;不建议使用,若需要删除删选出id进行删除

在这里插入图片描述

5. 停止容器

docker stop 容器ID				 
 
状态码137:表示主动退出停止容器

在这里插入图片描述

6. 进入、退出容器

  • run 命令
docker run -it centos:7 /bin/bash

在这里插入图片描述

  • exec 命令
docker exec -it 容器ID /bin/bash

在这里插入图片描述
在这里插入图片描述

  • 区别:

docker run -it:会创建前台进程,但是会在输入exit后终止进程
docker attach:会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程
docker exec -it:会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行

  • 退出容器
ctrl+d 
或
exit

7. 容器的导入、导出

#导出
docker export 容器ID > 文件名									
 
#导入
docker import 导出的文件名(容器) 指定镜像名称(打上标签)
或
cat 文件名(容器) | docker import - 指定镜像名称(打上标签)
示例:
cat centos_7 | docker import - centos:v2

在这里插入图片描述在这里插入图片描述

总结

  • 使用 docker 的意义
    统一了基础设施环境——docker 环境
    统一了程序打包方式——docker 镜像
    统一了程序部署方式——docker 容器

  • 名称空间提供容器的隔离工作区的技术
    mount:文件系统,挂载点
    user:操作进程的用户和用户组
    pid:进程编号
    uts:主机名和主机域
    ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
    net:网络设备、网络协议栈、端口等

控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源,控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐