Docker 从入门到实战系列(二):镜像与容器核心操作命令

在上一篇文章中,我们完成了 Docker 的核心概念认知和 CentOS 7 下的环境搭建,而 Docker 的日常使用,核心围绕镜像容器展开:镜像是应用的 “模板”,容器是镜像的 “运行实例”,掌握二者的操作命令,是使用 Docker 的基础。本文作为系列第二篇,将详细讲解 Docker 镜像和容器的所有常用命令,包括基础操作、进阶使用,同时讲解网络映射、数据卷挂载等核心功能,让你轻松上手 Docker 的日常操作。

一、Docker 基础通用命令

在学习镜像和容器命令前,先掌握几个 Docker 的通用命令,用于查看信息、获取帮助,这是日常排错和学习的基础:

# 查看Docker版本信息(客户端+服务端) docker version # 查看Docker系统信息,包括镜像、容器数量,内核版本等 docker info # 查看Docker命令的帮助文档,可接具体命令(如docker images --help) docker 命令 --help 

Docker 的官方帮助文档非常详细,地址:https://docs.docker.com/engine/reference/commandline/docker/,遇到不懂的命令可随时查阅。

二、Docker 镜像核心操作命令

镜像是 Docker 的基础,所有容器都基于镜像创建,镜像的操作主要包括查看、搜索、拉取、删除四大核心,以下为详细命令及使用示例。

1. 查看本地镜像:docker images

# 基础命令:查看本地所有已下载的镜像 docker images # 可选参数 -a # 列出所有镜像(包括中间层镜像,一般无需使用) -q # 只显示镜像的ID,常用于批量删除镜像 

执行docker images后,终端会显示 5 列信息:

  • REPOSITORY:镜像的仓库源(如 hello-world、mysql、tomcat);
  • TAG:镜像的标签(用于区分版本,如 latest、5.7、8.5,latest 表示最新版);
  • IMAGE ID:镜像的唯一 ID(唯一标识一个镜像,可通过 ID 操作镜像);
  • CREATED:镜像的创建时间;
  • SIZE:镜像的大小。

用于在 Docker Hub(或配置的国内仓库)中搜索指定名称的镜像,语法:docker search 镜像名

# 示例:搜索mysql镜像 docker search mysql 

执行后会显示镜像的名称、描述、星级(STARS)、是否官方(OFFICIAL)、是否自动构建(AUTOMATED),优先选择官方(OFFICIAL) 镜像,安全性和稳定性更高。

3. 拉取(下载)镜像:docker pull

从配置的镜像仓库中下载指定镜像到本地,语法:docker pull 镜像名:标签标签不写默认拉取 latest(最新版)

# 示例1:拉取mysql最新版镜像(默认tag=latest) docker pull mysql # 示例2:拉取mysql5.7版本镜像(指定标签,推荐生产环境使用) docker pull mysql:5.7 # 示例3:拉取tomcat8.5版本镜像 docker pull tomcat:8.5 

Docker 的镜像采用分层下载(联合文件系统),下载新版本时,只会下载与老版本不同的层,节省磁盘空间和下载时间。

4. 删除本地镜像:docker rmi

删除本地指定的镜像,语法:docker rmi -f 镜像名/镜像ID-f表示强制删除(若镜像有运行的容器,需先停止容器再删除)。

# 示例1:通过镜像ID删除单个镜像 docker rmi -f 1b6b1fe7261e # 示例2:通过镜像名:标签删除单个镜像 docker rmi -f mysql:5.7 # 示例3:删除多个镜像,用空格分隔ID/名称 docker rmi -f 镜像ID1 镜像ID2 镜像名3:标签 # 示例4:删除本地所有镜像(慎用!) docker rmi -f $(docker images -aq) 

$(docker images -aq)表示获取本地所有镜像的 ID,结合docker rmi -f实现批量删除。

三、Docker 容器核心操作命令

容器是镜像的运行实例,应用的实际运行在容器中完成,容器的操作比镜像更丰富,核心包括查看、创建、启动、停止、进入、退出、删除,同时还有日志查看、进程查看等进阶操作,以下为详细命令及使用示例。

前置说明:容器的两种运行状态

Docker 容器有两种核心运行状态,对应不同的创建命令,日常使用中需根据需求选择:

  1. 前台交互式运行:容器启动后,进入容器的交互终端,关闭终端则容器停止,适用于调试容器;
  2. 后台守护式运行:容器启动后,在后台运行,不占用终端,适用于生产环境运行应用。

1. 查看容器:docker ps

# 基础命令:查看当前正在运行的容器 docker ps # 可选参数 -a # 查看所有容器(包括运行中、已停止的) -q # 只显示容器的ID,常用于批量删除容器 -l # 查看最近创建的一个容器 

执行docker ps后,终端会显示 7 列信息:

  • CONTAINER ID:容器的唯一 ID;
  • IMAGE:容器基于的镜像名;
  • COMMAND:容器启动时执行的命令;
  • CREATED:容器的创建时间;
  • STATUS:容器的状态(Up:运行中,Exited:已停止);
  • PORTS:容器的端口映射关系;
  • NAMES:容器的名称(创建时可指定,未指定则 Docker 自动生成)。

2. 创建并启动容器:docker run

这是最核心的容器命令,语法:docker run [可选参数] 镜像名 [容器内执行的命令],核心可选参数是重点,需熟练掌握。

核心可选参数(必记)

--name="容器名" # 为容器指定一个自定义名称,避免Docker自动生成,便于识别 -d # 后台守护式运行容器(生产环境首选) -it # 前台交互式运行,进入容器的交互终端(/bin/bash) -p # 指定端口映射,格式:宿主机端口:容器端口(核心,实现外网访问容器) -P # 随机端口映射,Docker随机分配一个宿主机端口映射到容器的暴露端口 -v # 数据卷挂载,格式:宿主机目录:容器目录(核心,实现宿主机与容器文件共享) -e # 设置容器的环境变量(如设置mysql的root密码:-e MYSQL_ROOT_PASSWORD=123456) 

常用创建示例

# 示例1:前台交互式创建tomcat容器,指定名称tomcat01,进入/bin/bash终端 docker run -it --name tomcat01 tomcat /bin/bash # 示例2:后台守护式创建tomcat容器,指定名称tomcat02,端口映射8080:8080 docker run -itd --name tomcat02 -p 8080:8080 tomcat # 示例3:创建mysql5.7容器,后台运行,端口3306:3306,设置root密码,数据卷挂载 docker run -itd --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql mysql:5.7 

3. 停止容器:docker stop

停止正在运行的容器,语法:docker stop 容器ID/容器名

# 示例:停止容器tomcat02 docker stop tomcat02 # 强制停止容器(适用于容器无响应时,慎用) docker kill 容器ID/容器名 

4. 启动已停止的容器:docker start

启动之前创建并停止的容器,语法:docker start 容器ID/容器名

# 示例:启动已停止的tomcat02 docker start tomcat02 

5. 重启容器:docker restart

重启运行中或已停止的容器,语法:docker restart 容器ID/容器名

# 示例:重启tomcat02 docker restart tomcat02 

6. 进入运行中的容器:docker exec /docker attach

当容器以-d(后台)方式运行时,需要进入容器内部进行操作,有两种命令,推荐使用 docker exec,二者的核心区别:

  • docker exec:在容器中开启一个新的终端,执行命令,退出终端不影响容器运行;
  • docker attach:进入容器的原有终端,退出终端则容器停止(适用于调试)。
# 推荐:进入后台运行的容器,开启新终端(/bin/bash) docker exec -it 容器ID/容器名 /bin/bash # 示例:进入tomcat02容器 docker exec -it tomcat02 /bin/bash 

进入容器后,终端提示符会变为root@容器ID:/#,此时可执行 Linux 命令(如 ls、cd、mkdir),容器的底层是精简版的 Linux 系统。

7. 退出容器

在容器的交互终端中,有两种退出方式,对应不同的容器状态:

# 方式1:停止容器并退出(前台运行的容器适用) exit # 方式2:不停止容器,仅退出终端(后台运行的容器适用,必记) Ctrl + P + Q 

8. 删除容器:docker rm

删除已停止的容器,语法:docker rm -f 容器ID/容器名-f表示强制删除(可删除运行中的容器)。

# 示例1:删除单个已停止的容器 docker rm tomcat01 # 示例2:强制删除单个运行中的容器 docker rm -f tomcat02 # 示例3:删除多个容器,用空格分隔ID/名称 docker rm -f 容器ID1 容器名2 # 示例4:删除所有容器(慎用!) docker rm -f $(docker ps -aq) 

9. 容器进阶操作命令

(1)查看容器日志:docker logs

查看容器的运行日志,用于排错,语法:docker logs [可选参数] 容器ID/容器名

# 核心可选参数 -t # 显示日志的时间戳 -f # 实时跟踪日志输出(类似tail -f) --tail 数字 # 只显示最后N行日志 # 示例:查看mysql01容器的最后10行日志,带时间戳 docker logs -tf --tail 10 mysql01 # 退出日志跟踪:Ctrl + C 

(2)查看容器内的进程:docker top

查看容器中正在运行的进程,类似 Linux 的top命令,语法:docker top 容器ID/容器名

# 示例:查看tomcat02容器的进程 docker top tomcat02 

(3)查看容器的元数据:docker inspect

查看容器的详细信息(元数据),包括容器的 IP、端口映射、数据卷挂载、环境变量等,语法:docker inspect 容器ID/容器名

# 示例:查看mysql01容器的详细信息 docker inspect mysql01 

(4)宿主机与容器之间的文件拷贝:docker cp

实现宿主机和容器之间的文件互传,语法:

# 宿主机 → 容器:docker cp 宿主机路径 容器ID/容器名:容器内路径 docker cp /home/test.txt tomcat02:/usr/local/tomcat/webapps # 容器 → 宿主机:docker cp 容器ID/容器名:容器内路径 宿主机路径 docker cp tomcat02:/usr/local/tomcat/webapps/index.html /home 

四、Docker 核心功能:网络映射与数据卷挂载

单纯的创建容器无法满足实际应用需求,因为容器和宿主机默认网络不通、文件不共享,而网络映射(-p)数据卷挂载(-v) 是解决这两个问题的核心功能,也是 Docker 实战中必须掌握的。

1. 网络映射(-p):实现外网访问容器

Docker 容器默认拥有独立的网络空间,与宿主机、外网不通,通过-p参数将宿主机的端口映射到容器的暴露端口,外网访问宿主机的端口时,请求会被转发到容器内部,实现外网访问容器中的应用。

端口映射的三种格式

-p 宿主机IP:宿主机端口:容器端口 # 指定宿主机IP和端口(适用于多网卡服务器) -p 宿主机端口:容器端口 # 不指定IP,绑定宿主机所有网卡(最常用) -p 容器端口 # 随机分配宿主机端口映射到容器端口 

实战示例:外网访问 Tomcat 容器

Tomcat 的默认暴露端口是 8080,将宿主机的 3344 端口映射到容器的 8080 端口:

# 创建tomcat容器,后台运行,端口映射3344:8080 docker run -itd --name tomcat03 -p 3344:8080 tomcat 

此时,在外网通过http://宿主机IP:3344即可访问容器中的 Tomcat 服务(需开放服务器安全组的 3344 端口)。

2. 数据卷挂载(-v):实现宿主机与容器文件共享

数据卷(Volume)是 Docker 的持久化存储方案,通过-v参数将宿主机的目录容器的目录建立映射,二者的文件实时同步、相互共享,核心价值:

  1. 数据持久化:容器被删除后,数据仍保存在宿主机的目录中,不会丢失;
  2. 方便修改配置:直接在宿主机修改文件,无需进入容器,同步到容器中;
  3. 实现容器间数据共享:多个容器挂载同一个宿主机目录,实现数据互通。

数据卷挂载的语法

-v 宿主机绝对路径目录:容器内目录 # 最常用,指定宿主机目录映射 -v 容器内目录 # 匿名挂载,Docker自动创建宿主机目录(/var/lib/docker/volumes/) -v 卷名:容器内目录 # 具名挂载,指定卷名,Docker管理宿主机目录 

注意:宿主机目录必须是绝对路径,若目录不存在,Docker 会自动创建。

实战示例 1:Tomcat 容器配置与项目挂载

Tomcat 官方镜像的webapps目录默认无文件,将宿主机的/tmp/webapps目录挂载到容器的/usr/local/tomcat/webapps目录,直接在宿主机上传项目,容器即可识别:

# 创建tomcat容器,端口映射8080:8080,数据卷挂载webapps目录 docker run -itd --name tomcat04 -p 8080:8080 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat 

将 Tomcat 项目包上传到宿主机的/tmp/webapps目录,容器会自动同步,外网通过http://宿主机IP:8080/项目名即可访问。

实战示例 2:MySQL 容器数据持久化

MySQL 的核心数据存储在容器的/var/lib/mysql目录,将宿主机的/home/mysql/data目录挂载到该目录,即使容器被删除,MySQL 的数据仍保存在宿主机中:

# 创建mysql5.7容器,端口映射3306:3306,设置root密码,数据卷挂载数据目录 docker run -itd --name mysql02 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql mysql:5.7 

五、常用镜像的快速部署实战

掌握了镜像、容器命令和核心功能后,我们来实战部署几个最常用的镜像(JDK、Tomcat、MySQL、Nginx),覆盖日常开发的绝大多数场景,直接复制命令即可使用。

1. 部署 JDK8 容器

# 拉取JDK8镜像 docker pull kdvolder/jdk8 # 创建并启动JDK8容器,前台交互式运行 docker run -it --name jdk8 kdvolder/jdk8 /bin/bash # 进入容器后,验证JDK版本 java -version 

2. 部署 Tomcat 容器(带项目挂载)

# 拉取Tomcat8.5镜像 docker pull tomcat:8.5 # 创建宿主机项目目录 mkdir -p /tmp/tomcat-webapps # 创建并启动Tomcat容器,端口8080:8080,挂载项目目录 docker run -itd --name tomcat85 -p 8080:8080 -v /tmp/tomcat-webapps:/usr/local/tomcat/webapps tomcat:8.5 

3. 部署 MySQL5.7 容器(数据持久化 + 外网访问)

# 拉取MySQL5.7镜像 docker pull mysql:5.7 # 创建宿主机MySQL数据目录 mkdir -p /home/mysql57/data # 创建并启动MySQL5.7容器,端口3306:3306,设置root密码,挂载数据目录 docker run -itd --name mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql57/data:/var/lib/mysql mysql:5.7 # 进入容器,修改MySQL权限(允许外网访问root) docker exec -it mysql57 /bin/bash mysql -uroot -p123456 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; exit 

修改完成后,可通过 Navicat、DBeaver 等工具,用宿主机IP:3306、用户名 root、密码 123456 连接 MySQL。

4. 部署 Nginx 容器(配置 + 页面挂载)

# 拉取Nginx最新版镜像 docker pull nginx # 创建宿主机Nginx配置和页面目录 mkdir -p /home/nginx/conf /home/nginx/html # 先创建临时Nginx容器,拷贝默认配置文件到宿主机 docker run -itd --name tmp-nginx nginx docker cp tmp-nginx:/etc/nginx/nginx.conf /home/nginx/conf/ docker cp tmp-nginx:/usr/share/nginx/html/index.html /home/nginx/html/ # 删除临时容器 docker rm -f tmp-nginx # 创建并启动Nginx容器,端口80:80,挂载配置和页面目录 docker run -itd --name nginx01 -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/usr/share/nginx/html nginx 

直接在宿主机的/home/nginx/html目录修改 index.html,或上传静态项目,外网通过http://宿主机IP即可访问;修改/home/nginx/conf/nginx.conf可配置 Nginx 反向代理、跨域等功能。

Read more

OpenClaw 系统架构深度解析

文章目录 * OpenClaw 系统架构深度解析 * 🏗️ 一、架构概览与设计哲学 * 1.1 核心设计原则 * 1.2 整体架构图 * 🔧 二、核心层深度剖析 * 2.1 感知引擎架构 * 2.2 规划引擎架构 * 2.3 执行引擎架构 * 2.4 记忆引擎架构 * 🌐 三、编排层架构 * 3.1 工作流引擎 * 3.2 服务网格与通信 * 📊 四、数据流与状态管理 * 4.1 数据流架构 * 4.2 状态管理架构 * 🔐 五、安全架构 * 5.1 安全架构设计 * 📈 六、可观测性架构 * 6.1

By Ne0inhk
学术翻译神器:Docker+cpolar构建你的跨语言数学文档翻译中枢

学术翻译神器:Docker+cpolar构建你的跨语言数学文档翻译中枢

文章目录 * 前言 * 1. Docker部署 * 2. 简单使用演示 * 3. 安装cpolar内网穿透 * 4. 配置公网地址 * 5. 配置固定公网地址 前言 科研论文中的复杂公式翻译总是格式错乱?英文文献阅读效率低下?传统翻译工具要么无法识别数学符号,要么收费高昂(如DeepL专业版每月40美元)。PDFMathTranslate的出现填补了这一空白——这款开源工具基于LaTeX解析引擎,能精准识别公式、表格等结构化内容,保持翻译后格式零失真。特别适合理工科研究者,其Docker一键部署特性,让非技术用户也能5分钟搭建专属翻译服务。配合cpolar内网穿透,现在手机也能远程提交翻译任务,让学术阅读不再受语言和设备限制。 PDFMathTranslate的核心优势在于数学符号识别与格式保持。它采用多模态解析技术,区分文本与公式区域:文本部分调用AI翻译(支持GPT/LLaMA等模型),公式部分保留LaTeX源码,确保专业术语(如“拓扑空间”“偏微分方程”)翻译准确率达98%,公式格式正确率100%。对比商业工具,其优势在于:1)支持本地部署,数据隐私可控

By Ne0inhk
从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析

从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. Shell核心工作流程 * 二. 完整实现源代码 * 2.1 Makefile文件 * 2.2 头文件(myshell.h)和 主函数(main.c) * 2.3 核心实现(myshell.c 优化版) * 三. 核心功能解析 * 3.1 环境变量管理(补充重点) * 3.2 内建命令实现 * 3.3 外部命令执行 * 3.4 关键技术点总结

By Ne0inhk
Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践

Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践

在上一篇文章中,我们通过本地安装的方式快速跑通了 Ollama,还成功将 DeepSeek 模型运行起来,体验到了大模型本地部署的便捷性。但当你真正把 Ollama 放到团队协作环境、服务器长期运行场景,或是纳入正式项目开发流程时,会立刻发现一个核心问题:本机安装虽简单,却缺乏工程化属性。 本地安装的典型痛点集中在这几点: * 环境易污染,容易出现 CUDA 版本、依赖包的冲突问题 * 机器迁移成本高,换服务器需要重新配置全套环境 * 服务状态不可控,缺乏标准化的启停、监控方式 * 无法无缝接入企业现有运维体系,与容器化、自动化部署流程脱节 也正因如此,在真实的项目落地场景中,Docker 方式部署 Ollama 才是更合理、更可持续的选择。 本文不只是教你把 Docker 版 Ollama “跑起来”,更核心的是带你理解:如何用 Docker 部署 Ollama,让它真正具备工程可用性,适配团队协作与生产级的使用需求。 📌 系列文章 👉 大模型本地部署实践(

By Ne0inhk