容器技术入门与Docker环境部署指南
目录
一、Docker概述
1.什么是Docker
2.Docker的优势
3.Docker与传统虚拟机的区别
4.Docker的应用场景
5.Docker的核心概念
二、Docker安装
三、Docker镜像操作
四、Docker容器操作
一、Docker概述
1.什么是Docker
a.Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
b.Docker是目前较为主流的容器技术,容器技术是一种轻量级是虚拟化技术,它可以让应用程序及其依赖项打包在一个独立的单元中运行,从而实现应用的隔离、可移植性和资源的高效利用
2.Docker的优势
a.隔离性
b.可移植性
c.资源高效利用
d.快速部署和扩展
3.Docker与传统虚拟机的区别
特性 | Docker容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
计算能力消耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量 | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
4.Docker的应用场景
a.开放环境管理
b.持续集成和持续部署(CI/CD)
c.微服务架构
d.云计算
5.Docker的核心概念
a.镜像:是创建容器的基础,类似于虚拟机的快照,可以理解为面向Docker容器引擎的只读模板
b.容器:是从镜像创建的运行实例,它可以被启动、停止、删除,可以看作是一个简易版的Linux环境,Docker利用容器来运行和隔离应用
c.仓库:是用来集中保存镜像的地方。创建镜像后,可以使用push命令将它上传到共有仓库(Public)或私有仓库(Private),仓库注册服务器(Registry)是存放仓库的地方,最大的仓库是docker Hub
二、Docker安装
1.下载Docker的repo文件
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.替换仓库地址
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
3.更新文件并安装Docker
dnf clean all
dnf makecache
dnf -y install docker-ce
4.添加国内镜像站
mkdir /etc/docker/
cat>/etc/docker/daemon.json<<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com"]
}
EOF
5.开启Docker服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version
三、Docker镜像操作
1.获取镜像
docker pull nginx:1.24.0
a.命令语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
b.参数说明(OPTIONS):
-a:拉取指定仓库中的所有标签的镜像
--disable-content-trust:默认值为true,用于禁用镜像内容验证
NAME:要拉取的镜像的名称,可以包含仓库地址和命名空间信息
RAG:指定要拉取的镜像的具体标签,用于区分同一镜像的不同版本
DIGEST:通过镜像的摘要信息来确定要拉取的镜像版本
2.查看镜像信息
docker images
a.REPOSITORY:镜像属于仓库
TAG:镜像的标签信息标记同一个仓库中的不同镜像
IMAGE ID:镜像的唯一ID号,唯一标识一个镜像
CREATED:镜像创建时间
VIRTUAL SIZE:镜像大小
b.命令语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
c.参数说明:
-a:显示所有镜像
--digests:显示镜像的摘要信息
-f:根据指定条件过滤输出结果
--format string:使用Go模板语法自定义输出格式
--no-trunc:不揭短输出信息,完整显示镜像ID等较长字段
-q:只显示镜像的ID
REPOSITORY:指定要显示的镜像仓库名称
TAG:指定要显示的镜像标签
3.查看镜像详细信息
docker inspect nginx:1.24.0
a.命令语法:docker inspect [OPTIONS] NAME | ID [NAME|ID……]
b.参数说明:
--format:-f:指定输出格式,使用Go模板语法
--size :-s:在输出中显示容器的文件系统大小
c.可检查的Docker对象:
容器(Container):获取容器的详细信息
镜像(Image):查看镜像的构建历史、层信息、环境变量等
网络(Network):了解网络的配置
卷(Volume):获取卷的详细信息
4.修改镜像标签
docker tag nginx:1.24.0 kgcnginx:v1
a.命令语法:docker tag SOURCE_IMAGE[:TAG]TARGET_IMAGE[:TAG]
b.参数说明:
SOURCE_IMAGE[:TAG]:指定源镜像的名称和标签。SOURCE_IMAGE是源镜像的名称,[:TAG]是可选的标签,如果不指定标签,默认使用latest。
TARGET_IMAGE[:TAG]:指定目标镜像的名称和标签。这是你要为源镜像添加的新标签。
#用镜像名
docker rmi nginx:v1
#用ID
docker rmi c15
a.命令语法:dockerrmi[OPTIONS]IMAGE[IMAGE...]
b.参数说明:
-f,force:强制删除镜像。即使有容器正在使用该镜像,也会尝试删除,但不建议轻易使用,因为可能导致容器无法正常运行。
-no-prune:默认情况下,删除镜像时会同时删除该镜像相关的未使用的父镜像层(虚悬镜像),使用该选项可以禁止删除这些父镜像层。
IMAGE:指定要删除的镜像,可以是镜像的名称、标签、镜像ID,也可以同时指定多个镜像。例如:nginx:latest、123456789abc等。
c.注意事项:
在删除镜像之前,要确保没有正在运行或已停止的容器依赖该镜像可以使用dockerps-a
命令查看所有容器,使用dockerstop和dockerrm命令停止并删除依赖该镜像的容器后,再删除镜像。
镜像的删除是不可逆的操作,删除后无法恢复,所以在执行删除操作前要谨慎确认。
当删除一个有多个标签的镜像时,删除一个标签只是移除该标签的引用,只有当所有标签都被删除后,镜像才会真正从磁盘上删除。
docker save -o nginx-1.24.0.tar nginx:1.24.0
a.导出
docker save -o nginx-1.24.0.tar nginx:1.24.0
注意事项:
文件大小:保存的镜像文件可能会非常大,尤其是包含多个大型镜像时。在保存和传输这些文件时,要确保有足够的磁盘空间和网络带宽。
镜像版本:保存的镜像文件中包含的是特定版本(标签)的镜像。在恢复镜像时,要确保使用正确的标签和版本。
跨平台兼容性:虽然Docker镜像是设计为跨平台的,但在不同的操作系统上保存和加载镜像时,可能会遇到一些兼容性问题。尽量在相同或兼容的操作系统版本之间传输和使用镜像。
镜像依赖:如果保存的镜像依赖于其他基础镜像,确保在目标环境中也有这些基础镜像,或者将它们一起保存和传输。
b.删除
docker rmi nginx:1.24.0
c.导入
docker load < nginx-1.24.0.tar
四、Docker容器操作
1.容器的创建于启动
a.创建容器
docker create -it centos:7
命令语法:docker create[OPTIONS]IMAGE[COMMAND][ARG...]
参数说明:
OPTIoNS(可选参数):dockercreate支持众多可选参数,这些参数可以帮助你对创建的容器进行各种配置,以下是一些常用的参数:
-i,--interactive:保持标准输入打开,即使没有附加到容器上,常用于需要交互的应用程序。
-t,--tty:分配一个伪终端,通常与-i一起使用,模拟一个交互式的终端环境,如docker create -it。
-p,--publishlist:将容器内的端口映射到宿主机的端口,格式为宿主机端口:容器端口,例如-p8080:80表示将容器的80端口映射到宿主机的8080端口。
-V,--volumelist:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为宿主机路径:容器路径,例如-V/host/data:/container/data。
--namestring:为创建的容器指定一个自定义的名称,方便后续管理和识别。
-e,--envlist:设置容器内的环境变量,格式为变量名=变量值,例如-eDB_HOST=localhost。
--networkstring:指定容器要加入的网络,例如--networkmy_network。
IMAGE:指定用于创建容器的镜像名称和标签,如nginx:latest。如果本地没有该镜像,Docker会尝试从DockerHub等镜像仓库中拉取
[COMMAND][ARG....](可选):指定容器启动时要执行的命令及其参数。如果不指定,将使用镜像的默认启动命令。
b.查看所有的容器
docker ps -a
- 命令语法:docker ps[OPTIONS]
- 参数说明:
-a,--all:列出所有容器,包括正在运行的和已经停止的容器。默认情况下,docker ps 仅显示正在运行的容器。
-q,--quiet:只显示容器的ID,不显示其他详细信息。该参数常用于脚本编写,方便批量操作容器,比如批量停止或删除容器。
-s,--size:在输出中显示容器所占用的文件系统大小,包括读写层大小和总大小。
-f,--filterfilter:根据指定的条件过滤输出结果。过滤条件可以有多种,例如status=running表示只显示正在运行的容器;name=my_container表示只显示名称为my_container的容器。
-formatstring:使用Go模板语法自定义输出格式,用户可以根据自己的需求灵活定制输出内容和样式。
-n,--last int:显示最近创建的n个容器(包括已停止的)。例如,dockerps-n 3会显示最近创建的3个容器信息。
-l,--latest:只显示最近创建的容器(包括已停止的)。
c.容器的运行
docker start pedantic_fermat
命令语法:docker start[OPTIONS]CONTAINER[CONTAINER....]
参数说明:
-a,--attach:将本地标准输入、输出和错误输出附加到启动的容器上,即启动容器后进入容器的交互界面,能实时看到容器内程序的输出信息,也可以向容器内输入命令。
-i,--interactive:保持容器的标准输入打开,允许你与容器内的进程进行交互。通常和-a选项一起使用,以实现交互式操作。
--checkpointstring:指定从哪个检查点恢复容器。检查点功能允许你保存容器的当前状态,之后可以从该状态恢复容器的运行。
--checkpoint-dirstring:指定检查点文件所在的目录。
--detach-keys string:指定从附加模式退出的键序列。默认情况下,使用Ctrl-p 、ctrl-q组合键可以从附加模式退出容器,同时保持容器在后台运行。
--publish-all,-P:发布容器内所有暴露的端口到宿主机上,宿主机端口会随机分配。
CONTAINER [CONTAINER...]:可以指定一个或多个要启动的容器,既可以使用容器的名称,也可以使用容器的ID。
注意:
若容器启动失败,可使用dockerlogs命令查看容器的日志信息,以排查启动失败的原因。
使用-a选项附加到容器时,若要退出容器又不停止它,可使用默认的Ctrl-pCtrl-q组合键(可通过--detach-keys选项修改)。
对于依赖外部资源(如数据库、网络服务)的容器,要确保这些资源在启动容器前已经可用,否则容器可能因无法连接到依赖资源而启动失败。
d.利用容器执行命令(前台运行命令,执行完会退出)
docker run --name nginx01 nginx:1.24.0
选项:
-d:让容器在后台运行,并返回容器的ID
-i:保持标准输入打开,允许你于容器内的进程进行交互
-t:分配一个伪终端,通常于-i一起使用,模拟一个交互式的终端环境
--name string:为创建的容器指定一个自定义的名称
-m:限制容器可以使用的内存大小
--cpus decimal:限制容器可以使用的CPU资源
-p:将容器内的端口映射到宿主机的端口,格式为宿主机端口:容器端口
-P:发布容器内所有暴露的端口到宿主机上,宿主机端口会随机分配
-v:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为宿主机路径:容器路径
-e:设置容器内的环境变量,格式为变量名=变量值
--nerwork string:指定容器要加入的网络
IMAGE:指定用于创建容器的镜像名称和标签
e.在启动时持续在后台运行
#随机端口号 docker run -d --name nginx2 -P nginx:1.24.0 #指定端口号 docker run -d --name nginx3 -p 80:80 nginx:1.24.0
注意:
容器退出问题:若容器内的主进程退出,容器也会随之停止运行。例如,若在容器内运行的脚本执行完毕后没有其他持续运行的进程,容器就会停止。因此,要确保容器内有持续运行的服务或进程。
日志查看:由于容器在后台运行,无法直接看到其输出信息。可以使用dockerlogs命令查看容器的日志,例如dockerlogs<容器ID或名称>,以此来排查容器运行过程中出现的问题。
资源占用:在后台运行的容器会持续占用系统资源(如CPU、内存等),要注意监控容器的资源使用情况,避免资源过度占用影响系统性能。可以使用dockerstats命令查看容器的资源使用统计信息。
2.容器的终止
a.注意事项:
容器响应情况:有些容器内的应用程序可能无法正确处理SIGTERM信号,导致无法在指定时间内正常关闭。在这种情况下,Docker会在等待时间结束后发送SIGKILL信号强制终止容器,可能会造成数据丢失。
依赖关系:在停止容器时,要考虑容器之间的依赖关系。如果一个容器依赖于另一个容器提供的服务,先停止被依赖的容器可能会导致依赖容器出现问题。
停止状态检查:可以使用dockerps命令检查容器是否已经成功停止。停止的容器不会再出现在dockerps的输出中,但可以使用dockerps-a查看所有容器(包括已停止的)。
3.把容器中的内容复制到宿主机
docker cp nginx01:/usr/share/nginx/html/index.html ./
4.把宿主机中的内容复制到容器中
docker cp index.html nginx2:/usr/share/nginx/html/index.html
5.进入容器
docker exec -it nginx1 bash#添加测试
echo 'This is Docker' > /usr/share/nginx/html/index.html
a.命令语法:docker exec[OPTIONS]CONTAINER COMMAND[ARG...]
b.参数说明:
-d,--detach:让命令在容器后台执行,不将命令的输出信息显示在当前终端,执行后会返回命令在容器内的执行进程ID。
-i,--interactive:保持标准输入打开,允许你与容器内执行的命令进行交互,通常用于需要输入信息的命令。
-t,--tty:分配一个伪终端,模拟一个交互式的终端环境,一般和-i一起使用,即dockerexec-it,这样可以让你像在本地终端一样与容器内的命令进行交互。
-u,--userstring:指定在容器内执行命令的用户,可以是用户名或用户ID,例如
--userroot:表示以root用户身份执行命令。
-W,--Workdirstring:指定命令在容器内的工作目录,即命令执行时的当前目录。
CONTAINER:指定要在哪个正在运行的容器中执行命令,可以使用容器的名称或者ID。
COMMAND [ARG...]:指定要在容器内执行的命令及其参数。例如,执行1s命令查看容器内的文件列表,或者执行bash进入容器的shell环境。
6.容器导出
a.应用场景:
迁移容器:当你需要把一个容器从一个Docker环境迁移到另一个Docker环境时,可以使用dockerexport导出容器的文件系统,再在目标环境中导入使用。
备份容器:对容器的当前状态进行备份,以便在需要时可以恢复到该状态。
分析容器内容:将容器的文件系统导出后,可以在宿主机上查看和分析容器内的文件和目录结构。
7.容器导入生成镜像
docker import nginx1.tar nginx1
8.容器删除
docker rm pedantic_fermat
a.命令语法:docker rm[OPTIONS]CONTAINER[CONTAINER...]
b.参数说明:
-f,--force:强制删除正在运行的容器。默认情况下,dockerrm只能删除已停止的容器,添加该选项后,会向容器内的主进程发送SIGKILL信号,直接终止容器并将其删除,但可能导致数据丢失或应用异常。
-l,--1ink:仅删除容器的网络连接,而不删除容器本身。通常用于清理容器与网络之间的关联。
v,--volumes:在删除容器的同时,删除与该容器关联的数据卷。如果数据卷中存储着重要数据,使用该选项要谨慎。
CONTAINER[CONTAINER...]:指定要删除的容器,可以是容器的名称或者ID,支持同时指定多个容器,用空格分隔。
c.注意:
容器状态:默认只能删除已停止的容器,若要删除正在运行的容器,需使用-f选项,但可能会导致数据丢失或应用异常,因此尽量先使用dockerstop正常停止容器后再删除。
数据卷处理:使用-v选项删除容器关联的数据卷时要谨慎,确保数据卷中的数据不再需要,否则可能造成数据丢失。
依赖关系:在删除容器前,要考虑容器之间的依赖关系。如果一个容器依赖于另一个容器提供的服务,先删除被依赖的容器可能会导致依赖容器出现问题。
不可逆操作:容器删除后无法直接恢复,因此在执行删除操作前要确认容器确实不再需要。