一、了解Docker
1、什么是Docker
Docker为应用程序的开发、发布和运行提供了一个基于容器的标准化平台。容器运行的是应用程序,Docker平台用来管理容器的整个生命周期
2、虚拟机与容器
2.1、虚拟机是什么
虚拟机(Virtual Machine)是一种软件实现的计算机系统,它在一个物理计算机上模拟出多个独立的虚拟计算机环境。每个虚拟机都具有自己的操作系统、应用程序和资源,就像是一台独立的计算机一样。
2.2、虚拟机与传统物理机优势
- 采用资源池化技术,一台物理机的资源可分配到不同的虚拟机上。
- 便于弹性扩展,增加物理机或虚拟机都很方便
- 容易云化,如将应用程许部署到云主机等。
2.3、容器是什么
容器是一种轻量级、可移植的软件打包技术,用于将应用程序及其所有依赖项(如库、配置文件等)打包在一起,以便在不同的计算环境中运行。容器在操作系统级别实现虚拟化,每个容器都运行在独立的用户空间内,与宿主机共享相同的内核,从而实现更高效的资源利用和更快速的启动时间。
2.4、容器与虚拟机优势
容器启动快、开销少、而且迁移更便携
2.5、容器与虚拟机的隔离性
容器是应用层的隔离,虚拟机是物理资源层面的隔离
2.6、容器与虚拟机的区别
3、Docker引擎组件
-
服务器
-
即Docker守护进程(Daemon),这是Docker的后台应用程序,可使用dockerd命令进行管理。Docker守护进程监听来自Docker API的请求,可用于创建和管理Docker对象,如镜像、容器、网络和卷。一台主机运行一个Docker守护进程。
-
-
REST API:
-
定义程序与Docker守护进程交互的接口,便于编程操作Docker平台和容器。REST API是一套目前比较成熟的Internet应用程序API架构
-
-
客户端
-
即命令行接口(Command-Line Interface,CLI),可使用Docker命令进行操作。
-
4、Docker架构
-
Docker客户端与Docker守护进程通信,而Docker守护进程相当于Docker服务器,负责构建、运行和分发容器的繁重任务。
-
Docker客户端和守护进程可以在同一个系统上运行,也可以让Docker客户端连接到远程主机上的Docker守护进程。
-
Docker守护进程和Docker客户端属于Docker引擎的一部分
-
Docker注册中心用于存储和分发Docker镜像。Docker Hub和Docker Cloud是任何人都可以使用的公开注册中心,默认会在Docker Hub上查找镜像。除此之外,用户可以运行自己的私有注册中心。
5、Docker的底层技术
- 名称空间(Namespace):又称命名空间,Linux的名称空间机制提供了一种资源隔离的解决方案。
- 控制组(Control Group):Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限制,Docker引擎正是通过这个技术来实现限制容器使用的资源
-
联合文件系统(Union File System):可以将其他文件合并到一个挂载点。
- 容器格式(Container Format):Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认为Libcontainer。
二、Docker命令行的使用
1、Docker命令行接口类型
Docker是一个庞大而复杂平台,其命令行接口可分为以下几种:
- 引擎命令行接口:它提供了Docker最主要的命令,包括所有的docker和dockerd命令。
- 容器编排命令行接口:这是Docker Compose工具提供的,让用户构建并运行更多的应用程序。
- 机器命令行接口:这是Docker Machine工具所提供的,用于配置和管理远程Docker主机。
- DTR命令行接口:用于部署和管理Docker可信注册中心。
- UCP命令行接口:用于部署和管理通用控制面板。
2、docker命令列表
[root@docker-a ~]# docker
Usage: docker [OPTIONS] COMMAND # 基本语法格式
A self-sufficient runtime for containers
Common Commands: # 常用列表
run # 从镜像中创建并运行一个新容器
exec # 在一个已经运行的容器中执行命令
ps # 列出当前正在运行的容器
build # 根据 Dockerfile 构建一个新的 Docker 镜像
pull # 从 Docker Hub 或其他 Docker 仓库拉取镜像
push # 将镜像推送到 Docker Hub 或其他 Docker 仓库
images # 列出系统中的镜像
login # 登录到 Docker Hub 或其他 Docker 仓库
logout # 从 Docker Hub 或其他 Docker 仓库登出
search # 在 Docker Hub 上搜索镜像
version # 显示 Docker 的版本信息
info # 显示系统级别的 Docker 信息,包括镜像、容器、存储驱动等信息
Management Commands: # 管理命令列表
builder # 管理构建过程,包括构建镜像、构建缓存等
buildx # Docker 的一个插件,用于扩展 Docker 的构建功能,支持构建多架构镜像
compose # 是 Docker 的一个工具,用于定义和运行多容器 Docker 应用。它使用 YAML 文件来配置应用的服务
container # 管理容器,包括创建、运行、停止、删除等操作
context # 管理 Docker 上下文,上下文是 Docker 客户端操作的隔离环境,可以是 Docker 守护进程或 Kubernetes 集群
image # 管理镜像,包括创建、导入、导出、保存等操作
manifest # 管理 Docker 镜像清单,这些清单用于组合多个标签的镜像
network # 管理 Docker 网络,包括创建、删除、列出网络等
plugin # 管理 Docker 插件,插件可以扩展 Docker 的功能
system # 管理 Docker 系统,包括查看系统信息、清理资源等
trust # 管理 Docker 内容信任,用于签署和验证镜像的完整性
volume # 管理 Docker 数据卷,数据卷用于持久化和共享容器数据
Swarm Commands:
swarm Manage Swarm
Commands: # 操作命令列表
attach # 将本地的标准输入输出错误流附加到正在运行的容器上
commit # 从容器的更改中创建一个新的镜像
cp # 在容器和本地文件系统之间复制文件或文件夹
create # 创建一个新的容器
diff # 检查容器文件系统上的文件或目录的变更
events # 从服务器获取实时事件
export # 将容器的文件系统导出为 tar 归档文件
history # 显示镜像的历史记录,即构建镜像的每层所做的更改
import # 从 tarball 文件或 STDIN 导入内容以创建文件系统镜像
inspect # 返回 Docker 对象的详细信息
kill # 终止一个或多个正在运行的容器
load # 从一个 tar 归档文件或 STDIN 加载一个镜像
logs # 获取容器的日志
pause # 暂停一个或多个容器内的所有进程
port # 列出容器的端口映射,或列出特定映射
rename # 重命名一个容器
restart # 重启一个或多个容器
rm # 删除一个或多个容器
rmi # 删除一个或多个镜像
save # 将一个或多个镜像保存到 tar 归档文件
start # 启动一个或多个已停止的容器
stats # 显示一个或多个容器的资源使用统计信息的实时流
stop # 停止一个或多个正在运行的容器
tag # 为 SOURCE_IMAGE 创建一个指向 TARGET_IMAGE 的标签
top # 显示容器中正在运行的进程
unpause # 取消暂停一个或多个容器内的所有进程
update # 更新一个或多个容器的配置
wait # 阻塞直到一个或多个容器停止,然后打印它们的退出代码
Global Options: # 全局选项
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket to connect to
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Run 'docker COMMAND --help' for more information on a command.
最后一条命令提示执行docker COMMAND --help命令来查看某条具体子命令的帮助信息。例如:
[root@docker-2322030238 ~]# docker tag --help
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
这些docker命令大致分为以下4个类型:
- 系统信息:如info、version
- 系统运维:如attach、build、commit、run等
- 日志信息:如events、history、logs等
- Docker注册:如login、pull、push、search等
3、docker命令的基本语法
# 基本语法
docker [选项] 命令
# 其中命令是docker命令的子命令。子命令又有自己的选项和参数,例:
docker attach [选项] 容器
# 其中,选项是attach子命令的选项,容器是attach子命令的容器,表示要连接的目标容器
# 有的选项即可以用短格式,又可使用长格式
docker run -t -i ubuntu /bin/bash
docker run -it ubuntu /bin/bash
# 布尔值选项(开关选项)
-d=false
# 默认布尔值为True的可以不赋值
docker run -d
docker build --rm=false
# 多值选项
docker run -a stdin -a student -i -t ubuntu /bin/bash
docker run -a stdin -a student -a stderr ubuntu /bin/ls
docker run -v /host:/container example/mysql
# 给布尔值赋值时,必须使用等号。给值为字符串或整数的选项赋值时,可以使用等号或不使用
docker run -v /host:/container example/mysql
docker run -v=/host:/container example/mysql
# 部分选项的值为键值对
docker run -it --mount source=nginx-vol,destination=/nginx ubuntu /bin/bash
# 对于较长的单行命令,为便于阅读,与Linux命令一个室友连续符(\)进行换行:
docker run --device=/dev/sdc:/dev/xvdc \
--device=/dev/sdd --device=/dev/zero:/dev/nulo \
-i -t \
ubuntu ls -l /dev/{xvdc,sdd,nulo}
# 这样的命令在命令行中输入时,换行后会在下一行开头显示">"符号,表示当前行是上一行的延续
4、实例:运行一个容器
[root@docker-a ~]# docker run -i -t ubuntu /bin/bash
root@11f377cc8d8f:/#
这个命令会执行以下操作:
- 如果本地没有Ubuntu镜像,则Docker会从所配置的镜像注册中心下载该镜像,就像手动执行了docker puul ubuntu命令一样
- Docker创建了一个新容器。就像手动执行docker container create命令一样
- Docker给容器分配一个可读写的文件系统作为最顶层,这一层就是正在运行的容器本地文件系统,容器可以在其中创建或修改文件和目录
- Docker创建一个网络接口,用于将容器连接到默认网络,并为容器分配IP地址。默认容器可以通过主机的网络连接访问外部网络
- Docker启动容器并且执行/bin/bash命令
root@11f377cc8d8f:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@11f377cc8d8f:/# uname -a # 当前操作系统内核信息
Linux 11f377cc8d8f 4.18.0-513.5.1.el8_9.x86_64 #1 SMP Fri Sep 29 05:21:10 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux
root@11f377cc8d8f:/# cat /etc/issue # 当前操作系统发行版信息
Ubuntu 22.04.4 LTS \n \l
当用户输入exit命令结束/bin/bash命令时,容器也会停止运行,但不会被删除。可以再次启动容器,或删除容器
root@11f377cc8d8f:/# exit
exit
[root@docker-a ~]#