Docker常见命令
目录
- 一、系统管理命令
- 二、镜像管理命令
- 三、容器管理命令
一、系统管理命令
1、启动Docker服务
systemctl start docker
2、停止Docker服务
systemctl stop docker
3、重启Docker服务
systemctl restart docker
4、设置Docker开机启动
systemctl enable docker
5、查看Docker服务状态
systemctl status docker
6、查看Docker版本信息
docker version 或 docker info
二、镜像管理命令
1、查看本地镜像
docker images
- REPOSITORY:镜像仓库名称
- TAG:镜像的标签信息
- 镜像ID:唯一用来标识镜像,如果两个镜像的ID相同,说明他们实际上指向了同一个镜像,只是具有不同标签名称而已
- CREATED:创建时间,说明镜像的最后更新时间
- SIZE:镜像大小
2、搜索Docker Hub上的镜像
docker search [镜像名]
2.1、常见选项
-f, --filter filter
:这个选项允许你根据特定条件过滤搜索结果。常见的条件是stars
--format string
:此选项允许你使用Go模板语法来自定义输出格式。--limit int
:这个选项用来限制返回的搜索结果数量。--no-trunc
:使用--no-trunc
选项后,所有输出都不会被截断,会看到完整的描述和其他信息。
2.2、示例:搜索星数大于100的MySQL镜像并限制搜索结果为5个
docker search -f stars=100 --limit 5 mysql
docker search
进行搜索返回的结果中不仅会列出直接名为mysql
的镜像,还会包括描述中带有mysql
的其他镜像
3、从Docker Hub上拉取镜像
不加tag(版本号)即默认拉取最新版本latest
docker pull [镜像名:标签]
3.1、常见选项
-a, --all-tags
:下载仓库中的所有带标签的镜像。--disable-content-trust
:跳过镜像验证,默认值为true,意味着默认情况下不进行验证。--platform string
:如果服务器支持多平台,则设置平台。例如,可以指定为linux/amd64
、linux/arm64
等。-q, --quiet
:抑制冗长的输出,使命令执行过程中减少信息打印,使得输出更加简洁。
3.3、示例:拉取redis-5.0.14
docker pull redis:5.0.14
4、标签管理
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
为本地镜像添加或更改标签。
4.1、示例:给刚下载的redis添加标签
docker tag redis:5.0.14 myredis:5.0.14
当
docker images
显示出两个标签看起来一样的镜像(除了仓库名不同),它们实际上指向同一个底层镜像数据。,只是通过不同的名称和标签来区分。
5、获取镜像详细信息
docker inspect [OPTIONS] NAME|ID
5.1、常见选项
- -f, --format string:此选项允许你使用自定义的模板格式化输出。默认情况下,输出是 JSON 格式。你可以指定
'json'
直接得到 JSON 输出,或者使用一个自定义的 Go 模板字符串(例如'{{.Name}} {{.Image}}'
)来提取特定信息。 - -s, --size:当检查类型为容器时,这个选项会让输出包含每个层的总文件大小,有助于了解容器占用的空间情况。
- --type string:指定要返回 JSON 信息的对象类型。这在处理多种类型对象时非常有用,但通常默认为自动检测对象类型。
5.2、示例:检查reids:5.0.14镜像的ID和创建时间
docker inspect --format '{{println .Id}}{{println .Created}}' redis:5.0.14
docker inspect --format '{{printf "%s\n%s" .Id .Created}}' redis:5.0.14
6、展示镜像的构建历史
用于展示一个Docker镜像的构建历史,列出构建该镜像时的每一层及其相关信息
docker history [OPTIONS] IMAGE
6.1、常见选项
- --format string:
- 'table': 默认值,以表格形式展示输出,并包含列标题。
- 'table TEMPLATE': 自定义模板的表格输出,允许你使用特定的Go模板来格式化输出。
- 'json': 以JSON格式输出历史信息。
- 'TEMPLATE': 使用指定的Go模板格式化输出,提供高度自定义的输出格式。
- -H, --human: 是否以人类可读的格式显示大小和日期,默认为
true
。 - --no-trunc: 不截断输出,尤其是在显示镜像ID或层ID时,会完整显示而不做缩短处理。
- -q, --quiet: 仅显示镜像ID列表,而不包括其他详细信息,适用于当你只需要镜像ID而不需要附加信息时。
6.2、示例:列出redis:5.0.14各层创建的信息
docker history redis:5.0.14
7、镜像的导入导出
7.1、导出
-
方式一:
-
docker save redis:5.0.14 -o /opt/redis.tar.gz ll /opt/redis.tar.gz
-
-
方式二:
-
docker save myredis:5.0.14 > /opt/myredis.tar.gz ll /opt/myredis.tar.gz
-
7.2、导入
-
方式一:
-
docker load -i /opt/redis.tar.gz
-
-
方式二:
-
docker load < /opt/myredis.tar.gz
-
8、删除镜像
8.1、常见选项
--force, -f
:强制删除镜像,即使有依赖也不提示。--no-prune
:不删除未被标记的父镜像。
8.2、通过镜像名称+标签删除镜像
docker rmi redis:5.0.14
8.3、通过镜像id删除镜像
docker images
docker rmi 99ee9af2b6b1
8.4、删除所有无容器使用的镜像
docker system prune -a
三、容器管理命令
1、Docker容器的生命周期
- 创建(Created):当你使用
docker create
命令创建一个容器时,容器就处于创建状态。在这个阶段,容器已经被创建,但还没有被启动。 - 启动(Running):当你使用
docker start
命令启动一个已经创建的容器时,容器就会进入运行状态。在这个阶段,容器内的进程正在运行。 - 暂停(Paused)︰你可以使用
docker pause
命令来暂停一个正在运行的容器,使得容器内的所有进程都会被挂起。 - 恢复(Unpaused):使用
docker unpause
命令可以恢复一个被暂停的容器,使得容器内的进程继续运行。 - 停止(Stopped):当你使用
docker stop
命令停止一个运行中的容器时,容器会进入停止状态。在这个阶段,容器内的进程会被发送SIGTERM信号,然后等待一段时间后被强制终止。 - 删除(Deleted):使用
docker rm
命令可以删除一个已经停止的容器,释放其占用的系统资源。
docker create
触发create事件,容器进入stopped状态;docker rm
触发destory事件使容器完成从stopped->deleted状态迁移;docker start
触发start事件使容器完成从stopped->running状态;docker run
触发create事件经过stopped,触发start事件后进入running状态docker kill
使容器完成从running->stopped状态迁移。docker kill先后触发的die和kill事件,然后会kill掉当前容器中的进程,docker stop
使容器完成从running->stopped状态迁移。docker stop先后触发的die和stop事件,并不会杀掉当前容器的进程。docker restart
使容器完成从running->running状态迁移。先后触发了die、start、restart事件;docker paused
使容器完成从running->paused状态迁移。触发了pause事件;docker unpause
使容器完成从paused->running状态迁移。触发了unpause事件;
2、创建容器
当使用
docker create
命令创建一个容器时,容器就处于创建状态。在这个阶段,容器已经被创建,但还没有被启动。
dcoker create IMAGE[:TAG]
2.1、示例:创建一个nginx容器
docker create nginx
3、启动容器
docker start CONTAINER ID
3.1、示例:启动nginx容器
[root@localhost ~]# docker start b0
b0
这里容器ID输入了b0也启动了容器
只要这些字符足以唯一标识一个容器。Docker会自动匹配并尝试启动
与之相匹配的第一个容器。
4、创建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
4.1、常见选项
选项 | 描述 |
---|---|
--add-host |
添加自定义的主机到IP映射(格式:主机:IP) |
-a, --attach |
连接到容器的 STDIN、STDOUT 或 STDERR |
--annotation |
给容器添加注解(通过OCI运行时传递) |
-c, --cpu-shares |
CPU份额(相对权重) |
-d, --detach |
后台运行容器并打印容器ID |
--env |
设置环境变量 |
-e, --env-file |
从文件读取环境变量 |
-h, --hostname |
设置容器的主机名 |
-i, --interactive |
即使不连接也保持 STDIN 打开 |
-l, --label |
设置容器的元数据标签 |
--name |
为容器指定名称 |
-p, --publish |
将容器的端口发布到主机 |
-P, --publish-all |
将所有暴露的端口随机映射到主机 |
-t, --tty |
分配一个伪TTY |
-u, --user |
指定用户名或UID(格式:用户名 |
--volume, -v |
挂载一个卷 |
--workdir, -w |
设置容器内部的工作目录 |
--cap-add |
添加Linux能力 |
--cap-drop |
移除Linux能力 |
--device |
添加主机设备到容器 |
--device-read-bps |
限制从设备读取速率(每秒字节数) |
--memory |
内存限制 |
--network |
连接容器到网络 |
--privileged |
给予容器额外权限 |
--read-only |
以只读方式挂载容器的根文件系统 |
--restart |
容器退出后的重启策略 |
--rm |
容器退出后自动删除 |
--security-opt |
设置安全选项 |
--ulimit |
设置ulimit限制 |
--volume-driver |
为容器指定卷驱动 |
--volumes-from |
从其他容器挂载卷 |
--health-cmd |
设置健康检查命令 |
--memory-swappiness |
调整容器内存交换行为 |
--sysctl |
设置sysctl选项 |
--tmpfs |
挂载临时文件系统目录 |
--stop-signal |
设置停止容器的信号 |
--cpu-period, --cpu-quota |
限制CPU使用周期和配额(CFS) |
4.2、示例:创建并启动一个hello-world容器
docker run hello-world
4.3、示例:后台启动个nginx容器,保持标准输入打开并分配一个终端(-itd)
docker run -itd nginx
4.4、示例:后台启动个redis:5.0.14容器,保持标准输入打开,分配一个终端并取别名为redis-v1(-itd --name)
docker run -itd --name redis-v1 redis:5.0.14
4.5、示例:后台启动个centos容器,保持标准输入打开,分配一个终端并取别名为centos-v2,并设置随docker服务启动而启动(-itd --name --restart=always)
docker run -itd --name centos-v2 --restart=always centos
5、查看正在运行的容器
docker ps
6、查看所以容器(包含运行和已停止的)
docker ps -a
7、挂起容器
docker pause CONTAINER ID/CONTAINER NAMES
7.1、示例:挂起nginx容器
docker ps
docker pause angry_proskuriakova
8、取消挂起容器
docker pause CONTAINER ID/CONTAINER NAMES
8.1、示例:取消挂起的nginx容器
docker unpause angry_proskuriakova
9、终止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
9.1、示例:终止nginx容器
docker stop b0
10、删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
10.1、常见选项
-f, --force
:此选项强制删除容器,即使容器正在运行也会立即删除。如果不使用这个选项,Docker 会拒绝删除正在运行的容器,要求你先停止容器。-l, --link
:在 Docker 的早期版本中,它用于移除两个容器之间的链接关系。由于 Docker 网络的改进,特别是自 Docker 1.9 引入了用户定义网络之后,容器链接功能已不再推荐使用-v, --volumes
:当删除容器时,如果容器中挂载了匿名卷(即由 Docker 自动创建且未命名的卷),默认情况下这些卷不会被自动删除。使用--volumes
选项会指示 Docker 在删除容器的同时,也删除与之关联的所有匿名卷。
10.2、示例:删除hello-world容器
docker rm b6
10.3、示例:批量删除已停止运行的容器
docker rm -f `docker ps -qa`
11、attach进入容器
使用此方式进入容器的操作都是同步显示的且exit容器将被关闭
docker attach [OPTIONS] CONTAINER
11.1、示例:使用attach进入centos容器
docker attach 461
11.1、示例:优雅的退出容器(退出时容器保持运行)
ctrl + p + q
12、exec进入容器(推荐使用)
执行单次命令后进入容器,退出容器后容器还在运行
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
12.1、示例:使用exec进入centos容器
docker exec -it 461 /bin/bash
13、nsenter进入容器
nsenter命令需要通过pid进入到容器内部
nsenter [options] <program> [<argument>...]
13.1、常见选项
选项 | 描述 |
---|---|
-t, --target | 指定要获取其名称空间的目标进程的PID。 |
-m, --mount[=] | 进入指定文件(默认为 /proc//ns/mnt)代表的挂载命名空间。 |
-u, --uts[=] | 进入指定文件(默认为 /proc//ns/uts)代表的UTS命名空间(主机名等)。 |
-i, --ipc[=] | 进入指定文件(默认为 /proc//ns/ipc)代表的System V IPC命名空间。 |
-n, --net[=] | 进入指定文件(默认为 /proc//ns/net)代表的网络命名空间。 |
-p, --pid[=] | 进入指定文件(默认为 /proc//ns/pid)代表的PID命名空间。 |
-U, --user[=] | 进入指定文件(默认为 /proc//ns/user)代表的用户命名空间。 |
-S, --setuid | 在进入的命名空间中设置UID。 |
-G, --setgid | 在进入的命名空间中设置GID。 |
--preserve-credentials | 不修改进入命名空间后的UID或GID。 |
-r, --root[=] | 设置进入命名空间后的根目录。 |
-w, --wd[=] | 设置进入命名空间后的工作目录。 |
-F, --no-fork | 不进行fork操作直接执行指定程序。 |
-Z, --follow-context | 根据目标PID设置SELinux上下文。 |
-h, --help | 显示帮助信息并退出。 |
-V, --version | 显示版本信息并退出。 |
13.2、示例:使用nsenter进入容器
docker inspect -f "{{.State.Pid}}" 461
#首先使用docker inspect获取到容器的pid
nsenter -t 5386 -m -u -i -n -p
#-t 5386:指定PID为5386进入这个进程的各个命名空间。-m -u -i -n -p分别是进入目标进程的挂载命名空间、用户命名空间、IPC命名空间、网络命名空间、PID命名空间
13.3、示例:脚本形式进入容器
[root@localhost ~]# cat docker_in.sh
#!/bin/bash
docker_in(){
DOCKER_ID=$1
PID=`docker inspect -f "{{.State.Pid}}" ${DOCKER_ID}`
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
14、端口映射
Docker容器的端口映射是一种让宿主机(运行Docker的机器)与Docker容器之间的网络通信成为可能的技术。
它允许外部系统通过宿主机的IP地址和端口访问到容器内部的服务。
-p 宿主机端口:容器端口
14.1、示例:前台启动nginx,随机端口映射(-P)
docker run -P nginx
ss -tunlp
#可以看到,随机的端口映射其实是从32768开始映射
前台启动随机端口映射 |
---|
ss -tunlp进行端口验证 |
浏览器输入ip+端口号访问 |
14.2、本地端口80映射到容器80端口
docker run -itd -p 8080:80 --name nginx-v1 nginx:latest
后台启动,保持标准输入并分配一个伪TTY终端,取别名为nginx-v1 |
---|
浏览器输入ip+端口号访问 |
14.3、本地ip:本地端口:容器端口
docker run -itd -p 192.168.112.60:8081:80 --name nginx-v2 nginx:latest
使用本地ip:本地端口:容器端口进行端口映射 |
---|
浏览器输入ip+端口号访问 |
14.4、本地ip:本地随机端口:容器端口
docker run -itd -p 192.168.112.60::80 --name nginx-v3 nginx:latest
使用本地ip:本地随机端口:容器端口进行端口映射 |
---|
浏览器输入ip+端口号访问 |
14.5、本地ip:本地端口:容器端口/协议默认为tcp协议
docker run -itd -p 192.168.112.60:8082:80/tcp --name nginx-v4 nginx:latest
使用本地ip:本地端口:容器端口/协议默认为tcp协议进行端口映射 |
---|
浏览器输入ip+端口号访问 |
15、查看容器已经映射的端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
15.1、示例:查看目前nginx容器已经映射的端口
docker ps
[root@localhost ~]# docker port 50
80/tcp -> 192.168.112.60:8082
[root@localhost ~]# docker port ba
80/tcp -> 192.168.112.60:32768
[root@localhost ~]# docker port 5b
80/tcp -> 192.168.112.60:8081
[root@localhost ~]# docker port 52
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
16、Docker容器文件的拷贝
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
#docker cp 容器ID/名称:文件路径 要拷贝到外部的路径
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
#docker cp 要拷贝到外部的路径 容器ID/名称:文件路径
无论容器是否开启都可以进行拷贝
16.1、示例:从宿主机上拷贝文件到centos容器
docker cp /opt/centos-v1.txt centos-v1:/opt/
#将宿主机的/opt/centos-v1.txt文件拷贝到centos-v1容器内部的/op/下
16.2、示例:从centos容器拷贝文件到宿主机上
docker cp centos-v1:/tmp/hello.txt /tmp/
#将centos-v1容器内/tmp/hello.txt文件拷贝到宿主机的/tmp/下
17、查看容器的日志信息
docker logs [OPTIONS] CONTAINER
17.1、示例:查看nginx-v4容器日志
docker logs nginx-v4
18、更换容器名
docker rename 容器ID/容器名 新容器名
18.1、将容器centos-v2更换名字为mycentos-v2
docker rename centos-v2 mycentos-v2
19、数据挂载
-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v...
19.1、示例:运行一个nginx容器,进行端口映射以及数据卷挂载并设置开机自启动
[root@localhost ~]# mkdir -p /data/web
[root@localhost ~]# echo "nginx test" > /data/web/index.html
[root@localhost ~]# docker run -itd -p 8085:80 --name nginx-v5 --restart=always -v /data/web/:/usr/share/nginx/html/ nginx
3a34a5e7f7cf9d457587227b9279601d57c4095a1bb515aba5ac2c8b049aacfd
[root@localhost ~]# curl 192.168.112.60:8085
nginx test
至于容器里的绑定挂载和数据卷的概念后面单独解释
20、指定容器DNS
一是通过将dns地址配置在宿主机上
二是将参数配置在docker启动脚本里面
我们这里讨论第一种
20.1、示例:以后台模式创建并启动一个命名为centos-v3的CentOS容器,使用Google的公共DNS服务器进行域名解析。
docker run -itd --rm --dns 8.8.8.8 --name centos-v3 centos bash
21、导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,导出一个容器快照
docker export /指定路径/自定义名.tar 容器名/ID
21.1、示例:将mycentos-v2容器导出到/opt/目录下的mycentos-v2压缩包
docker export -o /opt/mycentos-v2.tar mycentos-v2
22、导入容器
导入一个容器快照到本地镜像库
docker import /指定路径/tar压缩文件 镜像名:标签
22.1、示例:将/opt/目录下的mycentos-v2.tar导入到本地镜像库
docker import /opt/mycentos-v2.tar mycentos:v2
热门相关:观察者 翻转人生 战神身份被发现了 诱惑肌肤的屯德谷仙女 最强汽修王