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

image-20240525094236090

6、查看Docker版本信息

docker version 或 docker info

image-20240525094312048

二、镜像管理命令

1、查看本地镜像

docker images

image-20240525094406388

  • 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

image-20240525100737728

docker search进行搜索返回的结果中不仅会列出直接名为 mysql的镜像,还会包括描述中带有 mysql 的其他镜像

3、从Docker Hub上拉取镜像

不加tag(版本号)即默认拉取最新版本latest

docker pull [镜像名:标签]

3.1、常见选项

  • -a, --all-tags:下载仓库中的所有带标签的镜像。
  • --disable-content-trust:跳过镜像验证,默认值为true,意味着默认情况下不进行验证。
  • --platform string:如果服务器支持多平台,则设置平台。例如,可以指定为linux/amd64linux/arm64等。
  • -q, --quiet:抑制冗长的输出,使命令执行过程中减少信息打印,使得输出更加简洁。

3.3、示例:拉取redis-5.0.14

Docker Hub官网

image-20240525104713217

docker pull redis:5.0.14

image-20240525104949188

4、标签管理

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

为本地镜像添加或更改标签。

4.1、示例:给刚下载的redis添加标签

docker tag redis:5.0.14 myredis:5.0.14

image-20240525105944511

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

image-20240525112805040

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

image-20240525115457957

7、镜像的导入导出

7.1、导出

  • 方式一:
    • docker save redis:5.0.14 -o /opt/redis.tar.gz
      ll /opt/redis.tar.gz
      
    • image-20240525170608813

  • 方式二:
    • docker save myredis:5.0.14 > /opt/myredis.tar.gz
      ll /opt/myredis.tar.gz
      
    • image-20240525170858361

7.2、导入

  • 方式一:
    • docker load -i /opt/redis.tar.gz
      
    • image-20240525171907180

  • 方式二:
    • docker load < /opt/myredis.tar.gz
      
    • image-20240525172118692

8、删除镜像

8.1、常见选项

  • --force, -f:强制删除镜像,即使有依赖也不提示。
  • --no-prune:不删除未被标记的父镜像。

8.2、通过镜像名称+标签删除镜像

docker rmi redis:5.0.14

image-20240525175442133

8.3、通过镜像id删除镜像

docker images
docker rmi 99ee9af2b6b1

image-20240525175704040

8.4、删除所有无容器使用的镜像

docker system prune -a

三、容器管理命令

1、Docker容器的生命周期

2049395-20200730074419479-1325155358

  • 创建(Created):当你使用docker create命令创建一个容器时,容器就处于创建状态。在这个阶段,容器已经被创建,但还没有被启动。
  • 启动(Running):当你使用docker start命令启动一个已经创建的容器时,容器就会进入运行状态。在这个阶段,容器内的进程正在运行。
  • 暂停(Paused)︰你可以使用docker pause命令来暂停一个正在运行的容器,使得容器内的所有进程都会被挂起。
  • 恢复(Unpaused):使用docker unpause命令可以恢复一个被暂停的容器,使得容器内的进程继续运行。
  • 停止(Stopped):当你使用docker stop命令停止一个运行中的容器时,容器会进入停止状态。在这个阶段,容器内的进程会被发送SIGTERM信号,然后等待一段时间后被强制终止。
  • 删除(Deleted):使用docker rm命令可以删除一个已经停止的容器,释放其占用的系统资源。
  1. docker create触发create事件,容器进入stopped状态;
  2. docker rm触发destory事件使容器完成从stopped->deleted状态迁移;
  3. docker start触发start事件使容器完成从stopped->running状态;
  4. docker run触发create事件经过stopped,触发start事件后进入running状态
  5. docker kill 使容器完成从running->stopped状态迁移。docker kill先后触发的die和kill事件,然后会kill掉当前容器中的进程,
  6. docker stop使容器完成从running->stopped状态迁移。docker stop先后触发的die和stop事件,并不会杀掉当前容器的进程。
  7. docker restart使容器完成从running->running状态迁移。先后触发了die、start、restart事件;
  8. docker paused使容器完成从running->paused状态迁移。触发了pause事件;
  9. docker unpause使容器完成从paused->running状态迁移。触发了unpause事件;

2、创建容器

当使用docker create命令创建一个容器时,容器就处于创建状态。在这个阶段,容器已经被创建,但还没有被启动。

dcoker create IMAGE[:TAG]

2.1、示例:创建一个nginx容器

docker create nginx

image-20240525201048391

3、启动容器

docker start CONTAINER ID

3.1、示例:启动nginx容器

[root@localhost ~]# docker start b0
b0

image-20240525201501818

这里容器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

image-20240525211305405

4.3、示例:后台启动个nginx容器,保持标准输入打开并分配一个终端(-itd)

docker run -itd nginx

image-20240525225636390

4.4、示例:后台启动个redis:5.0.14容器,保持标准输入打开,分配一个终端并取别名为redis-v1(-itd --name)

docker run -itd --name redis-v1 redis:5.0.14

image-20240526083035069

4.5、示例:后台启动个centos容器,保持标准输入打开,分配一个终端并取别名为centos-v2,并设置随docker服务启动而启动(-itd --name --restart=always)

docker run -itd --name centos-v2 --restart=always centos

image-20240526093643026

5、查看正在运行的容器

docker ps

image-20240525212526746

6、查看所以容器(包含运行和已停止的)

docker ps -a

image-20240525212700134

7、挂起容器

docker pause CONTAINER ID/CONTAINER NAMES

7.1、示例:挂起nginx容器

docker ps
docker pause angry_proskuriakova

image-20240525221438189

8、取消挂起容器

docker pause CONTAINER ID/CONTAINER NAMES

8.1、示例:取消挂起的nginx容器

docker unpause angry_proskuriakova

image-20240525221820954

9、终止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

9.1、示例:终止nginx容器

docker stop b0

image-20240525222423111

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

image-20240525223250093

10.3、示例:批量删除已停止运行的容器

docker rm -f `docker ps -qa`

image-20240525224508849

11、attach进入容器

使用此方式进入容器的操作都是同步显示的且exit容器将被关闭

docker attach [OPTIONS] CONTAINER

11.1、示例:使用attach进入centos容器

docker attach 461

image-20240525230500711

11.1、示例:优雅的退出容器(退出时容器保持运行)

ctrl + p + q

image-20240525230917831

12、exec进入容器(推荐使用)

执行单次命令后进入容器,退出容器后容器还在运行

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

12.1、示例:使用exec进入centos容器

docker exec -it 461 /bin/bash

image-20240525231135114

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命名空间

image-20240525232300340

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

image-20240525233244497

14、端口映射

Docker容器的端口映射是一种让宿主机(运行Docker的机器)与Docker容器之间的网络通信成为可能的技术。

它允许外部系统通过宿主机的IP地址和端口访问到容器内部的服务。

-p 宿主机端口:容器端口

14.1、示例:前台启动nginx,随机端口映射(-P)

docker run -P nginx

ss -tunlp
#可以看到,随机的端口映射其实是从32768开始映射
前台启动随机端口映射
image-20240526081451164
ss -tunlp进行端口验证
image-20240526081433993
浏览器输入ip+端口号访问
image-20240526081538092

14.2、本地端口80映射到容器80端口

docker run -itd -p 8080:80 --name nginx-v1 nginx:latest
后台启动,保持标准输入并分配一个伪TTY终端,取别名为nginx-v1
image-20240526083451091
浏览器输入ip+端口号访问
image-20240526083525977

14.3、本地ip:本地端口:容器端口

docker run -itd -p 192.168.112.60:8081:80 --name nginx-v2 nginx:latest
使用本地ip:本地端口:容器端口进行端口映射
image-20240526084339929
浏览器输入ip+端口号访问
image-20240526084409986

14.4、本地ip:本地随机端口:容器端口

docker run -itd -p 192.168.112.60::80 --name nginx-v3 nginx:latest
使用本地ip:本地随机端口:容器端口进行端口映射
image-20240526085000348
浏览器输入ip+端口号访问
image-20240526085033483

14.5、本地ip:本地端口:容器端口/协议默认为tcp协议

docker run -itd -p 192.168.112.60:8082:80/tcp --name nginx-v4 nginx:latest
使用本地ip:本地端口:容器端口/协议默认为tcp协议进行端口映射
image-20240526085502426
浏览器输入ip+端口号访问
image-20240526085534047

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

image-20240526085821604

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/下

image-20240526091206094

16.2、示例:从centos容器拷贝文件到宿主机上

docker cp centos-v1:/tmp/hello.txt /tmp/
#将centos-v1容器内/tmp/hello.txt文件拷贝到宿主机的/tmp/下

image-20240526091601417

17、查看容器的日志信息

docker logs [OPTIONS] CONTAINER

17.1、示例:查看nginx-v4容器日志

docker logs nginx-v4

image-20240526092540560

18、更换容器名

docker rename 容器ID/容器名 新容器名

18.1、将容器centos-v2更换名字为mycentos-v2

docker rename centos-v2 mycentos-v2

image-20240526094419160

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

image-20240526103732267

21、导出容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,导出一个容器快照

docker export /指定路径/自定义名.tar 容器名/ID

21.1、示例:将mycentos-v2容器导出到/opt/目录下的mycentos-v2压缩包

docker export -o /opt/mycentos-v2.tar mycentos-v2

image-20240526104811107

22、导入容器

导入一个容器快照到本地镜像库

docker import /指定路径/tar压缩文件 镜像名:标签

22.1、示例:将/opt/目录下的mycentos-v2.tar导入到本地镜像库

docker import /opt/mycentos-v2.tar mycentos:v2

image-20240526105457897

posted @ 2024-05-26 11:05  misakivv  阅读(25)  评论(0编辑  收藏  举报