Docker 容器详解及实操,从新手>入门>拿捏,巨详细
文章已经建立可运行的docker 项目,点击运行https://blog.csdn.net/F12138X/article/details/140344339?spm=1001.2014.3001.5506
1、什么是 Docker
1.1、容器技术
1. Docker 是一个开源的应用容器引擎,它基于 Go 语言开发,并遵从 Apache2.0 开源协议
2. 使用 Docker 可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意
Linux机器上,也可以实现虚拟化
3. Docker 容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性
4. Docker 诞生于 2013 年初,目前有两个版本: Community Edition(CE ,社区版 ) 和
EnterpriseEdition(EE,企业版 )
1.2、容器与虚拟机比较虚拟机
1. 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
2. 在实体计算机中能够完成的工作在虚拟机中都能够实现
3. 在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量
4. 每个虚拟机都有独立的 CMOS 、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作
区别:
1. 虚拟机是在一台物理机上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。 Docker 是开源的应用容器引擎,依然需要先在电脑上安装操作系统,然后安装 Docker 容器管理器
2. 虚拟机是在硬件级别进行虚拟化,而 Docker 是在操作系统的层面虚拟化
3. 虚拟机是通过模拟硬件搭建操作系统,而 Docker 则是复用操作系统
4. 虚拟机实现了操作系统之间的隔离, Docker 只是进程之间的隔离,所以虚拟机的隔离级别更高,安全性更强
5. Docker 的运行速度更快
6. Docker 的文件要小的多,虚拟机要大的多
1.3、Docker 特点
1、更高效的利用系统资源
Docker 对系统资源的利用率很高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟 机技术更高效。因此,对比虚拟化技术,一个相同配置的主机往往可以运行更多数量的应用
2、更快速的启动时间
传统的虚拟化技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大节约了开发测试,部署的时间
3、一致的运行环境
开发过程中常见的一个问题是环境一致问题,由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中发现。
而 Docker 的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现这段代码在我机器上没问题这类问题 Docker 是一个采用集装箱思想出现技术,把相关依赖及运行代码打到一起,达到开发环境,测试环境,部署环境一样,减少由于环境不一致而出现问题
4、持续支付和部署
对开发和运维人员来说,最希望就是一次创建和部署,可以在任意地方运行。而且使用 Docker file 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助 更好的生产环境中部署该镜像
5、更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。
Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况
6、更轻松的维护和扩展
Docker 使用的分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外, Docker 团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本
2、Docker 组件组成
2.1、Docker 客户端和服务器
1. Docker 是一个客户端 - 服务器( C/S )架构程序。
2. Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。
3. Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API 。
4. 你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运 行在另一台宿主机上的远程 Docker 守护进程
2.2、Docker 镜像
1. 镜像是构建 Docker 的基石。
2. 用户基于镜像来运行自己的容器。
3. 镜像也是 Docker 生命周期中的 “ 构建 ” 部分。
4. 镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。
5. 例如:添加一个文件;执行一个命令;打开一个窗口。也可以将镜像当作容器的 “ 源代码 ”
6. 镜像体积很小,非常 “ 便携 ” ,易于分享、存储和更新
2.3、Registry(注册中心/镜像仓库)
1. Docker 用 Registry 来保存用户构建的镜像。
2. Registry 分为公共和私有两种。
3. Docker 公司运营公共的 Registry 叫做 Docker Hub 。
4. 用户可以在 Docker Hub 注册账号,分享并保存自己的镜像
说明:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry
2.4、Docker 容器
1. Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。
2. 容器是基于镜像启动起来的,容器中可以运行一个或多个进程。
3. 我们可以认为,镜像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。
4. 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务
所以 Docker 容器就是:一个镜像格式;一些列标准操作;一个执行环境
Docker 借鉴了标准集装箱的概念:
标准集装箱将货物运往世界各地, Docker 将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件(所以说 Docker 图标很形象)
- 和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么,它不管是 web 服务器, 还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容 “ 装载 ” 进去
- Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到 Registry ,然 后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到具体的主机中。像标准集装箱一样, Docker 容器方便替换,可以叠加,易于分发,并且尽量通用
- 使用 Docker ,我们可以快速的构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续 集成( CI )测试环境或者任意一种应用程序、服务或工具。我们可以在本地构建一个完整的测试环 境,也可以为生产或开发快速复制一套复杂的应用程序栈
3、Docker 安装
目前 Docker 只能支持 64 位系统。systemctl stop firewalld.service
setenforce 0#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.iosystemctl start docker.service
systemctl enable docker.service
--------------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
--------------------------------------------------------------------------------------------#查看 docker 版本信息
docker version#docker 信息查看
docker info
————————————————
版权声明:本文为CSDN博主「-山海皆可平」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/F12138X/article/details/140344339
4.Docker 镜像操作
1.搜索镜像
格式:docker search 关键字docker search nginx
2.镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
3.获取镜像
格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull nginx
4.查看镜像信息
镜像下载后存放在 /var/lib/docker 。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。#查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json#查看下载到本地的所有镜像
docker images
5.根据镜像的唯一标识 ID 号,获取镜像详细信息
格式:docker inspect 镜像ID号
- lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录
- upperdir是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层
- MergedDir是表现层,是容器的挂载点
6.为本地的镜像添加新的标签
格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:webdocker images | grep nginx
7.删除镜像
格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 #会彻底删除该镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
docker rmi nginx:web
8.存出镜像:将镜像保存成为本地文件
再开一台装了docker的服务器且没有任何镜像
格式:docker save -o 存储文件名 存储的镜像
docker save -o /opt/nginx-1.20.tar nginx:1.20 #存出镜像命名为nginx存在当前目录下
ls /opt
9.载入镜像:将镜像文件导入到镜像库中
格式:
docker load < 存出的文件
或者
docker load -i 存出的文件docker load < nginx
复制过去
查看
或者
10.上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传
docker tag nginx:latest soscscs/nginx:web #添加新的标签时必须在前面加上自己的dockerhub的username
docker login #登录公共仓库
Username:
password:
docker push soscscs/nginx:web #上传镜像
官方网站 创建个账户
docker tag nginx:1.20 superior/nginx-xy101:1.20
上传到官网账户有一些不可描述的原因,这里改上传到阿里云
首先在阿里云上创建一下个人镜像仓库(免费的)
5.Docker 容器操作
1.容器创建
就是将镜像加载到容器的过程。
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
格式:docker create [选项] 镜像
常用选项
-i | 让容器开启标准输入接受用户输入命令 |
-t | 让 Docker 分配一个伪终端 tty |
-it | 合起来实现和容器交互的作用,运行一个交互式会话 shell |
docker create -it nginx:latest /bin/bash
查看容器的运行状态
docker ps -a #-a 选项可以显示所有的容器
2.启动容器
格式:docker start 容器的ID/名称
docker ps -a
用的少一般直接用run
3.创建并启动容器
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令
注意:容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进
程结束容器退出
docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的
依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容
器中必须有一个前台进程,否则认为容器已经挂掉
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
docker run -itd --name test1 nginx:latest /bin/bash
docker ps -a #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了
4.停止容器运行
格式:docker stop 容器的ID/名称#终止容器运行
5.进入容器
容器的进入
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。docker start 2592d3fad0fb
#进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。lsexit
#退出容器后,容器仍在运行docker ps -adocker run -it nginx:latest bash
#不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止
6.文件的导入与导出
touch yy.txt
echo 123 > yy.txt
docker cp yy.txt 2592d3fad0fb:/opt/
#复制到容器中docker cp 2592d3fad0fb:/opt/yy.txt ~/abc123.txt
#从容器复制文件到主机
7.容器的导出与导入
容器的导出与导入
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。docker export 3f883fcf4803 > nginx1.20.5.tar
#导出格式:docker export 容器ID/名称 > 文件名docker export -o nginx1.20.5.tar 2592d3fad0fbcat nginx1.20.5.tar | docker import - nginx:latest
导入格式:cat 文件名 | docker import – 镜像名称:标签
#导入后会生成镜像,但不会创建容器docker import nginx1.20.5.tar -- nginx:latest
8.删除与批量删除容器
docker stop 2592d3fad0fb
格式:docker rm [-f] 容器ID/名称
#删除容器docker rm 2592d3fad0fb
#删除已经终止状态的容器docker rm -f 2592d3fad0fb
#强制删除正在运行的容器docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
#批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stopdocker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
#批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
9.批量删除镜像
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash
#批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi
#删除none镜像docker rm $(docker ps -a -q)
#批量清理后台停止的容器
6.总结
docker version #查看docker版本
docker info #查看docker详细信息
镜像操作
docker search 关键字 #根据仓库或镜像的关键字搜索镜像pull 仓库名/镜像名:标签 #下载镜像,如果不指定标签则默认使用 :latestimages [-q] #查看镜像列表,-q 表示仅显示镜像IDinspect 镜像名或镜像ID #查看镜像的详细信息tag 旧镜像名:旧标签 新镜像名:新标签 #添加新的镜像名或标签rmi 镜像名或镜像ID [-f] #删除镜像save -o 镜像文件路径 镜像名或镜像ID #将镜像导出为文件load -i 镜像文件路径 #将镜像文件导入dockerload < 镜像文件路径login 仓库地址 #登录镜像仓库push 仓库名/镜像名:标签 #上传镜像到仓库
容器操作
ocker create [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建容器start 容器名或容器ID #启动容器ps -a [-q] #查看容器列表inspect 容器名或容器ID #查看容器的详细信息stop 容器名或容器ID [-t 等待时间] #停止容器,发送 SIGTERM 信号,默认等待10skill 容器名或容器ID #停止容器,默认发送 SIGKILL 信号rm 容器名或容器ID [-f] #删除容器exec -it 容器名或容器ID sh|bash #登录容器cp 宿主机文件路径 容器名或容器ID:绝对路径 #复制宿主机文件到容器中cp 容器名或容器ID:绝对路径 宿主机文件路径 #复制容器文件到宿主机中logs 容器名或容器ID #查看容器中PID=1的主进程的日志
docker run [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建并启动容器
docker run 的启动过程
- 检查本地是否有指定镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
- 在只读的镜像层上再挂载一层可读可写的容器层
- 从docker网桥给容器分配一个虚拟接口和IP地址
- 使用镜像的默认启动命令或docker run 指定的命令来启动容器,直到容器中的PID=1的主进程退出为止
文章已经建立了可运行的 docker 项目,点击运行