Docker 基础入门:零基础掌握核心命令(新手友好版)
·
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.0 | Spring Boot 默认监听所有接口,无需修改;若自定义需确保 server.address=0.0.0.0 |
| 容器启动后立即退出 | JAR 文件路径错误或启动失败 | 检查 COPY 路径,用 docker logs 查看错误 |
| 端口冲突 | 主机 8080 被占用 | 改用 -p 8081:8080 |
七、学习路线建议
- 先掌握核心命令:
run,ps,stop,rm,exec,logs - 理解镜像与容器关系:镜像是静态模板,容器是动态实例
- 动手写 Dockerfile:从简单应用开始(如 Java/Python/Node.js)
- 学习 Docker Compose:管理多容器应用
记住:Docker 的本质是标准化和隔离。它不是魔法,而是让开发、测试、部署流程变得可预测、可重复的工程实践。
更多推荐

所有评论(0)