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 命令将运行环境、代码和启动命令打包为可复用镜像,是企业级项目部署的标准方式。


相关推荐
CDN3602 小时前
高防服务器卡顿、丢包严重?BGP 线路与带宽扩容方案
运维·服务器·网络安全
雪可问春风1 天前
docker环境部署
运维·docker·容器
lwx9148521 天前
Linux-Shell算术运算
linux·运维·服务器
翻斗包菜1 天前
PostgreSQL 日常维护完全指南:从基础操作到高级运维
运维·数据库·postgresql
somi71 天前
ARM-驱动-02-Linux 内核开发环境搭建与编译
linux·运维·arm开发
双份浓缩馥芮白1 天前
【Docker】Linux 迁移 docker 目录(软链接)
linux·docker
海的透彻1 天前
nginx启动进程对文件的权限掌控
运维·chrome·nginx
路溪非溪1 天前
Linux驱动开发中的常用接口总结(一)
linux·运维·驱动开发
航Hang*1 天前
第3章:Linux系统安全管理——第2节:部署代理服务
linux·运维·服务器·开发语言·笔记·系统安全