上一章我们搞懂了容器是“镜像的运行实例”,这一章就来手把手教你容器的全套操作——从创建、启动到进入、停止,再到最后的删除,每个环节都搭配具体命令和场景示例。学会这些,你就能真正“掌控”容器,让它按你的需求运行~

一、容器查看:先搞清楚“当前有哪些容器” 🔍

在操作容器前,首先需要知道本地有哪些容器,以及它们的状态(运行中/已停止)。这就像打开任务管理器查看正在运行的程序一样。

核心命令:docker ps

  • 查看运行中的容器

    docker ps
    

    输出结果包含容器ID、镜像名称、启动命令、创建时间、状态、端口映射、容器名称等信息。

  • 查看所有容器(包括已停止的)
    加上-a参数(all的缩写):

    docker ps -a
    
  • 只看容器ID和名称(简洁模式)
    加上--format参数自定义输出:

    docker ps -a --format "ID: {{.ID}} | 名称: {{.Names}}"
    

二、容器创建与启动:从镜像“变出”一个运行的应用 🚀

创建并启动容器是最核心的操作,用docker run命令一键完成(如果本地没有指定镜像,会自动从仓库拉取)。

基础语法:

docker run [参数] 镜像名称:版本 [容器内执行的命令]

必学参数(高频使用):

参数作用示例
-d后台运行容器(不占用终端)docker run -d nginx
--name给容器起一个自定义名称(唯一)docker run --name my-nginx nginx
-p端口映射(主机端口:容器端口)docker run -p 8080:80 nginx
-it交互式运行(进入容器终端)docker run -it ubuntu /bin/bash
--rm容器停止后自动删除(适合临时测试)docker run --rm -p 8080:80 nginx

场景示例:

示例1:启动一个后台运行的Nginx容器,并映射端口
docker run -d -p 8080:80 --name my-nginx nginx
  • 效果:Nginx在后台运行,访问localhost:8080可看到Nginx默认页。
  • 检查:用docker ps可看到my-nginx状态为Up(运行中)。
示例2:启动一个Ubuntu容器,直接进入终端操作
docker run -it --name my-ubuntu ubuntu /bin/bash
  • 效果:直接进入Ubuntu容器的命令行界面(终端提示符会变成容器内的样式),可以执行lspwd等Linux命令。
  • 退出:输入exit退出容器,此时容器会停止(因为没有-d参数,交互式运行结束后容器停止)。

三、容器状态操作:启动、停止、重启的“开关” 🔄

容器启动后,可能需要暂停、重启或强制停止,对应三个核心命令:

1. 启动已停止的容器

docker start 容器名称/容器ID

示例:启动之前停止的my-nginx容器

docker start my-nginx

2. 停止运行中的容器(优雅停止)

docker stop 容器名称/容器ID
  • 原理:向容器发送SIGTERM信号,允许容器保存数据后再停止(类似“正常关机”)。
  • 示例:停止my-nginx
docker stop my-nginx

3. 强制停止容器(紧急情况)

如果容器卡死,docker stop无效,用docker kill强制终止(类似“拔电源”):

docker kill 容器名称/容器ID

4. 重启容器(先停止再启动)

docker restart 容器名称/容器ID

示例:重启my-nginx

docker restart my-nginx

四、进入容器:“钻进”容器内部操作 🕳️

有时需要进入运行中的容器(比如修改配置、查看日志),两种常用方式:docker execdocker attach,但推荐用前者。

1. docker exec(推荐):在容器内执行命令,不影响容器运行

  • 进入容器终端(交互式)

    docker exec -it 容器名称/容器ID /bin/bash
    
    • -i:保持标准输入打开;
    • -t:分配一个伪终端;
    • /bin/bash:容器内执行的命令(进入bash终端)。

    示例:进入my-nginx容器

    docker exec -it my-nginx /bin/bash
    

    进入后,可执行ls /usr/share/nginx/html查看Nginx的默认页面文件。

  • 执行单条命令(不进入终端)
    比如在容器内查看nginx版本:

    docker exec my-nginx nginx -v
    

2. docker attach(慎用):直接连接容器的主进程

docker attach 容器名称/容器ID
  • 特点:如果从这个终端退出(输入exit),容器会直接停止(因为终止了主进程),适合临时查看主进程输出,不适合操作。

五、容器删除:清理不再需要的容器 🗑️

容器停止后不会自动删除,需要手动清理(避免占用资源)。

1. 删除单个已停止的容器

docker rm 容器名称/容器ID

示例:删除my-ubuntu容器

docker rm my-ubuntu

2. 强制删除运行中的容器

如果容器正在运行,docker rm会失败,需加-f参数强制删除:

docker rm -f my-nginx

3. 批量删除所有已停止的容器(实用技巧)

用一条命令清理所有停止的容器,释放资源:

docker rm $(docker ps -aq)
  • 解释:docker ps -aq会列出所有容器的ID(-a所有,-q只显示ID),然后通过$()传递给docker rm批量删除。

六、容器日志查看:排查问题的“关键线索” 📜

容器运行中出现问题?查看日志是最快的排查方式,用docker logs命令。

核心用法:

docker logs [参数] 容器名称/容器ID

常用参数:

  • -f:实时跟踪日志(类似tail -f);
  • -t:显示日志时间戳;
  • --tail 行数:只显示最后N行日志。

示例:

  1. 查看my-nginx的所有日志:
docker logs my-nginx
  1. 实时跟踪my-nginx的最新日志(按Ctrl+C退出):
docker logs -f my-nginx
  1. 查看my-nginx最后10行日志,带时间戳:
docker logs -t --tail 10 my-nginx

七、实战案例:完整操作一个Nginx容器 🏁

我们用一个完整流程演示容器的生命周期:

  1. 拉取Nginx镜像(如果本地没有):
docker pull nginx
  1. 创建并启动容器(后台运行,映射8080端口,命名为test-nginx):
docker run -d -p 8080:80 --name test-nginx nginx
  1. 查看容器状态
docker ps  # 确认test-nginx处于运行中
  1. 进入容器,修改默认页面:
docker exec -it test-nginx /bin/bash
# 进入后执行以下命令修改index.html
echo "<h1>Hello Docker!</h1>" > /usr/share/nginx/html/index.html
exit  # 退出容器
  1. 验证效果:打开浏览器访问localhost:8080,会看到“Hello Docker!”。

  2. 查看容器日志

docker logs -f test-nginx  # 可看到浏览器访问的日志记录
  1. 停止容器
docker stop test-nginx
  1. 删除容器
docker rm test-nginx

八、避坑指南:新手常犯的3个错误 ❌→✅

  1. 启动容器时提示“端口已被占用”
    → 原因:-p参数指定的主机端口(如8080)已被其他程序占用。
    → 解决:换一个未被占用的端口,比如-p 8081:80

  2. 执行docker exec提示“容器未运行”
    → 原因:容器处于停止状态,无法进入。
    → 解决:先启动容器docker start 容器名,再执行exec

  3. 删除容器时提示“容器正在运行”
    → 解决:要么先停止docker stop 容器名,要么强制删除docker rm -f 容器名

九、总结:容器操作核心命令速记 📌

操作命令
查看运行中容器docker ps
查看所有容器docker ps -a
创建并启动容器docker run [参数] 镜像名
启动容器docker start 容器名/ID
停止容器docker stop 容器名/ID
进入容器终端docker exec -it 容器名/ID /bin/bash
查看日志docker logs [参数] 容器名/ID
删除容器docker rm 容器名/ID

下一章,我们将学习镜像的进阶操作:如何自己构建镜像、优化镜像体积,以及推送镜像到仓库,让你的应用可以被其他人复用~

小练习:用学到的命令,启动一个redis容器(镜像名redis),映射端口6379:6379,命名为my-redis,然后进入容器用redis-cli测试能否连接。

更多推荐