Docker( 容器化技术 )

https://www.docker.com/ docker 官网地址

https://docs.docker.com/ docker 文档地址

------ 基于 Go 语言开发的容器技术

1 、 Docker 基本概念及实际应用情况

重点: ** docker 镜像具有互相隔离性 ,通过这个隔离机制将服务器利用到极致。(镜像 / 隔离机制)

2 、 Docker 出现的便利

3 、 Docker 的过去

2010 年成立了 dotCloud 公司 起初做一些 pass 的云计算服务

linux 中的虚拟机它相关的容器技术等等就是通过 pass 的云计算服务

然后做 ‘ 开源 ’ 2013 年

14 年 Docker1.0 发布

于虚拟机而言,十分轻巧。

Iaas/Paas/Saas

1. SaaS (软件即服务)

SaaS ( Software-as-a-Service ),即软件即服务。提供给消费者完整的软件解决方案,你可以从软件服

务商处以租

用或购买等方式获取软件应用,组织用户即可通过 Internet 连接到该应用(通常使用 Web 浏览器)。所

有基础结 4 、 Docker 对比传统虚拟机

1 、传统虚拟机方式运行 app

构、中间件、应用软件和应用数据都位于服务提供商的数据中心内。服务提供商负责管理硬件和软件,并根据

适当

的服务协议确保应用和数据的可用性和安全性。 SaaS 让组织能够通过最低前期成本的应用快速建成投产。

【 SaaS - 应用领域与行业前景】

( Software-as-a-service )的意思是软件即服务。简单说就是在线系统模式,即软件服务商提供的软件

在线服

SaaS 软件就适用对象而言,可以划分为针对个人的与针对企业的

面向个人的 SaaS 产品:在线文档,账务管理,文件管理,日程计划、照片管理、联系人管理,等等云类型的服

而面向企业的 SaaS 产品主要包括: CRM (客户关系管理)、 ERP (企业资源计划管理)、线上视频或者与群组

通话

会议、 HRM (人力资源管理)、 OA( 办公系统 ) 、外勤管理、财务管理、审批管理等。

【 Saas 与传统软件对比】

降低企业成本:按需购买,即租即用,无需关注软件的开发维护。

软件更新迭代快速:和传统软件相比,由于 saas 部署在云端,使得软件的更新迭代速度加快

支持远程办公:将数据存储到云后,用户即可通过任何连接到 Internet 的计算机或移动设备访问其信息

-----------------------------------------------------

2. PaaS (平台即服务)

PaaS ( Platform-as-a-Service ),即平台即服务。提供给消费者的服务是把客户采用提供的开发语言和

工具(例如

Java , python, .Net 等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不需要管理

或控制底

层的云基础设施,包括网络、服务器、操作系统、存储等,但客户能控制部署的应用程序,也可能控制运行应

用程

序的托管环境配置

------------------------------------------------------

3. IaaS (基础设施即服务)

IaaS ( Infrastructure as a Service ),即基础设施即服务。提供给消费者的服务是对所有计算基础

设施的利用,包

括处理 CPU 、内存、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用

序。消费者不管理或控制任何云计算基础设施,但能控制操作系统的选择、存储空间、部署的应用,也有可能

获得

有限制的网络组件(例如路由器、防火墙、负载均衡器等)的控制

Kernel :内核 缺点:

1 、资源占用十分多

2 、冗余步骤多(启动多台虚拟机)

3 、启动很慢

2 、容器化技术

注释:一个容器针对于一个 app 提供对应的运行环境,多个容器之间相互隔离独立,不会影响其他容器

的正常运行。容器中是没有内核的。

kernel : 内核 Docker / 虚拟机技术对比总结

a 、 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作系统中安装和运行软

b 、 容器内的应用直接运行在宿主机中,容器没有自己的内核,也没有虚拟硬件,即轻便。

c 、 每个容器间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps( 开发即运维 )

应用更快速的交付和部署

1 、 Docker 一键运行打包镜像发布测试。

2 、更便捷的升级和扩容以及缩容 (更新项目只需要更新容器不用动内部的运行环境)

Docker 是内核级别的虚拟化

--------- 可以在一个物理机上运行多个容器实例,让服务器的性能发挥到极致。

5 、 Docker 安装

EX:

( Springboot1.5 Redis 5 tomcat8 ) ------ 升级该容器

项目打包为一个镜像,扩展服务器 A ----> 服务器 B

----- 更为简单的系统运维,最终达到开发环境与测试环境的高度一致性并且更高

效的去进行计算机的资源利用。 1 、 docker 的基本组成

镜像 (image) :

Docker 镜像好比一个模板,可以通过这个模板来创建容器服务, romcat 镜像

=====>run=======>tomcat1 容器(提供服务器)

容器 (container) :

Docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建。可以简易的理解为容器就是

一个简单的 linux 系统

仓库 (repository) :

仓库就是存放镜像的地方。

公有仓库 / 私有仓库

如: Docker Hub

阿里云 / 华为云等等。。。。。

例如: Maven 配置阿里云镜像快速拉取 需要的依赖包。

安装 Docker

https://docs.docker.com/engine/install/centos/ docker 安装地址

1 、 linux

2 、 CentOS 7

3 、使用工具连接远程服务器 ( 付费 Xshell 连接工具等同于 SSH)

环境准备

环境查看 帮助文档

步骤 :

安装

#1 、卸载旧版本

yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-engine

#2 、需要的安装包

yum install -y yum-utils

#3 、 设置镜像仓库

yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

默认是国外的

改成阿里云

yum-config-manager \

--add-repo \

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4 、更新 yum 软件包索引

yum makecache fast

#5 、安装 docker ce 社区版本 ee 企业版本

yum install docker-ce docker-ce-cli containerd.io

-------- 此处可以选择别的版本的 docker 进行安装

#6 、启动 docker

systemctl start docker

systemctl stop docker

#7 、查看 docker 版本

docker version

#8 、测试 hello world

docker run hello-world 卸载 docker

阿里云镜像加速

打开阿里云 , 找到容器镜像服务

#9 、查看 docker 镜像

docker images

结果:

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hello-world latest feb5d9fea6a5 4 months ago 13 .3kB

#1 、卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

#2 、删除资源( docker 的默认资源路径)

rm -rf /var/lib/docker

#3 、删除镜像容器

rm -rf /var/lib/containerd 镜像中心找到镜像加速内容

配置镜像加速器

配置镜像加速器

针对 Docker 客户端版本大于 1.10.0 的用户

您可以通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器 ----------------------------> 阿里云镜像配置完毕

helloworld 如何启动

docker 运行流程图

docker 底层原理

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<- 'EOF'

{

"registry-mirrors" : [ "https://9ruiamp8.mirror.aliyuncs.com" ]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

docker运行流程图

docker grafana 配置发告警邮件 docker rasa_Docker

docker 底层原理

Docker 是一个 Client - Server 结果的系统, Docker 的守护进程运行在主机上,通过 Socket 从客户端

访问。

DockerServer 接收到 Docker-Client 的指令,执行该命令。

docker grafana 配置发告警邮件 docker rasa_Docker_02

Docker 比 VM 快的原因:

1 、 Docker 有比虚拟机更少的抽象层。

2 、 Docker 利用的是宿主机的内核, VM 需要的是 Guest OS( 产生镜像后 ) 。

docker grafana 配置发告警邮件 docker rasa_mysql_03

总结:在新建一个容器的时候, docker 不需要跟虚拟机一样重新加载一个操作系统内核,避免引导

性。虚拟机是加载 Guest OS 分钟级别的,

而 docker 是利用宿主机的操作系统,省略了复杂的过程,是一个秒级的操作。

Docker 的常用命令

帮助命令

docker version #docker 的版本信息

docker info #docker 的系统信息,包括镜像和容器数量

docker 命令 --help # 帮助命令 帮助文档的地址 : https://docs.docker.com/reference/

镜像命令

docker images 查看本地主机上的镜像

# 搜索镜像

docker search

docker pull 下载镜像

[root@localhost ~] # docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hello-world latest feb5d9fea6a5 4 months ago 13 .3kB

# 释义

REPOSITORY 镜像的仓库源

TAG 镜像的标签

IMAGE ID 镜像的 id

CREATED 镜像的创建时间

SIZE 镜像的大小

# 可选项

-a , --all # 列出所有镜像

-q , --quiet # 只显示镜像的 id

[root@localhost ~] # docker search mysql

NAME DESCRIPTION

STARS OFFICIAL AUTOMATED

mysql MySQL is a widely used, open-source relation 猞

12069 [OK]

mariadb MariaDB Server is a high performing open sou 猞

4626 [OK]

# 可选项,通过搜藏来过滤

--filter = STARS = 3000 # 搜索出的镜像是 STARS 大于 3000 的

[root@localhost ~] # docker search mysql --filter=STARS=3000

NAME DESCRIPTION STARS OFFICIAL

AUTOMATED

mysql MySQL is a widely used, open-source relation 猞 12069 [OK]

mariadb MariaDB Server is a high performing open sou 猞 4626 [OK]

docker pull 下载镜像

[root@localhost ~] # docker pull mysql

Using default tag: latest

latest: Pulling from library/mysql

# 下载镜像 docker pull 镜像名 [:tag]

[root@localhost ~] # docker pull mysql

Using default tag: latest # 不写 tag (版本),默认就是最新版( latest )

latest: Pulling from library/mysql # 分层下载, docker image 的核心 联合文件系统

72a69066d2fe: Pull complete

93619dbc5b36: Pull complete

99da31dd6142: Pull complete

626033c43d70: Pull complete

37d5d7efb64e: Pull complete

ac563158d721: Pull complete

d2ba16033dad: Pull complete

688ba7d5c01a: Pull complete

00e060b6d11d: Pull complete

1c04857f594f: Pull complete

4d7cfa90e6ea: Pull complete

e0431212d27d: Pull complete

Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709

# 签名

Status: Downloaded newer image for mysql:latest

docker.io/library/mysql:latest # 真实地址

# 两者相同

docker pull mysql

docker pull docker.io/library/mysql:latest

# 指定版本下载

docker pull mysql:5.7

[root@localhost ~] # docker pull mysql:5.7

5 .7: Pulling from library/mysql

72a69066d2fe: Already exists # 已经存在无需二次下载

93619dbc5b36: Already exists

99da31dd6142: Already exists

626033c43d70: Already exists

37d5d7efb64e: Already exists

ac563158d721: Already exists

d2ba16033dad: Already exists

------------------------------------- 联合文件系统的核心思想

0ceb82207cd7: Pull complete

37f2405cae96: Pull complete

e2482e017e53: Pull complete

70deed891d42: Pull complete

Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94

# 签名

Status: Downloaded newer image for mysql:5.7

docker.io/library/mysql:5.7

# 根据镜像 id 删除

docker rmi -f c20987f18b13----> 容器 id

# 删除全部容器

docker rmi -f $(docker images -aq)

容器命令

--------- 前提是有镜像才可以创建容器, linux 中下载一个 centos 镜像来测试学习。

docker pull centos

新建容器并启动

docker run --help

docker run [ 可选参数 ] image

# 参数说明

--name = "Name" 容器名称,用于区分容器

-d 后台方式运行

-it 使用交互方式运行,进入容器查看内容

-p 指定容器端口 -p 8080 :8080

1 、 -p 主机端口 : 容器端口(映射到容器端口) --- 常用方式

2 、 -p 容器端口

3 、 -p ip: 主机端口 : 容器端口

-P 随机指定端口

#EX 启动并进入容器

[root@localhost /] # docker run -it centos /bin/bash

[root@e4ccc01b495 /] # ls # 查看容器内的 centos

# (内外没关系)

bin dev etc ....

# 从容器中退回主机

exit 退出当前容器

# 列出所有运行容器

docker ps

docker ps -a # 查看当前正在运行以及运行过的容器 a-->all

docker ps -n = ? # 显示最近创建的容器

docker ps -q # 只显示容器编号 docker ps -aq

退出容器

exit # 让容器停止并退出

ctrl + p + q # 容器不停止退出

删除容器

docker rm 容器 id # 删除指定容器 不能删除正在运行的容器

docker rm -f $(docker ps -aq) # 删除所有容器 强制删除

docker ps -a -q |xargs docker rm # 删除所有容器

启动和停止容器的操作

docker start 容器 id # 启动容器

docker restart 容器 id # 重启容器

docker stop 容器 id # 停止当前正在运行的容器

docker kill 容器 id # 强制停止当前容器

常用的其他命令 (重要)

后台启动容器

# 命令 docker run -d 镜像名

docker run -d centos

# 问题: docker ps, 发现 cnetos 停止了

#docker 容器使用后台运行,必须要有一个前台进程, docker 发现没有应用,就会自动停止。若用 nginx ,

容器启动后,发现没有提供服务,就会立刻停止,意思就说没有程序了。

查看日志

docker logs --help

docker logs -f -t --tail 条数 容器

docker logs -tf --tail 条数 容器

# 编写 shell 脚本

"while true;do echo xxx;sleep 1;done"

docker run -d centos /bin/sh -c "while true;do echo xxx;sleep 1;done"

------ 每一秒钟打印一个 xxx

docker ps

找到容器 id

# 显示日志

docker logs -tf --tail 10 容器 # 只查看 10 条日志

docker logs -tf 容器 # 查看全部日志

查看容器中进程信息 ps

top 命令

docker top 容器

UID (用户 id ) PID (父级 id ) PPID (进程 id )。。。

查看镜像的元数据(详细信息)

docker inspect 容器 id

进入当前正在运行的容器

# 通常容器都是使用后台方式运行,进入容器修改配置

# 命令

docker exec -it 容器 id bashShell--->/bin/bash

# 方式 2

docker attach 容器 id

#EX

docker attach dce7b8617bf