Docker 基础入门:零基础掌握核心命令(新手友好版)

一句话理解 Docker:Docker 就像集装箱,把你的代码、依赖、环境打包成一个“容器”,在任何地方都能一键运行,彻底告别“在我机器上能跑”的尴尬!


一、Docker 是什么?为什么需要它?

1. 传统开发的痛点

  • 环境不一致:开发、测试、生产环境配置不同,导致“在我电脑上能跑”。
  • 依赖冲突:项目 A 需要 Python 3.8,项目 B 需要 Python 3.10,互相打架。
  • 部署复杂:安装依赖、配置服务、启动应用,步骤繁琐易出错。

2. Docker 的解决方案

  • 镜像(Image):打包好的“软件安装包”(包含代码+依赖+环境)。
  • 容器(Container):镜像运行起来的实例(类似虚拟机,但更轻量)。
  • 一次构建,处处运行:镜像在任何安装 Docker 的机器上都能运行。

二、安装 Docker(快速上手)

Windows / macOS

  • 下载 Docker Desktop
  • 安装后启动,终端输入 docker --version 验证

Linux(Ubuntu 示例)

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
sudo docker run hello-world

💡 提示:Linux 用户可将当前用户加入 docker 组避免每次加 sudo:

sudo usermod -aG docker $USER
# 重启终端生效

三、Docker 核心概念速览

概念类比说明
镜像 (Image)软件安装包(如 .exe)只读模板,包含运行所需一切
容器 (Container)运行中的程序实例镜像的运行态,可启动/停止/删除
Dockerfile菜谱定义如何构建镜像的文本文件
Registry应用商店存储镜像的地方(如 Docker Hub)

四、新手必学 10 大 Docker 命令

1. docker run:运行容器(最常用!)

# 基础语法
docker run [OPTIONS] IMAGE [COMMAND]

# 示例1:运行一个 Nginx 容器(-d 后台运行,-p 端口映射)
docker run -d -p 8080:80 nginx

# 访问 http://localhost:8080 看到 Nginx 欢迎页!

# 示例2:运行 Ubuntu 并进入交互式终端
docker run -it ubuntu /bin/bash
  • -d:后台运行(detached mode)
  • -p 8080:80:将主机 8080 端口映射到容器 80 端口
  • -it:交互式终端(-i 保持 STDIN 开启,-t 分配伪终端)

2. docker ps:查看运行中的容器

# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

输出示例:

CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS       PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   2 hours ago    Up 2 hours   0.0.0.0:8080->80/tcp   serene_wilson

3. docker stop / docker start:停止/启动容器

# 停止容器(通过容器ID或名称)
docker stop a1b2c3d4e5f6
docker stop serene_wilson

# 启动已停止的容器
docker start serene_wilson

4. docker rm:删除容器

# 删除已停止的容器
docker rm serene_wilson

# 强制删除正在运行的容器(先 stop 再 rm 更安全!)
docker rm -f a1b2c3d4e5f6

5. docker images:查看本地镜像

docker images

输出示例:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   2 weeks ago    141MB
ubuntu        latest    ba6acccedd29   3 weeks ago    72.8MB

6. docker rmi:删除镜像

# 删除镜像(需先删除依赖该镜像的容器!)
docker rmi nginx:latest

7. docker pull:从仓库下载镜像

# 从 Docker Hub 下载官方镜像
docker pull redis:7.0

8. docker exec:在运行中的容器内执行命令

# 进入 Nginx 容器的 shell
docker exec -it serene_wilson /bin/bash

# 查看容器内进程
docker exec serene_wilson ps aux

9. docker logs:查看容器日志

# 查看 Nginx 容器的访问日志
docker logs serene_wilson

# 实时跟踪日志(类似 tail -f)
docker logs -f serene_wilson

10. docker build:构建自定义镜像(需 Dockerfile)

# 在包含 Dockerfile 的目录下执行
docker build -t my-app:1.0 .

五、实战:用 Docker 运行一个 Java Web 应用

目标:将一个 Spring Boot 应用打包成 Docker 镜像,并在容器中运行,实现“一次构建,处处运行”。


步骤 1:准备一个简单的 Spring Boot 应用

如果你还没有 Java 项目,可以使用 Spring Initializr 快速生成:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.x(推荐)
  • Dependencies: Spring Web
  • Packaging: Jar

下载并解压后,进入项目目录,创建一个简单的控制器:

// src/main/java/com/example/demo/HelloController.java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello from Docker! 🐳 (Java Edition)";
    }
}

然后在项目根目录执行构建命令(确保已安装 JDK 17+ 和 Maven):

./mvnw clean package -DskipTests

构建成功后,会在 target/ 目录下生成一个可执行的 JAR 文件,例如:demo-0.0.1-SNAPSHOT.jar。


步骤 2:编写 Dockerfile

在项目根目录创建 Dockerfile,内容如下:

# 使用官方 OpenJDK 17 镜像作为基础镜像(推荐使用 slim 版本减小体积)
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 将构建好的 JAR 文件复制到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar

# 暴露应用端口(Spring Boot 默认 8080)
EXPOSE 8080

# 启动应用(前台运行,避免容器退出)
ENTRYPOINT ["java", "-jar", "app.jar"]

💡 说明:

  • EXPOSE 8080 是声明端口,实际运行仍需通过 -p 映射。
  • 使用 ENTRYPOINT 而非 CMD,便于后续传入 JVM 参数(如 -Xmx)。

步骤 3:构建 Docker 镜像

在项目根目录(包含 Dockerfile 和 target/)执行:

docker build -t my-spring-app:1.0 .
  • -t my-spring-app:1.0:为镜像打标签(名称:版本)
  • .:表示当前目录为构建上下文

构建成功后,可通过 docker images 查看:

docker images | grep my-spring-app
# 输出示例:
# my-spring-app   1.0    a1b2c3d4e5f6   2 minutes ago   450MB

步骤 4:运行容器

docker run -d -p 8080:8080 --name spring-demo my-spring-app:1.0
  • -d:后台运行
  • -p 8080:8080:将主机 8080 端口映射到容器 8080 端口
  • --name spring-demo:给容器起个名字,方便管理

步骤 5:验证应用

打开浏览器或使用 curl 访问:

curl http://localhost:8080/hello

预期输出:

Hello from Docker! 🐳 (Java Edition)

🎉 恭喜!你的 Java Web 应用已在 Docker 容器中成功运行!


步骤 6:查看日志与调试

如果应用未正常启动,可通过日志排查:

# 查看容器日志
docker logs spring-demo

# 实时跟踪日志
docker logs -f spring-demo

# 进入容器内部(调试用)
docker exec -it spring-demo /bin/bash

常见问题排查

问题原因解决方案
Connection refused应用未监听 0.0.0.0Spring Boot 默认监听所有接口,无需修改;若自定义需确保 server.address=0.0.0.0
容器启动后立即退出JAR 文件路径错误或启动失败检查 COPY 路径,用 docker logs 查看错误
端口冲突主机 8080 被占用改用 -p 8081:8080

七、学习路线建议

  1. 先掌握核心命令:run, ps, stop, rm, exec, logs
  2. 理解镜像与容器关系:镜像是静态模板,容器是动态实例
  3. 动手写 Dockerfile:从简单应用开始(如 Java/Python/Node.js)
  4. 学习 Docker Compose:管理多容器应用

记住:Docker 的本质是标准化和隔离。它不是魔法,而是让开发、测试、部署流程变得可预测、可重复的工程实践。

更多推荐