本文导览:本文是为"容器化小白"量身定制的 Docker 一站式教程,涵盖 Ubuntu 系统的完整安装配置、国内镜像加速、常用命令以及6大主流镜像(Nginx、MySQL、PostgreSQL、MongoDB、Java、Go)的使用案例,手把手带你从零上手 Docker。
一、Docker 是什么?为什么要用容器?
Docker 是一种基于 Linux 内核的轻量级虚拟化技术 ,它把应用程序及其运行依赖(库、配置文件、环境变量等)一起打包成一个可移植的容器。无论在开发机、测试机还是生产服务器,只要部署了 Docker,容器就能"开箱即用"。
传统部署中,"本地能跑,线上报错"的痛点几乎人人都遇到过。Docker 正是用来解决这个问题的------把环境放进容器里,和宿主机彻底隔离。相比传统虚拟机,Docker 是进程级隔离,启动仅需秒级,资源占用不到虚拟机的 20%。
一句话总结:Docker ≈ 把应用程序和它的运行环境打包成一个"轻量级虚拟机",随处运行。
二、Ubuntu 系统上安装 Docker(2026最新实战)
本文全程使用 Docker 官方仓库 进行安装,适合 Ubuntu 20.04/22.04/24.04 LTS,确保稳定与安全。
⚠️ 前置要求 :拥有
sudo权限,且系统能访问外网(若内网环境需配置离线安装或镜像源)。
步骤1:更新系统并安装依赖
bash
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
这一步安装后续用到的下载工具和加密验证工具。-y 表示自动确认,无需手动按回车。
步骤2:添加 Docker 官方 GPG 密钥(安全验证)
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
GPG 密钥确保下载的 Docker 是官方原版,没有被篡改。
步骤3:添加 Docker 官方软件源
bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这条命令会告诉 Ubuntu 去哪里下载 Docker,系统版本会被自动识别。
步骤4:再次更新源并安装 Docker 引擎
bash
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
-
docker-ce:Docker 社区版(完全免费) -
docker-ce-cli:命令行工具 -
containerd.io:容器运行时
步骤5:把当前用户加入 docker 组(无需每次输入 sudo)
bash
sudo usermod -aG docker $USER
newgrp docker
默认情况下必须使用 sudo 才能运行 Docker 命令。把用户加入 docker 组后,就可以直接使用 Docker 了。
步骤6:验证安装成功
bash
docker --version # 查看版本号
docker run hello-world # 运行官方测试容器
如果终端输出 "Hello from Docker!",说明安装配置成功。
步骤7(可选):设置开机自启动
bash
sudo systemctl enable docker
服务器用户强烈建议开启,这样服务器重启后 Docker 会自动运行。
三、配置国内镜像加速器(解决拉取慢/失败问题)
截至 2026 年,国内从 Docker Hub 直接拉取镜像依然面临速度缓慢、连接超时等挑战。配置国内镜像加速源是必备优化步骤。
🔧 配置方法
编辑或创建 Docker 守护进程配置文件 /etc/docker/daemon.json:
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
然后重启 Docker 服务:
bash
sudo systemctl restart docker
2026 年最新实测可用的国内镜像源推荐:
| 镜像源 | 地址 | 特点 |
|---|---|---|
| 轩辕镜像(免费) | https://docker.xuanyuan.me |
全平台支持,更新及时,免费 |
| 毫秒镜像 | https://docker.1ms.run |
速度极快,实测可达 10MB/s+ |
| DaoCloud | https://docker.m.daocloud.io |
国内最早的服务之一,稳定可靠 |
配置完成后,docker pull 命令会自动走加速器拉取镜像。
四、Docker 核心概念速览(小白必读)
在进入实战之前,先花 2 分钟理解这三个核心概念:
-
镜像(Image) :一个只读的"模板",里面打包了应用程序及其运行环境。比如 Nginx 镜像、MySQL 镜像。
-
容器(Container) :镜像的运行实例。如果把镜像比作一个"光盘",容器就是光盘上正在运行的"程序"。
-
仓库(Registry) :存放镜像的地方,类似于 GitHub 之于代码。Docker Hub 是官方公共仓库。
常用命令快速参考:
bash
docker pull <镜像名> # 拉取镜像
docker images # 查看本地镜像列表
docker run <镜像名> # 运行容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker stop <容器名> # 停止容器
docker rm <容器名> # 删除容器
docker rmi <镜像名> # 删除镜像
五、🔥 实战案例一:拉取并运行 Web 服务器 Nginx
场景需求:部署一个静态网站或反向代理服务。
bash
# 1. 拉取 Nginx 官方镜像
docker pull nginx:alpine
# 2. 运行 Nginx 容器
docker run -d --name my-nginx -p 8080:80 nginx:alpine
-
-d:后台运行 -
--name:指定容器名称 -
-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口
现在打开浏览器访问 http://localhost:8080,就能看到 Nginx 的欢迎页面。
生产级配置(持久化) :
bash
docker run -d --name prod-nginx \
-p 80:80 \
-v ~/nginx-conf/conf.d:/etc/nginx/conf.d \
-v ~/nginx-conf/html:/usr/share/nginx/html \
-m 256m \ # 限制内存 256MB
--cpus=1.0 \ # 限制 CPU 1 核
nginx:alpine
💡 选择说明 :
alpine版本体积仅 20MB 左右,适合资源受限环境。官方标准版(nginx:latest)约 142MB。
六、实战案例二:MySQL 数据库容器化部署
场景需求:快速启动一个 MySQL 8.0 数据库用于开发或测试。
bash
# 1. 拉取 MySQL 8.0 镜像
docker pull mysql:8.0
# 2. 创建数据持久化目录(防止数据丢失)
mkdir -p ~/docker/mysql8_data
# 3. 运行 MySQL 容器
docker run -d \
--name mysql-8 \
-p 3306:3306 \
-v ~/docker/mysql8_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mysecretpass \
mysql:8.0
-
-v ~/docker/mysql8_data:/var/lib/mysql:将宿主机目录挂载到容器,实现数据持久化。即使容器被删除,数据依然安全。 -
-e MYSQL_ROOT_PASSWORD=...:通过环境变量设置 root 密码
运行后,可以用数据库客户端连接 localhost:3306,用户名为 root,密码为 mysecretpass。
环境变量扩展 :MySQL 镜像还支持 MYSQL_DATABASE(自动创建数据库)、MYSQL_USER / MYSQL_PASSWORD(创建新用户)等环境变量。
七、实战案例三:PostgreSQL 数据库容器化部署
场景需求:使用 PostgreSQL 作为关系型数据库。
bash
# 1. 拉取 PostgreSQL 轻量版镜像
docker pull postgres:16-alpine
# 2. 创建数据卷(持久化)
docker volume create pgdata
# 3. 运行 PostgreSQL 容器
docker run -d \
--name postgres \
-p 5432:5432 \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=SecurePass123 \
-e POSTGRES_USER=app_user \
-e POSTGRES_DB=app_db \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
postgres:16
-
使用
alpine版本可大幅减小镜像体积 -
数据卷
pgdata使得容器即使删除重建,数据仍可恢复 -
POSTGRES_USER和POSTGRES_DB分别指定数据库用户和默认数据库 -
--restart unless-stopped表示容器退出后自动重启(除非手动停止)
八、实战案例四:MongoDB NoSQL 数据库容器化部署
场景需求:运行一个 MongoDB 文档数据库。
bash
# 1. 拉取 MongoDB 镜像
docker pull mongo:6.0
# 2. 运行 MongoDB 容器
docker run -d \
--name mongodb \
-p 27017:27017 \
-v ~/docker/mongo_data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=adminpass \
mongo:6.0
-
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD:设置管理员账号密码 -
默认端口 27017
-
MongoDB 官方建议使用 6.0.x LTS 版本
连接方式:mongodb://admin:adminpass@localhost:27017
九、实战案例五:Java 应用容器化部署(附 Dockerfile)
环境依赖说明 :Java 应用需要 JDK/JRE 环境才能运行。Docker 容器通过基础镜像 (如 openjdk)提供这一依赖,宿主机无需预先安装 JDK。
💡 这就是 Docker 的核心价值:宿主机不需要安装任何开发环境,容器自带所有依赖。
方式一:使用官方 Java 运行镜像(体积小)
dockerfile
# Dockerfile
FROM openjdk:11-jre-slim # JRE 瘦身版,体积小
WORKDIR /app
COPY target/your-app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
方式二:多阶段构建(推荐,镜像更小更干净)
dockerfile
# Dockerfile(多阶段构建)
# 第一阶段:编译打包
FROM maven:3.8-openjdk-11 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
# 第二阶段:运行(只需要 JRE,不包含编译工具)
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/your-app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
构建与运行:
bash
docker build -t my-java-app:1.0 .
docker run -d -p 8080:8080 --name java-app my-java-app:1.0
-
FROM openjdk:*基础镜像自带 JRE 运行环境 -
宿主机完全不需要安装 Java
-
多阶段构建的优点:最终镜像只包含 JRE + JAR 包,不包含 Maven、源码等构建产物,镜像体积大幅减小
十、实战案例六:Go 应用容器化部署(附 Dockerfile)
环境依赖说明 :Go 应用编译后是独立的二进制可执行文件 ,运行时不需要Go 编译环境。因此可以利用这个特性做多阶段构建,得到非常小的镜像。
dockerfile
# Dockerfile(多阶段构建 - Go 专属)
# 第一阶段:编译 Go 代码
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
# 第二阶段:运行(仅包含二进制文件,约 10-30MB)
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]
构建与运行:
bash
docker build -t my-go-app:1.0 .
docker run -d -p 8080:8080 my-go-app:1.0
-
Go 编译后的二进制文件不依赖任何运行时环境 ,因此可以用极小的
alpine基础镜像运行 -
最终镜像大小通常只有 10-30 MB,是所有语言中最小的容器镜像之一
-
宿主机完全不需要安装 Go 环境
十一、网络篇:多容器互联(容器间通信)
在实际项目中,一个应用往往需要连接数据库。让多个容器在同一个自定义网络中通信是最佳实践:
bash
# 1. 创建自定义网络
docker network create mynetwork
# 2. 启动数据库容器(加入该网络)
docker run -d --name mysql --network mynetwork -e MYSQL_ROOT_PASSWORD=pass mysql:8.0
# 3. 启动 Java 应用容器(同样加入该网络)
docker run -d --name java-app --network mynetwork -p 8080:8080 my-java-app:1.0
在 Java 应用代码中,直接使用容器名称作为主机名连接数据库:
java
// 不需要写 localhost 或 IP,直接用容器名 "mysql" 即可
String url = "jdbc:mysql://mysql:3306/mydb";
这样应用就通过容器名 mysql 访问数据库,无需关心 IP 地址变化。
十二、Docker Compose:一键启动多容器应用
当应用涉及多个容器(前端 + 后端 + 数据库 + Redis)时,手写多条 docker run 命令会变得非常繁琐。Docker Compose 让你用一个 docker-compose.yml 文件定义所有服务,然后一条命令启动整个应用。
示例:Java + MySQL + Nginx 一体化配置
yaml
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:7-alpine
networks:
- app-network
java-app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/appdb
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: rootpass
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- java-app
networks:
- app-network
volumes:
mysql_data:
networks:
app-network:
使用方式:
bash
docker compose up -d # 后台启动所有服务
docker compose down # 停止并移除所有服务
docker compose logs -f # 查看实时日志
十三、常见环境依赖对照表
理解 Docker 自带环境依赖的特性很重要------宿主机不需要安装任何依赖,一切都封装在镜像里:
| 应用类型 | 所需环境依赖 | 镜像示例 | 说明 |
|---|---|---|---|
| Java 应用 | JDK / JRE | openjdk:11-jre-slim |
宿主机不需要 Java |
| Go 应用 | 编译阶段:Go(编译后不依赖) | golang:1.21-alpine(构建) → alpine:latest(运行) |
最终二进制文件不依赖 Go |
| Nginx | 无 | nginx:alpine |
自带运行环境 |
| MySQL | 无 | mysql:8.0 |
自带数据库引擎 |
| PostgreSQL | 无 | postgres:16-alpine |
自带数据库引擎 |
| MongoDB | 无 | mongo:6.0 |
自带数据库引擎 |
核心感悟 :Docker 的"环境依赖"是由基础镜像(FROM ...) 提供的。宿主机上的环境除了 Docker 之外,其他什么都不用装。这就是"一次打包,处处运行"的真正含义。
十四、总结与下一步
本文从零开始,带你在 Ubuntu 上完成了 Docker 的完整安装与配置、镜像加速器的设置,并通过 6 个实战案例(Nginx、MySQL、PostgreSQL、MongoDB、Java、Go)演示了主流镜像仓库的使用方法。
掌握的核心技能:
✅ Docker 的安装与配置(含国内镜像加速)
✅ 核心命令的使用(pull、run、ps、stop、rm)
✅ 数据持久化(挂载数据卷)
✅ 容器间互联(自定义网络)
✅ Docker Compose 编排多容器应用
✅ 不同语言的 Dockerfile 编写(Java、Go)
扩展学习方向:
-
学习
docker build构建自定义镜像 -
学习推送镜像到 Docker Hub / 私有仓库
-
学习 Kubernetes(K8s)容器编排
-
了解 Docker Swarm 集群管理
如果本文对你有帮助,欢迎点赞 、收藏 、转发支持,有问题欢迎在评论区交流讨论!🚀