Files
blog-press/docs/DevOps/Docker.md
2026-01-06 19:57:45 +08:00

375 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Docker简介和安装
date: 2025-12-15
isGreat: true
---
# 一、Docker简介
## 1.1 基础概念
### 1.1.1 Docker概念
  Docker是一个开源的应用容器引擎可以让开发者将应用和依赖打包到一个轻量级、可移植的容器中然后部署到任何流行的Linux或Windows机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口。
  虚拟机和Docker的主要区别**服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。**
![虚拟机](./images/虚拟机.png)
![docker](./images/docker.png)
  传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
| 特性| 容器| 虚拟机 |
| :---: | :---: | :---: |
| 启动 | 秒级 | 分钟级 |
| 硬盘使用 | 一般为 `MB` | 一般为 `GB` |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |
### 1.1.2 Docker镜像——Image
  Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的**程序、库、资源、配置**等文件外,还包含了一些为运行时准备的一些**配置参数**(如匿名卷、环境变量、用户等)。**镜像不包含任何动态数据**,其内容在构建之后也不会被改变。
### 1.2.3 Docker容器——Container
  镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类``实例` 一样,**镜像是静态的定义,容器是镜像运行时的实体**。容器可以被创建、启动、停止、删除、暂停等。
  **容器的实质是进程**,但与直接在宿主执行的进程不同,**容器进程运行于属于自己的独立的**[命名空间(opens new window)](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
  容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
  按照 Docker 最佳实践的要求,**容器不应该向其存储层内写入任何数据**,容器存储层要保持无状态化。**所有的文件写入操作都应该使用数据卷Volume、或者绑定宿主目录**,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
  数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
### 1.2.4 Docker仓库——Registry
  一个 Docker Registry 中可以包含多个仓库Repository每个仓库可以包含多个标签Tag每个标签对应一个镜像。
&emsp;&emsp;一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。
&emsp;&emsp;最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry。
# 二、Docker安装
1. 安装依赖
```bash
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
```
2. 添加 GPG 密钥
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
&emsp;&emsp;也可以使用阿里云Docker镜像
```bash
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
```
3. 添加Docker软件源
```bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```
&emsp;&emsp;阿里云Docker镜像
```bash
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
```
4. 安装Docker
```bash
sudo apt-get install docker-ce
```
::: tip
也可以通过sudo apt install docker.io安装Ubuntu指定版本的docker
docker-ce是官方仓库docker.io是Ubuntu仓库
:::
5. 配置Docker镜像服务
&emsp;&emsp;1⃣登录阿里云账号在**容器镜像服务->镜像工具->镜像加速器**中找到**加速器地址**。
&emsp;&emsp;2⃣在/etc/docker中新建文件 daemon.json
```json
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
```
::: tip
或者使用1ms.docker作为Docker镜像源 "https://docker.1ms.run"
:::
&emsp;&emsp;3⃣执行命令
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
# 三、Portainer安装
## 3.1 简介
&emsp;&emsp;[Portainer](https://www.portainer.io/) 是一个开源的轻量级Docker管理界面提供直观的图形化用户界面支持快速部署、操作和监控Docker容器、镜像、服务等。
&emsp;&emsp;Portainer提供用户管理、权限控制、容器生命周期管理、镜像操作、服务堆栈管理等功能。支持多节点管理和面板化展示。
## 3.2 安装
&emsp;&emsp;拉取镜像:`docker pull portainer/portainer-ce`
## 3.3 启动
&emsp;&emsp;启动容器:`docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /dockerData/portainer:/data --restart=always --name portainer portainer/portainer-ce:latest`
## 3.4 运行
&emsp;&emsp;在浏览器中输入`127.0.0.1:9090`即可访问Portainer管理系统。
# 四、Docker基础命令
| 功能分类 | 命令功能 | 具体命令及示例 |
|------------------|--------------------------|-------------------------------------|
| **Docker环境** | 查看版本信息 | `docker version` |
| | 查看系统信息 | `docker info` |
| | 启动Docker服务Linux | `sudo systemctl start docker` |
| | 停止Docker服务Linux | `sudo systemctl stop docker` |
| | 重启Docker服务Linux | `sudo systemctl restart docker` |
| | 设置开机自启Linux | `sudo systemctl enable docker` |
| **镜像操作** | 搜索镜像Docker Hub | `docker search nginx` |
| | 拉取镜像(最新版) | `docker pull nginx` |
| | 拉取镜像(指定版本) | `docker pull nginx:1.24.0` |
| | 查看本地镜像 | `docker images` |
| | 删除镜像 | `docker rmi nginx:1.24.0` |
| | 删除悬空镜像 | `docker image prune` |
| | 删除所有未用 | `docker image prune -a` |
| | 构建镜像 | `docker build -t mynginx:v1 .`当前目录Dockerfile |
| | 保存镜像 | `docker save -o nginx.tar nginx:1.24.0` |
| | 加载镜像 | `docker load -i nginx.tar` |
| **容器操作** | 创建并启动容器 | `docker run -d --name mynginx -p 80:80 nginx` |
| | 查看运行中容器 | `docker ps` |
| | 查看所有容器(含停止) | `docker ps -a` |
| | 启动已停止容器 | `docker start mynginx` |
| | 停止运行中容器 | `docker stop mynginx``docker kill mynginx` |
| | 重启容器 | `docker restart mynginx` |
| | 进入运行中的容器 | `docker exec -it mynginx /bin/bash` |
| | 查看容器日志 | `docker logs mynginx` |
| | 删除容器 | `docker rm mynginx``docker rm -f mynginx`|
| | 清理所有停止的容器 | `docker container prune` |
| | 查看容器详情 | `docker inspect mynginx` |
# 五、Docker Compose
## 5.1 安装
1. 从Github官网下载[Docker Compose](https://github.com/docker/compose)相应版本
2. 将文件保存至/usr/local/bin/docker-compose可执行目录
3. 赋予执行权限:
```bash
sudo chmod +x /usr/local/bin/docker-compose
```
4. 验证安装:
```bash
docker compose version
```
::: tip
也可以通过sudo apt-get install docker-compose-plugin安装Ubuntu指定版本
:::
## 5.2 YAML文件
```yaml
version: '3.8'
services:
# Spring Boot 后端服务
backend:
container_name: springboot-backend
image: springboot-app:latest
restart: unless-stopped
# 添加 host.docker.internal 映射
extra_hosts:
- "host.docker.internal:host-gateway"
# 环境变量配置
environment:
- SERVER_PORT=8080
# 端口映射(前面为宿主机端口,后面为容器端口)
ports:
- "8080:8080"
# 数据卷挂载(前面为宿主机目录,后面为容器目录)
volumes:
- ./backend/logs:/app/logs
# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
# 网络配置
networks:
- app-network
# 资源限制
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
reservations:
memory: 512M
cpus: '0.5'
# Vue3 Vite 前端服务
frontend:
container_name: vue-frontend
image: vue-app:latest
restart: unless-stopped
# 添加 host.docker.internal 映射
extra_hosts:
- "host.docker.internal:host-gateway"
# 端口映射
ports:
- "80:80"
# 依赖后端
depends_on:
backend:
condition: service_healthy
# 网络
networks:
- app-network
# 资源限制
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
# 网络定义
networks:
app-network:
driver: bridge
```
## 5.3 命令
```bash
# 1. 启动服务
docker compose up -d
# 2. 查看服务状态
docker compose ps
# 3. 查看日志
docker compose logs -f
# 4. 进入容器
docker compose exec backend bash
# 5. 停止服务
docker compose down
# 6. 重启服务
docker compose restart
# 7. 查看配置
docker compose config
# 8. 构建镜像
docker compose build
# 9. 执行命令
docker compose exec backend ls -la
# 10. 清理资源
docker compose down -v
docker system prune -f
```
# 六、Dockerfile
&emsp;&emsp;Dockerfile 是用来构建 Docker 镜像的文本文件,包含了一系列构建指令,可以自动化地创建包含应用及其运行环境的镜像。
&emsp;&emsp;基本结构:
```dockerfile
# 基础镜像
FROM 镜像名:标签
# 维护者信息
LABEL maintainer="name@email.com"
# 设置工作目录
WORKDIR /app
# 复制文件
COPY 源路径 目标路径
# 执行命令
RUN 命令
# 暴露端口
EXPOSE 端口
# 容器启动命令
CMD ["可执行文件", "参数1", "参数2"]
```
&emsp;&emsp;典型示例
::: code-group
```dockerfile [nginx]
FROM nginx:1.27.0
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
```
```dockerfile [SpringBoot]
FROM openjdk:11-jdk
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ENTRYPOINT java $JAVA_TOOL_OPTIONS -jar /app.jar $0 $@
```
```dockerfile [FastApi]
FROM python:3.12-slim
WORKDIR /app
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
COPY ./packages /app/packages
COPY requirements.txt /app/
RUN pip install --no-cache-dir --no-index --find-links=/app/packages -r requirements.txt
COPY . /app/
EXPOSE 8082
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8082"]
```
```dockerfile [dotnet]
FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-alpine
WORKDIR /app
COPY publish/ .
RUN chmod +x EMMessageHubServer
EXPOSE 5000
EXPOSE 14040
ENTRYPOINT ["./EMMessageHubServer"]
```
:::
# 七、Docker开发流程
1. 编写业务代码
2. 编译打包项目工程
3. 编写Dockerfile文件
4. 根据Dockerfile文件和项目打包代码创建Docker镜像标注镜像名称和版本
5. 编写Docker Compose文件
6. 执行Docker Compose启动命令
7. 查看Docker Container状态
# 八、参考资料
1. [Docker — 从入门到实践](https://github.com/yeasy/docker_practice?tab=readme-ov-file)
2. [Docker完整项目的部署](https://blog.csdn.net/qq_71654538/article/details/136520075)