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 使用一个自定义的镜像加速器。
镜像源名称 |
镜像源地址 |
特点 |
适用场景 |
阿里云 |
稳定性好,速度快 |
企业/个人通用 |
|
腾讯云 |
企业级,可靠性高 |
腾讯云用户/企业环境 |
|
中科大 |
教育网友好,免费 |
教育网/学术机构 |
|
网易 |
老牌镜像源 |
个人开发/测试环境 |
|
百度云 |
国内访问快 |
百度云用户/国内项目 |
|
华为云 |
企业级服务 |
华为云用户/生产环境 |
|
DaoCloud |
专业容器服务 |
容器化专业需求 |
|
时速云 |
容器云服务优化 |
企业级容器平台 |
|
七牛云 |
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. 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 核心概念
- 服务 (Service):一个容器化的应用,可以包含一个或多个相同镜像的容器实例
- 项目 (Project):由一组关联服务组成的完整应用,默认使用所在目录名作为项目名
- 卷 (Volume):用于数据持久化
- 网络 (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