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 底层原理
Docker 是一个 Client - Server 结果的系统, Docker 的守护进程运行在主机上,通过 Socket 从客户端
访问。
DockerServer 接收到 Docker-Client 的指令,执行该命令。
Docker 比 VM 快的原因:
1 、 Docker 有比虚拟机更少的抽象层。
2 、 Docker 利用的是宿主机的内核, VM 需要的是 Guest OS( 产生镜像后 ) 。
总结:在新建一个容器的时候, 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