Docker镜像与容器常用操作全解析
Docker作为当下最流行的容器化技术,其核心在于“镜像”与“容器”的灵活运用。镜像作为容器的模板,是只读的基础环境;容器则是镜像的运行实例,可读写、可操作,二者协同构成了Docker部署的核心流程。本文将从镜像基础操作、容器核心命令、网络映射到项目部署,全方位拆解常用操作,附详细命令解释、实操案例及避坑要点,新手也能轻松上手,吃透Docker基础用法。
温馨提示:Docker官方命令帮助文档可参考:https://docs.docker.com/engine/reference/commandline/docker/
一、Docker镜像常用操作(基础必掌握)
镜像相当于Docker的“安装包”,包含了运行应用所需的所有环境(系统、依赖、程序等),且镜像具有只读特性,无法直接修改,所有修改都会作用于容器。以下是镜像最常用的核心操作,覆盖查看、查找、拉取、删除全流程。
1.1 查看已有镜像
核心命令:docker images,用于查看本地已下载的所有镜像,搭配可选参数可实现更精准的查询。
辅助命令(补充必备):
-
docker version:查看Docker的版本信息(确认Docker是否正常运行); -
docker info:查看Docker的系统信息,包括本地镜像数量、容器数量、存储驱动等核心配置; -
docker 命令 --help:万能帮助命令,任何Docker命令后加上该参数,可查看该命令的所有可选参数及用法(新手必备)。
【命令输出解释】执行docker images后,会显示5列关键信息,含义如下:
-
REPOSITORY:镜像的仓库源(即镜像来自哪个仓库,如Docker官方仓库library);
-
TAG:镜像的标签(用于区分同一仓库的不同版本,默认是latest,代表最新版本);
-
IMAGE ID:镜像的唯一标识(删除、操作镜像时可通过ID精准定位);
-
CREATED:镜像的创建时间;
-
SIZE:镜像的大小(镜像越小,下载和运行速度越快)。
【可选参数】:
-
-a/--all:列出本地所有镜像(包括未启动的镜像); -
-q/--quiet:只显示镜像的唯一ID(批量操作镜像时非常实用)。
1.2 查找中央仓库的镜像
核心命令:docker search 镜像名,用于从Docker官方中央仓库(Docker Hub)查找所需镜像,例如查找MySQL镜像:docker search mysql。
【注意】:搜索结果中会显示镜像的星级(Stars)、描述(Description)、是否官方(OFFICIAL)等信息,优先选择官方镜像(标注OFFICIAL),稳定性和安全性更有保障。
1.3 拉取镜像(下载镜像)
核心命令(完整语法):docker pull 镜像名:版本,用于将中央仓库的镜像下载到本地。
【关键要点】:
-
如果不指定版本(即不写
:版本),默认拉取最新版本(TAG为latest); -
Docker下载镜像采用“分片下载”(分层下载),核心是联合文件系统,下载新版本时,仅下载与老版本不同的部分,节省带宽和存储空间;
-
拉取过程中会显示每一层的下载进度,下载完成后会显示镜像的签名(Digest)和真实下载地址。
【实操案例】:
# 拉取MySQL最新版本(默认latest)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest # 未指定版本,默认拉取latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete # 分层下载,每一行代表一个分层
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 # 镜像签名(用于验证镜像完整性)
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实下载地址,docker pull mysql 等价于该命令
# 拉取MySQL 5.7版本(指定具体版本)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists # 该分层与本地已有的镜像分层一致,无需重复下载
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
1.4 删除本地镜像
核心命令(完整语法):docker rmi -f 镜像名/镜像ID,其中-f参数表示强制删除(即使镜像正在被容器使用,也能强制删除,谨慎使用)。
【三种常用删除场景】:
# 1. 删除指定的镜像(通过镜像ID,精准删除)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
# 2. 删除多个镜像(多个镜像ID之间用空格分隔)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
# 3. 删除本地所有镜像(批量删除,谨慎使用!)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
# 说明:$(docker images -aq) 会获取所有镜像的ID,搭配docker rmi -f 实现批量删除
【避坑提醒】:如果删除镜像时提示“镜像被容器引用”,可先删除引用该镜像的容器,再删除镜像;或直接使用-f强制删除,但会导致依赖该镜像的容器无法正常运行。
二、Docker容器常用操作(核心实操)
容器是镜像的运行实例,是可读写的“沙箱环境”,我们部署的应用最终会运行在容器中。容器与镜像的核心区别:镜像是只读的,不可修改;容器是可读可写的,可对其进行操作和配置。以下是容器从创建到删除的全流程常用命令,附实操细节。
2.1 查看容器
核心命令:docker ps,用于查看容器的运行状态,搭配-a参数可查看所有容器(包括已停止的)。
-
不带
-a:仅显示正在运行的容器; -
带
-a:显示所有容器(正在运行、已停止、已退出的),可查看容器的完整信息。
2.2 创建并运行容器
核心命令(完整语法):docker run -itd --name 容器名称 镜像名 /bin/bash
【参数详解】(新手必记,重点!):
-
--name 容器名称:指定容器的名称(自定义,如mysql-container),用于区分不同容器,避免容器名称重复; -
-d:后台方式运行容器(守护进程模式),执行命令后容器会在后台运行,不会占用当前终端; -
-it:使用交互方式运行容器,进入容器内部查看内容、执行命令(沙箱环境),其中-i表示保持标准输入打开,-t表示分配伪终端; -
/bin/bash:进入容器后执行的命令,即启动容器的bash终端,方便后续操作。
【补充参数】(部署项目常用):
docker run [可选参数] image,除上述参数外,常用可选参数如下:
-
-p:指定容器的端口映射(关键!用于宿主机与容器的网络联通),有三种写法:-
-p ip:主机端口:容器端口:配置指定宿主机IP、宿主机端口映射到容器端口(最精准); -
-p 主机端口:容器端口:默认使用宿主机所有IP,将宿主机端口映射到容器端口(最常用); -
-p 容器端口:随机分配宿主机端口映射到容器端口(不推荐,端口不固定,不便访问)。
-
-
-P(大写P):随机指定宿主机端口与容器端口映射(无需手动指定,适合临时测试)。
2.3 容器的启动、停止、重启
容器创建后,可根据需求启动、停止、重启,命令简洁易懂,直接通过容器ID或容器名称操作即可:
-
关闭容器(停止运行):
docker stop 容器id/容器名称; -
启动容器(已停止的容器重新运行):
docker start 容器id/容器名称; -
重启容器(无论容器是否运行,都会重新启动):
docker restart 容器id/容器名称。
2.4 进入容器
核心命令:docker exec -it 容器名称/容器id /bin/bash
【说明】:该命令用于进入正在运行的容器内部,进入后可执行各种Linux命令(如创建文件、安装依赖等),相当于进入了一个独立的Linux服务器(Docker本质就是封装了特定服务的Linux服务器)。
【实操案例】:
# 进入ID为c703b5b1911f的容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
# 进入后,终端提示符会变为容器ID前缀,表明已进入容器内部
[root@c703b5b1911f /]# cd home # 进入容器的home目录
[root@c703b5b1911f home]# ls # 查看目录内容
[root@c703b5b1911f home]# touch test.java # 创建文件
[root@c703b5b1911f home]# ls
test.java
2.5 退出容器
进入容器后,有两种退出方式,区别在于是否停止容器:
-
exit:停止容器并退出(如果容器是后台方式运行,仅退出终端,容器仍会继续运行); -
Ctrl+P+Q:不停止容器,仅退出终端(推荐!容器继续在后台运行,后续可重新进入)。
2.6 删除容器
核心命令:docker rm -f 容器名/容器id,其中-f参数表示强制删除(即使容器正在运行,也能强制删除)。
【注意】:删除容器不会影响镜像,删除后可通过镜像重新创建容器;如果容器正在运行,不使用-f参数会提示无法删除,需先停止容器再删除。
三、Docker其他常用操作(实操必备)
除了镜像和容器的基础操作,以下命令在日常实操中使用频率极高,主要用于查看容器状态、日志、文件拷贝等,是部署和调试项目的关键。
3.1 查看容器日志
核心命令:docker logs [OPTIONS] 容器id/容器名称,用于查看容器的运行日志,排查容器启动失败、应用运行异常等问题。
【常用参数】:
-
-f, --follow:实时跟踪日志输出(类似tail -f命令); -
-t, --timestamps:显示日志的时间戳(方便定位问题发生时间); -
--tail string:显示日志的最后N行(默认显示所有日志),例如--tail 10表示显示最后10行日志; -
--since string:显示指定时间之后的日志(如--since 2024-01-01T10:00:00Z); -
--until string:显示指定时间之前的日志。
【实操案例】:
# 查看容器c703b5b1911f的实时日志,带时间戳,显示最后10行
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi
# 退出日志跟踪:按 Ctrl + C 即可退出
3.2 查看容器中进程信息
核心命令:docker top 容器id/容器名称,用于查看容器内部运行的进程,类似Linux的top命令。
【实操案例】:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f
UID PID PPID C STIME TTY TIME CMD
root 11156 11135 0 11:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root 11886 11156 0 11:43 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
【输出解释】:可查看进程的UID、PID、PPID、启动时间、运行命令等信息,用于判断容器内部应用是否正常运行。
3.3 查看容器的元数据
核心命令:docker inspect 容器id/容器名称,用于查看容器的详细元数据,包括容器的IP地址、端口映射、挂载目录、环境变量等所有配置信息,排查网络、挂载等问题时非常实用。
3.4 文件拷贝操作(宿主机与容器互传)
容器与宿主机之间的文件拷贝,是部署项目时的常用操作,核心命令为docker cp,分两种场景:
-
场景1:拷贝容器内的文件到宿主机
-
场景2:拷贝宿主机的文件到容器内
【实操案例】:将容器内的test.java文件拷贝到宿主机的/home目录
# 1. 先退出容器(确保容器在运行)
[root@c703b5b1911f home]# exit
exit
# 2. 查看容器状态(确认容器正在运行)
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c703b5b1911f centos "/bin/sh -c 'while t…" 35 minutes ago Up 35 minutes pedantic_banach
# 3. 拷贝容器内的文件到宿主机
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home
# 4. 查看宿主机/home目录,确认文件拷贝成功
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai pan test.java
【避坑提醒】:拷贝时需确保容器正在运行,否则可能拷贝失败;路径需写绝对路径(如容器内路径/home/test.java,宿主机路径/home),避免相对路径导致的错误。
【补充技巧】:默认情况下,Tomcat容器的webapps目录中没有欢迎页面,可将容器内webapps.dist目录下的所有内容拷贝到webapps目录中,即可显示Tomcat默认欢迎页面,命令如下:docker cp 容器id:/usr/local/tomcat/webapps.dist/* 容器id:/usr/local/tomcat/webapps/
四、Docker网络映射(宿主机与容器联通)
默认情况下,宿主机和Docker容器的网络是相互隔离的,无法直接通过宿主机访问容器内的应用。要实现外网访问容器内的应用,必须通过“端口映射”将宿主机端口与容器端口联通,这是部署项目的关键步骤。
4.1 网络映射核心原理
通过-p或-P参数,将宿主机的某个端口映射到容器的应用端口(如Tomcat的8080端口),此时访问宿主机的该端口,就相当于访问容器内的应用端口,从而实现外网访问。
4.2 常用映射命令
创建容器时,直接指定端口映射:
# 完整命令:后台运行容器,映射宿主机IP、端口到容器端口,指定容器名称
docker run -itd -p 宿主机ip:宿主机端口:容器端口 --name 容器名 镜像名 /bin/bash
# 示例:将宿主机的3344端口映射到容器的8080端口(Tomcat默认端口)
docker run -itd -p 0.0.0.0:3344:8080 --name tomcat-container tomcat /bin/bash
【测试建议】:部署Tomcat时,可将宿主机的3344端口映射到容器的8080端口,此时通过“宿主机IP:3344”即可访问Tomcat欢迎页面,实现外网访问测试。
五、Docker部署项目(实战环节)
部署项目的核心是“数据卷Volume(目录映射)”,将宿主机的目录与容器的目录进行映射,实现宿主机与容器的存储空间共享,这样修改宿主机目录下的项目文件,容器内会同步更新,无需重新拷贝文件,大幅提升部署效率。
5.1 数据卷Volume核心作用
1. 实现宿主机与容器的目录共享,方便项目文件的修改和管理;
2. 容器删除后,宿主机目录下的项目文件不会丢失,实现数据持久化;
3. 避免频繁使用docker cp命令拷贝文件,提升部署效率。
5.2 目录映射操作命令
创建容器时,通过-v参数指定宿主机目录与容器目录的映射,完整命令:
docker run -itd -p 宿主机ip:宿主机端口:容器端口 -v 宿主机目录:容器目录 --name 容器名 镜像名 /bin/bash
【参数说明】:-v 宿主机目录:容器目录,冒号前是宿主机的目录(需提前创建),冒号后是容器的目录(容器内目录无需提前创建,会自动生成)。
5.3 项目部署四步走(以Tomcat部署Java项目为例)
-
第一步:将项目文件(如war包)传入宿主机对应的目录(提前创建,如
/home/tomcat/webapps); -
第二步:创建Tomcat容器,指定端口映射和目录映射(将宿主机的
/home/tomcat/webapps映射到容器的/usr/local/tomcat/webapps); -
第三步:启动容器的Tomcat服务(进入容器,执行
./usr/local/tomcat/bin/startup.sh); -
第四步:外网访问测试,通过“宿主机IP:映射端口”访问项目(如
http://192.168.1.100:3344/项目名)。
六、总结与避坑指南
本文涵盖了Docker镜像、容器的核心操作,以及网络映射、项目部署的完整流程,所有命令均经过实操验证,适合新手入门和日常实操参考。以下是新手常踩的坑,务必注意:
-
1. 拉取镜像时,不指定版本会默认拉取latest,建议根据项目需求指定具体版本(如mysql:5.7),避免版本兼容问题;
-
2. 删除镜像或容器时,谨慎使用
-f强制删除,避免误删正在运行的容器或核心镜像; -
3. 端口映射时,确保宿主机端口未被占用(可通过
netstat -tuln | grep 端口号查看),否则容器启动失败; -
4. 目录映射时,宿主机目录需提前创建,否则会导致映射失败;
-
5. 进入容器后,执行命令时注意路径,容器内的目录结构与宿主机可能不同(如Tomcat的安装路径)。
Docker的核心优势在于“轻量、可移植、可扩展”,掌握以上常用操作,就能应对大部分基础部署场景。后续可深入学习Docker Compose、Docker Swarm等进阶内容,实现多容器协同部署。如果实操中遇到问题,可参考Docker官方文档~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)