docker教程(从0到1, 一小时入门到精通)

docker常用命令

例如:

docker search nginx

docker pull 下载

例如:

docker pull nginx

docker pull nginx/nginx-ingress

docker images 查看下载的镜像

docker rmi 删除镜像

例如:

docker rmi nginx/nginx-ingress

docker run 运行容器

-p (Publish):端口映射。将宿主机的物理端口绑定到容器的逻辑端口,实现外部网络对容器服务的访问。格式:宿主机端口:容器端口。

--name:静态标识。为容器指定一个唯一的自定义名称,替代随机生成的 Hash ID,便于在脚本和命令中精确引用。

-d (Detach):后台运行。以守护进程(Daemon)模式启动容器,释放当前终端控制权,适合数据库和 Web 服务器。

-e (Env):环境注入。动态向容器内进程传递配置变量(如数据库密码、Spring Profile),实现"一次镜像,多环境运行"。

--restart:自愈策略。定义容器在崩溃、退出或 Docker 守护进程重启时的行为(如 always、on-failure),保障服务可用性。

--network:拓扑隔离。将容器加入指定的虚拟网络,利用 Docker 内置 DNS 实现容器间通过"服务名"而非动态 IP 进行内部通信。

docker ps 查看容器

-a 查看全部容器

docker stop 关闭容器

例如:

docker stop n2

docker start 启动已有容器

例如:

docker start n1/id

docker rm 删除容器

例如:

docker rm n1

docker exec 进容器进行操作

例如:

docker exec n2 ls -al

docker exec -it n2 bash(终端操作)

也可以进入docker桌面版进行操作

docker netword 连接网络

创建网络:docker network create my-net

运行并加入网络:docker run -d --name app --network my-net my-image

连接已有容器:docker network connect my-net existing_container

数据存储方式

目录挂载

简单来说,Docker 目录挂载(Mounting) 就是在**宿主机(你的电脑)和容器(运行中的软件)**之间建立一个"传送门",让它们能共享同一个文件夹。挂载本质上是 Linux 的 mount 操作。它不是在做"文件拷贝",而是改变了路径的指向。

复制代码
dockerrun-v<宿主机绝对路径或名称>:容器内绝对路径>[:<选项>]<镜像名>

例如:

-v 左边是宿主目录,右边是容器映射目录

创建卷

例如:

docker volume create

-v 左边卷名,右边容器目录

--mount(挂载)

复制代码
dockerrun-v<宿主机绝对路径或名称>:容器内绝对路径>[:<选项>]<镜像名>

docker run--mount type=<类型>,source=<源>,target=<目标>[<选项>...]<镜像名>

type (类型):指定挂载的模式。

bind:绑定挂载。直接将宿主机的绝对路径映射到容器。

volume:匿名/具名卷。由 Docker 统一管理的逻辑存储区域(推荐,性能更好且跨平台)。

tmpfs:内存挂载。数据只存在内存中,不会写入硬盘,重启消失(常用于存放敏感 key 或高频临时文件)。

source / src (源):

如果类型是 bind,这里填宿主机的绝对路径(如 D:\data)。

如果类型是 volume,这里填 卷的名字。

target / destination / dst (目标):

容器内部的路径。数据会被挂载到这个位置(如 /app/logs)。

Docker Compose

1. 检查是否安装

bash 复制代码
docker compose version

如果已安装 Docker Desktop,一般默认自带 Compose。


2. 核心作用

Docker Compose 用于 统一管理多个容器服务 ,通过一个 docker-compose.yaml 文件即可完成:

  • MySQL
  • Redis
  • Spring Boot
  • Nginx
  • Vue 前端

等多个服务的一键启动。

相比多个 docker run

  • 更规范
  • 更适合项目
  • 更方便部署

3. 常用命令

启动:

bash 复制代码
docker compose up -d

指定文件启动:

bash 复制代码
docker compose -f docker-compose.yaml up -d

停止:

bash 复制代码
docker compose stop

删除容器:

bash 复制代码
docker compose down

查看日志:

bash 复制代码
docker compose logs -f

查看运行状态:

bash 复制代码
docker compose ps

Docker 镜像核心知识点

1. 镜像(Image)

镜像可以理解为:

一个完整的软件运行模板

里面包含:

  • 运行环境
  • 系统依赖
  • JDK / Node
  • 项目代码
  • 启动命令

例如:

bash 复制代码
mysql:8.0
redis:7
openjdk:17
nginx:latest

2. 容器(Container)

容器是镜像运行后的实例。

可以理解为:

镜像是模板,容器是实际运行起来的程序


Dockerfile 核心知识点

Dockerfile 用于构建项目镜像。

例如 Java 项目:

dockerfile 复制代码
FROM openjdk:17
COPY target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

多阶段构建(重点)

核心思想

前一个阶段使用功能完整的大镜像进行构建

后一个阶段使用精简镜像,只复制最终运行需要的内容

这就是:

Multi-stage Build(多阶段构建)


为什么这样做

因为:

第一阶段:负责构建

需要很多工具:

  • Maven
  • JDK
  • Node
  • npm
  • 编译环境

所以用完整镜像。

例如:

dockerfile 复制代码
FROM maven:3.9.6-eclipse-temurin-17 AS builder

第二阶段:负责运行

只需要:

  • 最终 jar 包
  • 运行时 JDK

所以用轻量镜像。

例如:

dockerfile 复制代码
FROM eclipse-temurin:17-jre
COPY --from=builder /app/target/app.jar app.jar

完整示例

dockerfile 复制代码
# 第一阶段:构建
FROM maven:3.9.6-eclipse-temurin-17 AS builder
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

# 第二阶段:运行
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=builder /app/target/app.jar app.jar
CMD ["java", "-jar", "app.jar"]

核心优势(面试重点)

1)镜像体积更小

比如:

  • 构建镜像:1GB+
  • 最终运行镜像:200MB 左右

2)更安全

不会把:

  • 源码
  • Maven
  • 编译工具

带到生产环境。


3)部署更快

镜像更小:

  • 上传快
  • 拉取快
  • 启动快

一句话总结(非常适合面试)

Docker 多阶段构建的核心思想是:前置阶段完成项目编译构建,后置阶段基于轻量运行时镜像,仅复制最终产物,从而减小镜像体积并提升部署效率。


创建镜像的两种方式

Docker 创建镜像主要有两种方式:


方式一:基于 Dockerfile 创建(推荐)

这是企业开发中最常用、最标准的方式。

核心命令:

bash 复制代码
docker build -t 镜像名:版本号 .

例如:

bash 复制代码
docker build -t novaleap-backend:1.0 .

说明:

  • -t:指定镜像名称和版本
  • .:当前目录(Dockerfile 所在目录)

例如生成后的镜像:

bash 复制代码
novaleap-backend:1.0

方式二:基于容器提交

把一个运行中的容器保存成镜像。

命令:

bash 复制代码
docker commit 容器ID 镜像名:版本

例如:

bash 复制代码
docker commit local-mysql my-mysql:1.0

为什么不推荐 docker commit

这种方式一般不推荐用于正式项目。

原因:

  • 不规范
  • 不方便维护
  • 无法版本化管理
  • 不利于团队协作
  • 无法复现构建过程

企业开发基本都使用 Dockerfile。


Dockerfile 创建镜像(重点)

这是最标准的方式,也是面试高频。


1. 创建 Dockerfile

在项目根目录创建文件:

text 复制代码
Dockerfile

注意:

文件名必须是 Dockerfile,不能带后缀

例如:

text 复制代码
novaleap-backend/
├── Dockerfile
├── pom.xml
├── src
└── target

2. Java 项目示例

Spring Boot 项目常见写法:

dockerfile 复制代码
FROM openjdk:17

WORKDIR /app

COPY target/app.jar app.jar

CMD ["java", "-jar", "app.jar"]

3. 每一行含义解析


FROM

指定基础镜像

dockerfile 复制代码
FROM openjdk:17

表示当前镜像基于 JDK 17。


WORKDIR

设置工作目录

dockerfile 复制代码
WORKDIR /app

后续命令都在 /app 目录执行。


COPY

复制文件

dockerfile 复制代码
COPY target/app.jar app.jar

把本地 jar 包复制到容器内部。


CMD

容器启动命令

dockerfile 复制代码
CMD ["java", "-jar", "app.jar"]

容器启动时自动运行项目。


构建镜像

bash 复制代码
docker build -t novaleap-backend:1.0 .

查看镜像

bash 复制代码
docker images

例如:

bash 复制代码
REPOSITORY           TAG       IMAGE ID
novaleap-backend     1.0       abc123

运行镜像

bash 复制代码
docker run -d -p 8080:8080 novaleap-backend:1.0

说明:

  • -d:后台运行
  • -p:端口映射

Vue 项目创建镜像

前端项目一般基于 Nginx。

Dockerfile:

dockerfile 复制代码
FROM nginx:latest

COPY dist/ /usr/share/nginx/html/

构建镜像

bash 复制代码
docker build -t novaleap-frontend:1.0 .

运行镜像

bash 复制代码
docker run -d -p 80:80 novaleap-frontend:1.0

多阶段构建(推荐)

企业项目非常常用。

尤其适合 Java / Vue 项目。


为什么使用多阶段构建

核心思想:

第一阶段负责构建

第二阶段负责运行

这样镜像体积更小。


Java 多阶段构建示例

dockerfile 复制代码
# 构建阶段
FROM maven:3.9-jdk-17 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:17-jre
WORKDIR /app
COPY --from=build /app/target/app.jar app.jar

CMD ["java", "-jar", "app.jar"]

优势

  • 镜像体积更小
  • 更安全
  • 不包含 Maven
  • 不包含源码
  • 部署更快

为什么推荐 Dockerfile

优点:

  • 标准化
  • 可维护
  • 可复用
  • 可版本控制
  • 团队协作方便
  • 适合 CI/CD 自动部署

面试高频问题

非常容易被问:

  • 你项目镜像怎么构建?
  • Dockerfile 怎么写?
  • 为什么使用多阶段构建?
  • 为什么不用 docker commit?
  • 镜像如何优化体积?

一句话总结(面试)

Docker 创建镜像主要通过 Dockerfile 实现,使用 docker build 命令将运行环境、代码和启动命令打包为可复用镜像,是企业级项目部署的标准方式。


相关推荐
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875243 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant