Docker基础篇03:Docker常用命令

发布于:2025-09-13 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、帮助启动类命令

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
docker 具体命令 --help

二、镜像命令

(一)docker images

列出本地主机上的镜像
在这里插入图片描述

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签版本号
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

知识拓展:

  • 镜像下载后存放在/var/lib/docker
  • Docker 相关的本地资源存放在/var/lib/docker/目录下,其中containers目录存放容器信息,image目录存放镜像信息,overlay2目录下存放具体的镜像底层文件。
  • 查看下载的镜像文件信息:cat /var/lib/docker/image/overlay2/repositories.json

OPTIONS说明:

  • a:列出本地所有的镜像(含历史映像层)
  • q:只显示镜像ID

(二)docker search 某个XXX镜像名字

1. 网站

https://hub.docker.com

2. 命令

docker search [OPTIONS] 镜像名字

结果解析
在这里插入图片描述

  • NAME:镜像名称
    • 镜像名称中的前缀(sameersbn/redisgrokzen/redis-cluster)类似于Java中的包名(Package),表示不同的作者或组织提交的
  • DESCRIPTION:镜像说明
  • STARS:点赞数量
    • 默认按照点赞数量倒序排列
  • OFFICIAL:是否是官方的。
    • 建议选择官方认证过的,最靠谱!最好用!
  • AUTOMATED:是否是自动构建的

OPTIONS说明:

  • -f:过滤
  • ‐‐limit:只列出N个镜像,默认25个

注意区分单-和双-!!!

3. 报错解析

报错信息:Error response from daemon: Get "https://index.docker.io/v1/search?q=hello-world&n=25": dial tcp 128.242.240.253:443: connect: connection refused
在这里插入图片描述
docker search 的工作机制:docker search 命令默认总是查询 Docker Hub (index.docker.io),它不会自动使用 daemon.json 中配置的镜像加速器。这是 Docker 的一个设计行为。

为什么 docker search 不遵循 mirror 配置?
这是 Docker 的已知行为设计:

  • registry-mirrors 只影响镜像的拉取(pull)和推送(push)
  • 搜索(search)操作总是直接访问 Docker Hub
  • 这是出于安全和一致性的考虑

目前博主没有找到处理这个问题的可行性方案,各位如果有好的方案欢迎留言交流,我会第一时间验证并更新文章,感谢大家!

(三)docker pull 某个XXX镜像名字

下载镜像

  • docker pull 镜像名字[:TAG]
    • 这里的TAG释义和docker images章节中的TAG一致
  • docker pull 镜像名字
    • 没有TAG就是最新版(即:TAG为latest)
    • 等价于docker pull 镜像名字:latest
    • docker pull ubuntu

在这里插入图片描述

(四)docker system df 查看镜像/容器/数据卷所占的空间

在这里插入图片描述

    • TYPE:类型
    • TOTAL:总数
    • ACTIVE:活动中的
    • SIZE:大小
    • RECLAIMABLE:可伸缩性
    • Images:镜像
    • Containers:容器
    • Local Volumes:本地卷
    • Build Cache:构建的缓存

(五)docker rmi 某个XXX镜像名字ID

删除镜像

# 删除单个
docker rmi -f 镜像ID

# 删除多个(使用空格分隔)
docker rmi -f 镜像名1:TAG 镜像名2:TAG

# 删除全部(命令嵌套,类似于sql中的子查询),生产环境中慎用!!!
docker rmi -f $(docker images -qa)

知识拓展:

  • rmi:remove images的简称
  • -f:forced的简称

(六)面试题:谈谈docker虚悬镜像是什么?

1. 是什么

仓库名、标签都是<none>的镜像,俗称虚悬镜像(dangling image)。

有时Docker在构建过程中会出现问题,就导致了虚悬镜像的产生,建议删除,没什么用

在这里插入图片描述

2. 后续Dockerfile章节再介绍

(七)思考

结合我们Git的学习心得,大家猜猜是否会有docker commit /docker push? ?

三、命令自动补全

docker支持命令自动补全功能,当输入镜像名前几位时,可以按tab键自动补全镜像名称、tag等。

# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub

如果按下tab时没有自动补全,可以按以下步骤操作:

  1. 检查是否安装了bash-completion(命令补全增强包)
    # 检查有 /usr/share/bash-completion/bash_completion 这个文件
    ls /usr/share/bash-completion/bash_completion
    
  2. 如果有/usr/share/bash-completion目录,但是没有/usr/share/bash-completion/bash_completion文件(centos6为/etc/bash_completion文件),则需要安装bash-completion
    yum -y install bash-completion
    
  3. 检查是否安装了docker的自动补全
    # 检查/usr/share/bash-completion/completions文件夹下是否有docker开头的自动补全
    # docker安装完后会在该文件夹下生成自动补全文件docker
    # 如果安装了docker-compose,则该文件夹下还会有 docker-compose文件
    ll /usr/share/bash-completion/completions/docker*
    
  4. 如果已经安装了docker自动补全,使用source命令使其生效
    source /usr/share/bash-completion/completions/docker
    
  5. 再次使用tab查看是否可以自动补全
    # 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
    docker run ub
    
  6. 如果有报错,且报错中提示_get_comp_words_by_ref: command not found。说明bash-completion的配置文件没有生效,需要source一下
    # 对于centos7,bash-completion安装的是2.x版本,配置文件为/usr/share/bash-completion/bash_completion
    source /usr/share/bash-completion/bash_completion
    
    # 如果是centos6,自动安装的bash-completion最新版为1.x版本,配置文件为/etc/bash_completion
    # bash /etc/bash_completion
    
  7. 再次使用tab查看是否可以自动补全
    # 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
    docker run ub
    

四、Docker后台启动一个纯Linux镜像

Docker启动镜像后,如果镜像中的程序不是一直运行的,那么在程序运行完成后容器就会自动退出。而单纯的Linux镜像中是没有一直运行的程序的,如果需要后台启动一个不停止的Linux镜像,可以手动指定一个不停止的程序,例如采用以下方式:

# 使用tail -f 不停的打印一个日志,例如打印日志黑洞/dev/null
docker run -d --name kylin hxsoong/kylin:v10-sp1  tail -f /dev/null

五、yum只下载依赖不进行安装

有些时候,内网需要安装某个RPM包,而内网服务器不连接互联网,无法直接下载缺失的依赖。可以在Docker中启动一个相同版本的Linux,然后下载相关依赖:

# yum只下载依赖不进行安装:(尝试安装aaaa.rpm,将需要的rpm依赖下载到aaaa_packages文件夹中)
yum install --downloadonly --downloaddir=aaaa_packages aaaa.rpm

六、容器命令

(一)有镜像才能创建容器, 这是根本前提(下载一个CentOS或者ubuntu镜像演示)

在这里插入图片描述

  • docker pull centos
  • docker pull ubuntu
  • 本次演示用ubuntu演示

(二)新建+启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

1. OPTIONS说明

OPTIONS说明(常用):有些是一个减号,有些是两个减号

--name="容器新名字":为容器指定一个名称,若不指定则使用系统随机分配的名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);

i 表示 interaction (交互)
t 表示 tyy(伪终端)

-P随机端口映射,大写P
-p指定端口映射,小写p,一般使用指定端口映射

  • -p指定端口映射的几种不同形式:
  • -p hostPort:containerPort:端口映射,例如-p 8080:80
  • -p ip:hostPort:containerPort:配置监听地址,例如-p 10.0.0.1:8080:80
  • -p ip::containerPort:随机分配端口,例如-p 10.0.0.1::80
  • -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306

在这里插入图片描述

2. 启动交互式容器(前台命令行)

在这里插入图片描述

上图中的root@d72e720a13d3,其中的d72e720a13d3表示这个新创建的容器实例ID

# 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash 

参数说明:

  • -i:交互式操作。
  • -t:终端。
  • centos:centos 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash(或者bash)。
  • 要退出终端,直接输入exit

(三)列出当前所有正在运行的容器

docker ps [OPTIONS]

OPTIONS说明(常用):

  • -a :列出当前所有正在运行的容器+历史上运行过
  • -l :显示最近创建的容器。
  • -n:显示最近n个创建的容器。
  • -q:静默模式,只显示容器编号。

在这里插入图片描述

silly_dewdney是系统为这个容器实例随机分配的名称,因为创建这个容器实例时并没有使用--name参数指定容器名称

在这里插入图片描述

myu1则是我们创建容器实例时使用--name参数指定的容器名称,两个容器实例都是使用ubuntu镜像创建的,所以IMAGE列是一样的,但却是两个不同的容器实例,所以容器IDCONTAINER ID列是两个不同的ID值

(四)退出容器

两种退出方式

1. exit

run进去容器,exit退出,容器停止

2. Ctrl + p + q

run进去容器,Ctrl + p + q退出,容器不停止

(五)启动已停止运行的容器

docker start 容器ID或者容器名

(六)重启容器

docker restart 容器ID或者容器名

(七)停止容器

docker stop 容器ID或者容器名

(八)强制停止容器

docker kill 容器ID或容器名

慎用!!!

(九)删除已停止的容器

# 删除单个容器实例
docker rm 容器ID

# 删除全部容器实例,生产环境慎用!!!
docker rm -f $(docker ps -a -q)
# 或
docker ps -a -q | xargs docker rm

一定要是已停止的容器才可以删除,如果非要删除正在运行的容器,则可以加一个强制删除的参数,命令为docker rm -f 容器ID,知道用法即可,一般不建议这样用!

(十)重要

1. 有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)

2. 启动守护式容器(后台服务器)

  • 在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式。

  • docker run -d 容器名

    养成好习惯,在使用run命令启动一个容器实例以后,接着使用docker ps命令查看一下容器实例是否启动成功,状态(STATUS)列一定要是Up

    # 使用镜像ubuntu:latest以后台模式启动一个容器
    docker run -d ubuntu
    

    问题:然后docker ps -a进行查看,会发现容器已经退出
    很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程。
    容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

    这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start。但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。
    所以,最佳的解决方案是将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。

  • redis 前后台启动演示case

    • 前台交互式启动:docker run -it redis:6.0.8
    • 后台守护式启动:docker run -d redis:6.0.8

    要区分好前台交互后台守护的区别,个人认为可以结合java -jar命令来辅助理解,因为启动jar包时也区分前台启动和后台启动。
    通过这里我们也可以加深对docker这种容器化技术的理解,以前我们在linux环境下安装redis时,需要做各种gcc配套、配置文件修改、还有make、make install等等。现在使用docker容器,直接一条run命令就可以实现 秒级 启动。

3. 查看容器日志

docker logs 容器ID

知识拓展:
现代化开发的主流趋势

  • 编码开发微服务
  • 上线部署容器化
  • 时时刻刻要监控

4. 查看容器内运行的进程

docker top 容器ID

5. 查看容器内部细节

docker inspect 容器ID
在这里插入图片描述

  • lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录
  • upperdir是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层
  • MergedDir是表现层,是容器的挂载点

6. 进入正在运行的容器并以命令行交互

  • docker exec -it 容器ID bashShell
    在这里插入图片描述
    在这里插入图片描述
  • 重新进入docker attach 容器ID
  • 案例演示:用 centos 或者 ubuntu 都可以
  • 上述两个区别
    • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。 在这里插入图片描述
    • exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。 在这里插入图片描述
  • 推荐 大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
  • 用之前的redis容器实例进入试试
    • docker exec -it 容器ID /bin/bash
    • docker exec -it 容器ID redis-cli
    • 一般用-d后台启动的程序,再用exec进入对应容器实例

如果有多个终端,都对同一个容器执行了docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。

7. 从容器内拷贝文件到主机上

  • 容器→主机
  • docker cp 容器ID:容器内路径 目的主机路径
    在这里插入图片描述

8. 导入和导出容器

  • export 导出容器的内容留作为一个tar归档文件[对应import命令]
  • import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
  • 案例
    • docker export 容器ID > 文件名.tar
      在这里插入图片描述
    • cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
      在这里插入图片描述

七、容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。

特性: 卷设计的目的就是数据的持久化,完全独立于容器的生存周期, 因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  • 数据卷可以在容器之间共享或重用数据
  • 卷中的更改可以直接实施生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

运行一个带有容器卷存储功能的容器实例:

docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名

可以使用docker inspect查看容器绑定的数据卷。

权限:

  • rw:读写
  • ro:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。

容器卷的继承:

# 启动一个容器
docker run -it --privileged=true -v /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash

# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

八、小总结

【所有命令示意图】
在这里插入图片描述

命令 英文描述 中文描述
attach Attach to a running container 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile 通过 Dockerfile 定制镜像
commit Create a new image from a container changes 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container’s filesystem 查看 docker 容器变化
events Get real time events from the server 从 docker 服务获取容器实时事件
exec Run a command in an existing container 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive 导出容器的内容流作为一个 tar 归档文件[对应 import]
history Show the history of an image 展示一个镜像形成历史
images List images 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information 显示系统相关信息
inspect Return low-level information on a container 查看容器详细信息
kill Kill a running container kill 指定 docker 容器
load Load an image from a tar archive 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server 从当前 Docker registry 退出
logs Fetch the logs of a container 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT 查看映射端口对应的容器内部源端口
pause Pause all processes within a container 暂停容器
ps List containers 列出容器列表
pull Pull an image or a repository from the docker registry server 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container 重启运行的容器
rm Remove one or more containers 移除一个或者多个容器
rmi Remove one or more images 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container 创建一个新的容器并运行一个命令
save Save an image to a tar archive 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub 在 docker hub 中搜索镜像
start Start a stopped containers 启动容器
stop Stop a running containers 停止容器
tag Tag an image into a repository 给源中镜像打标签
top Lookup the running processes of a container 查看容器中运行的进程信息
unpause Unpause a paused container 取消暂停容器
version Show the docker version information 查看 docker 版本号
wait Block until a container stops, then print its exit code 截取容器停止时的退出状态值

网站公告

今日签到

点亮在社区的每一天
去签到