Docker详解及实战

🎉 Docker 简介和安装 - Docker 快速入门

Docker 简介

Docker是一个开源的平台,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离,但可以通过特定的通道相互传递信息。

Docker提供了一个轻量级的虚拟化解决方案。由于运行在同一计算机上的所有容器共享同一个操作系统内核,避免了启动与维护虚拟机的开销。因此相比于传统的虚拟机,Docker容器更加轻便、快速、容易部署。使用Docker,开发者可以避免在两台计算机上运行效果不一致的问题,容器提供了一致的行为,进而使得应用程序在不同环境的计算机上有相同的运行效果。

Docker 是一个应用打包、分发、部署的工具。

|--------|----------------------------------------------|---------------------------------|
| 特性 | 普通虚拟机 | Docker |
| 跨平台 | 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 | 支持的系统非常多,各类 windows 和 Linux 都支持 |
| 性能 | 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 | 性能好,只虚拟软件所需运行环境,最大化减少没用的配置 |
| 自动化 | 需要手动安装所有东西 | 一个命令就可以自动部署好所需环境 |
| 稳定性 | 稳定性不高,不同系统差异大 | 稳定性好,不同系统都一样部署方式 |

Docker 部署的优势

  • 轻量级:基于操作系统层的虚拟化,容器共享宿主内核,启动秒级;
  • 可移植:构建一次的镜像可运行在任何支持 Docker 的平台;
  • 标准化打包:通过 Dockerfile 定义构建流程,镜像具备一致性;
  • 资源隔离:利用 Linux 的 Namespace 和 Cgroups 实现资源隔离与限制;
  • 镜像复用与层级缓存:提高构建效率与存储复用率。

Docker 通常用来做什么

  • 应用分发、部署,方便传播给他人安装。特别是开源软件和提供私有部署的应用
  • 快速安装测试/学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上。例如 Redis / MongoDB / ElasticSearch / ELK
  • 多个版本软件共存,不污染系统,例如 Python2、Python3,Redis4.0,Redis5.0
  • Windows 上体验/学习各种 Linux 系统

Docker的安装(CentOS安装)

1、安装yum 包管理工具安装一些必要的工具和库

命令:

复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2
如果执行报错:

解决办法:

1、执行命令:

复制代码
vi /etc/sysconfig/network-scripts/ifcfg-ens33

追加域名:

复制代码
DNS1=114.114.114.114
DNS2=8.8.8.8

2、备份镜像源

命令:

复制代码
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

3、更新国内镜像源

命令(两者使用一个):

复制代码
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

4、执行以下命令

复制代码
yum clean all  #清理缓存
yum makecache   #设置缓存

5、然后再执行 使用 yum 包管理工具安装一些必要的工具和库。

命令:

复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2

2、添加阿里云的 Docker 软件仓库(镜像源)

命令:

复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

3、yum 安装 Docker 相关的核心软件包。

命令:

复制代码
yum install docker-ce docker-ce-cli containerd.io -y 

4、启动 Docker 服务。

命令:

复制代码
systemctl start docker

5、设置 Docker 服务开机自动启动。

复制代码
systemctl enable docker

6、查看 Docker 版本信息。

命令:

复制代码
docker version

7、Docker常用命令

docker ps 查看当前运行中的容器

docker images 查看镜像列表

docker rm container-id 删除指定 id 的容器

docker stop/start container-id 停止/启动指定 id 的容器

docker rmi image-id 删除指定 id 的镜像

docker volume ls 查看 volume 列表

docker network ls 查看网络列表

docker ps -a 查看所有 Docker 容器的状态(包括停止的容器)。

CONTAINER ID:容器的唯一标识符。

IMAGE:容器所基于的镜像。

COMMAND:容器启动时执行的命令。

CREATED:容器的创建时间。

STATUS:容器的当前状态(运行中或已停止)。

PORTS:容器暴露的端口和主机的端口映射关系。

NAMES:容器的名称,用于容器的引用和管理。

8、修改Docker镜像源(国外镜像源被屏蔽)

通过 tee 命令将指定的 JSON 配置写入到 Docker 的配置文件 /etc/docker/daemon.json 中,用于配置 Docker 使用一个自定义的镜像加速器。

|-----------|-------------------------------------------------------------------------------------------------------------------------------------|----------|------------|
| 镜像源名称 | 镜像源地址 | 特点 | 适用场景 |
| 阿里云 | https://registry.cn-hangzhou.aliyuncs.com | 稳定性好,速度快 | 企业/个人通用 |
| 腾讯云 | https://ccr.ccs.tencentyun.com | 企业级,可靠性高 | 腾讯云用户/企业环境 |
| 中科大 | https://docker.mirrors.ustc.edu.cn | 教育网友好,免费 | 教育网/学术机构 |
| 网易 | https://hub-mirror.c.163.com | 老牌镜像源 | 个人开发/测试环境 |
| 百度云 | https://mirror.baidubce.com | 国内访问快 | 百度云用户/国内项目 |
| 华为云 | https://swr.cn-north-1.myhuaweicloud.com | 企业级服务 | 华为云用户/生产环境 |
| DaoCloud | https://daocloud.io | 专业容器服务 | 容器化专业需求 |
| 时速云 | https://hub.tenxcloud.com | 容器云服务优化 | 企业级容器平台 |
| 七牛云 | https://reg-mirror.qiniu.com | CDN加速 | 需要高速下载的场景 |

毫秒镜像 - 告别蜗牛速度!国内极速拉取 | 国内专业的镜像仓库解决方案商 | 1ms.run

1、在根目录下执行下面命令:

复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ccr.ccs.tencentyun.com",
"https://docker.1ms.run",
"https://daocloud.io"]
}
EOF

2、重新加载 systemd 的配置文件。

命令:

复制代码
systemctl daemon-reload

3、重新启动 Docker 服务。

复制代码
systemctl restart docker

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

  • Docker 客户端(Client) : Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
  • Docker 主机(Host) :一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

Dockerfile

Dockerfile 是一个文本文件,其中包含了若干个命令,用户可以调用这些命令来构建一个镜像。通过这个文件,开发者能够定义应用程序运行环境的所有细节,从基础操作系统的选择到需要安装的软件包,再到启动服务所需的配置。

Dockerfile 不仅是自动化构建的基础,也是实现持续集成和持续部署(CI/CD)流程的关键组成部分。它使得开发团队能够在一致的环境中开发、测试和部署应用,从而减少"在我机器上能跑"的问题。此外,Dockerfile 促进了微服务架构的发展,让每个服务都可以独立打包成容器,易于管理和扩展。

一个典型的Dockerfile包含以下部分:

  1. 基础镜像指定
  2. 维护者信息(可选)
  3. 镜像构建指令
  4. 容器启动时执行的命令

常用指令详解

1. FROM

指定基础镜像,必须为第一条指令

复制代码
FROM centos:7  # 使用CentOS 7
# 或者
FROM centos:8  # 使用CentOS 8
# 或者
FROM centos:stream8  # 使用CentOS Stream 8
2. RUN

执行命令并创建新的镜像层,常用于安装软件包

复制代码
# 安装必要的软件包
RUN yum -y update && \
    yum -y install epel-release && \
    yum -y install \
        nginx \
        python3 \
        git \
        && \
    yum clean all && \
    rm -rf /var/cache/yum
3. COPY

将文件从构建上下文复制到镜像中

复制代码
COPY ./app /app
COPY requirements.txt /tmp/
4. ADD

类似COPY,但功能更多(支持URL和解压)

复制代码
ADD https://example.com/file.tar.gz /tmp/
ADD file.tar.gz /tmp/  # 会自动解压
5. CMD

指定容器启动时默认执行的命令

复制代码
CMD ["python", "app.py"]
CMD ["/bin/bash"]
6. ENTRYPOINT

配置容器启动时运行的命令,与CMD配合使用

复制代码
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g", "daemon off;"]
7. ENV

设置环境变量

复制代码
ENV PYTHON_VERSION=3.8
ENV PATH=/usr/local/bin:$PATH
8. ARG

定义构建时的变量

复制代码
ARG VERSION=latest
FROM busybox:$VERSION
9. WORKDIR

设置工作目录

复制代码
WORKDIR /app
10. EXPOSE

声明容器运行时监听的端口

复制代码
EXPOSE 80
EXPOSE 443
11. VOLUME

创建挂载点

复制代码
VOLUME /data
12. USER

指定运行时的用户

复制代码
USER nobody

Dockerfile部署SpringBoot+VUE项目

SpringBoot项目部署

Dockerfile 部署 template-admin.jar 的 完整步骤指南

准备文件结构

将Dockerfile文件和template-admin.jar放到同一目录下

复制代码
# 使用 CentOS 7 作为基础镜像
FROM centos:7

# 维护者信息
LABEL maintainer="yourname@example.com"

# 修复镜像源步骤
RUN mkdir /etc/yum.repos.d/backup && \
    mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/ && \
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/CentOS-Base.repo && \
    yum clean all && \
    yum makecache

# 安装OpenJDK 8和基础工具
RUN yum update -y && \
    yum install -y \
       java-1.8.0-openjdk-devel \
       wget \
       unzip \
    && \
    yum clean all && \
    rm -rf /var/cache/yum

# 设置Java环境变量
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
ENV PATH $PATH:$JAVA_HOME/bin

# 创建应用目录
RUN mkdir -p /app
WORKDIR /app

# 复制JAR文件
COPY template-admin.jar /app/app.jar

# 创建非root用户运行
RUN groupadd -r appuser && \
    useradd -r -g appuser appuser && \
    chown -R appuser:appuser /app
USER appuser

# 暴露端口
EXPOSE 8080

# 健康检查
#HEALTHCHECK --interval=30s --timeout=3s \
#    CMD curl -f http://localhost:8080/actuator/health || exit 1

# 启动命令
ENTRYPOINT ["java", "-server", "-Xms256m", "-Xmx512m", "-XX:+UseG1GC", "-jar", "app.jar"]
构建 Docker 镜像

在包含 Dockerfile 的目录下执行:

复制代码
docker build -t template-admin:1.0 . 
  • -t template-admin:1.0:给镜像打标签(名称:版本)
  • 末尾的 . 表示使用当前目录的 Dockerfile
复制代码
# 宿主机创建目录
mkdir -p /data/ruoyi/logs && chmod -R 777 /data/ruoyi/logs

# 启动容器
docker run -d \
  -p 8080:8080 \
  -v /data/ruoyi/logs:/home/ruoyi/logs \
  --name myapp \
  template-admin:1.0

VUE项目部署

Dockerfile文件

dist是打包后的文件

复制代码
# 直接使用 Nginx 作为基础镜像
FROM nginx:alpine

# 删除默认配置(可选)
RUN rm /etc/nginx/conf.d/default.conf

# 复制静态文件
COPY dist /usr/share/nginx/html

# 复制自定义 Nginx 配置
COPY nginx.conf /etc/nginx/conf.d/

# 暴露端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

server {
    listen 80;
    server_name localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;  # 支持 Vue 路由 history 模式
    }

    # 处理 API 代理(解决跨域)
    location /prod-api/ {
        proxy_pass http://192.168.1.167:8080/;  # 替换为你的后端地址
        proxy_set_header Host $host;
    }
}

# 构建镜像
docker build -t vue2-app .

# 运行容器
docker run -d -p 80:80 --name vue2-container vue2-app

Docker-Compose

Docker-Compose 是 Docker 官方提供的用于定义和运行多容器 Docker 应用程序的工具。它允许您使用 YAML 文件来配置应用程序的服务、网络和卷等,然后通过一个简单的命令就能创建并启动所有服务。

Docker-Compose 核心概念

  1. 服务 (Service):一个容器化的应用,可以包含一个或多个相同镜像的容器实例
  2. 项目 (Project):由一组关联服务组成的完整应用,默认使用所在目录名作为项目名
  3. 卷 (Volume):用于数据持久化
  4. 网络 (Network):定义服务间的通信方式

Docker-Compose 文件结构

典型的 docker-compose.yml 文件包含以下部分:

  • version:指定 compose 文件格式版本
  • services:定义各个服务
  • networks:定义网络
  • volumes:定义卷

Docker-Compose安装

使用 pip 安装(需先安装 pip)
复制代码
# 安装编译工具链
sudo yum install -y gcc python3-devel openssl-devel libffi-devel make
sudo yum install rust cargo
sudo yum install python3-devel gcc openssl-devel libffi-devel
pip3 install --upgrade pip setuptools wheel
# 安装 pip(如未安装)
sudo yum install python3-pip -y  # CentOS/RHEL
sudo apt install python3-pip -y  # Ubuntu/Debian

# 使用清华源安装
sudo pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple

# 验证安装
docker-compose --version
复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose --version

Docker-Compose 基本命令

复制代码
# 1. 启动服务(构建镜像、创建容器、启动服务)
# -d 表示在后台运行(detached mode)
docker-compose up -d

# 2. 停止并移除容器、网络、卷和镜像
# --volumes 同时删除在 compose 文件中声明的命名卷
# --rmi all 删除所有服务使用的镜像
docker-compose down --volumes --rmi all

# 3. 列出项目中的所有容器
# 显示状态、端口映射等信息
docker-compose ps

# 4. 查看服务日志
# -f 持续跟踪日志输出(类似 tail -f)
# service_name 可指定查看特定服务的日志
docker-compose logs -f service_name

# 5. 构建或重新构建服务镜像
# --no-cache 构建时不使用缓存
docker-compose build --no-cache

# 6. 在运行中的容器中执行命令
# service_name 服务名称
# command 要执行的命令(如 /bin/bash)
docker-compose exec service_name command

# 7. 启动已存在的服务容器
docker-compose start

# 8. 停止运行中的服务容器(不删除)
docker-compose stop

# 9. 重启服务容器
docker-compose restart

# 10. 暂停服务容器
docker-compose pause

# 11. 恢复暂停的服务容器
docker-compose unpause

# 12. 拉取服务依赖的镜像
docker-compose pull

# 13. 推送服务镜像到仓库
docker-compose push

# 14. 运行一次性命令(会启动新容器执行命令后退出)
# 常用于数据库迁移等操作
docker-compose run service_name command

# 15. 查看服务配置
# 显示最终生效的配置(合并了环境变量等)
docker-compose config

# 16. 查看镜像信息
docker-compose images

# 17. 删除已停止的服务容器
docker-compose rm

# 18. 查看容器内运行的进程
docker-compose top

# 19. 强制重新创建容器(即使配置未更改)
# --no-deps 不重新创建依赖的服务
docker-compose up --force-recreate --no-deps service_name

# 20. 缩放服务实例数量
# 注意:要在 compose 文件中移除 ports 配置才能缩放
docker-compose up --scale service_name=3 -d

# 21. 查看网络信息
docker-compose network ls

# 22. 查看卷信息
docker-compose volume ls

# 23. 检查服务运行状态
docker-compose port service_name port_number

# 24. 复制文件从容器到主机
docker-compose cp container_name:/path/to/file /host/path

# 25. 使用不同的 compose 文件
# -f 指定 compose 文件(默认使用 docker-compose.yml)
# -p 指定项目名称(默认使用目录名)
docker-compose -f docker-compose.prod.yml -p my_project up -d

Docker-Compose 部署 SpringBoot + Vue 完整指南

复制代码
project/
├── backend/                  # SpringBoot 后端
│   ├── Dockerfile            # 后端Dockerfile
│   └── template-admin.jar    # SpringBoot jar包
├── frontend/                 # Vue 前端
│   ├── Dockerfile            # 前端Dockerfile
│   ├── dist/                 # Vue打包后的静态文件
│   └── nginx.conf            # Nginx配置文件
└── docker-compose.yml        # 主配置文件

version: '3.8'

services:
  backend:
    build: ./backend
    container_name: template-admin
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /data/ruoyi/logs:/home/ruoyi/logs
    environment:
      - TZ=Asia/Shanghai
    #   - SPRING_PROFILES_ACTIVE=prod
    # healthcheck:
    #   test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
    #   interval: 30s
    #   timeout: 10s
    #   retries: 3
    networks:  # 添加这部分
      - app-network

  frontend:
    build: ./frontend
    container_name: template-ui
    restart: always
    ports:
      - "80:80"
    depends_on:
      - backend
    environment:
      - TZ=Asia/Shanghai
    networks:  # 添加这部分
      - app-network

volumes:
  ruoyi-logs:
    driver: local


networks:
  app-network:
    driver: bridge
1、 准备工作

确保服务器已安装 Docker 和 Docker-Compose

复制代码
docker --version
docker-compose --version

创建日志目录并设置权限

复制代码
sudo mkdir -p /data/ruoyi/logs
sudo chmod -R 777 /data/ruoyi/logs
2、 构建并启动服务

进入项目目录

复制代码
cd /path/to/project

构建并启动所有服务

复制代码
docker-compose up -d --build

查看服务状态

复制代码
docker-compose ps

查看日志

复制代码
docker-compose logs -f

3、 常用管理命令

停止服务

复制代码
docker-compose down

重启服务

复制代码
docker-compose restart

更新前端(重新构建并部署)

复制代码
docker-compose up -d --build frontend

更新后端(重新构建并部署)

复制代码
docker-compose up -d --build backend

查看资源使用情况

复制代码
docker-compose stats
相关推荐
后台模板学习8 分钟前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
西瓜拿铁好喝11 分钟前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
一技安身12 分钟前
MySQL 8.4.13 LTS 通用二进制包(Linux免安装版)完整教程
linux·mysql·adb
学长毕设13 分钟前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
明天也要努力学习19 分钟前
深入理解 JVM 垃圾回收(GC)
java·jvm
代码派21 分钟前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移
xiaoye-duck22 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
golang学习记27 分钟前
IDEA 断点调试技巧:拖拽
java·ide·intellij-idea
fpcc27 分钟前
跟我学c++中级篇—streambuf在glog中的应用分析
开发语言·c++
Sayai28 分钟前
Flink 日志解析任务性能优化实战:正则/Grok 预编译、Guava 缓存权重陷阱与 ES 写入隔离
java·大数据·性能优化·flink·实时计算