从零入门:Docker在Ubuntu上的安装、使用与主流镜像仓库实战(Java/Go/MySQL/PostgreSQL/MongoDB/Nginx

本文导览:本文是为"容器化小白"量身定制的 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_USERPOSTGRES_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_USERNAMEMONGO_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 集群管理

如果本文对你有帮助,欢迎点赞收藏转发支持,有问题欢迎在评论区交流讨论!🚀

相关推荐
是多巴胺不是尼古丁1 小时前
期末java复习--string
java·开发语言·python
Survivor0011 小时前
高并发系统流量治理的底层算法
java·开发语言
凡人叶枫1 小时前
Effective C++ 条款35:考虑 virtual 函数以外的其他选择
java·c++·spring
garmin Chen1 小时前
从 Transformer 到 Agent:大模型技术全景解析
java·人工智能·python·深度学习·transformer
愚公移码2 小时前
蓝凌EKP18产品:流程引擎技术篇之流程核心概念模型
java·人工智能·流程引擎·蓝凌
Full Stack Developme2 小时前
Apache Tika 教程
java·开发语言·python·apache
鹅城剑仙2 小时前
Java线程池完全指南
java
李白的天不白2 小时前
SmartAdmin(基于 Spring Boot 框架)中配置跨域请求 VUE3 设置请求头
java·前端
橙子进阶之路2 小时前
Java线程(CompletableFuture)
java·开发语言