Files
blog-press/docs/DevOps/Docker.md
2025-12-16 10:41:54 +08:00

13 KiB
Raw Blame History

isGreat
isGreat
true

一、Docker简介

1.1 基础概念

1.1.1 Docker概念

Docker是一个开源的应用容器引擎可以让开发者将应用和依赖打包到一个轻量级、可移植的容器中然后部署到任何流行的Linux或Windows机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口。
虚拟机和Docker的主要区别服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。 虚拟机 docker

  传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

1.1.2 Docker镜像——Image

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

1.2.3 Docker容器——Container

  镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间(opens new window)。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
  容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
  按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作都应该使用数据卷Volume、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
  数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

1.2.4 Docker仓库——Registry

  一个 Docker Registry 中可以包含多个仓库Repository每个仓库可以包含多个标签Tag每个标签对应一个镜像。
  一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。
  最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry。

二、Docker安装

  1. 安装依赖
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  1. 添加 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

也可以使用阿里云Docker镜像

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  1. 添加Docker软件源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

阿里云Docker镜像

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  1. 安装Docker
sudo apt-get install docker-ce

::: tip 也可以通过sudo apt install docker.io安装Ubuntu指定版本的docker
docker-ce是官方仓库docker.io是Ubuntu仓库 :::

  1. 配置Docker镜像服务

1登录阿里云账号,在容器镜像服务->镜像工具->镜像加速器中找到加速器地址
2在/etc/docker中新建文件 daemon.json

{
  "registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}

::: tip 或者使用1ms.docker作为Docker镜像源 "https://docker.1ms.run" :::

3执行命令:

sudo systemctl daemon-reload
sudo systemctl restart docker

三、Portainer安装

3.1 简介

Portainer 是一个开源的轻量级Docker管理界面提供直观的图形化用户界面支持快速部署、操作和监控Docker容器、镜像、服务等。
Portainer提供用户管理、权限控制、容器生命周期管理、镜像操作、服务堆栈管理等功能。支持多节点管理和面板化展示。

3.2 安装

  拉取镜像:docker pull portainer/portainer-ce

3.3 启动

  启动容器: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 运行

  在浏览器中输入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 mynginxdocker kill mynginx
重启容器 docker restart mynginx
进入运行中的容器 docker exec -it mynginx /bin/bash
查看容器日志 docker logs mynginx
删除容器 docker rm mynginxdocker rm -f mynginx
清理所有停止的容器 docker container prune
查看容器详情 docker inspect mynginx

五、Docker Compose

5.1 安装

  1. 从Github官网下载Docker Compose相应版本
  2. 将文件保存至/usr/local/bin/docker-compose可执行目录
  3. 赋予执行权限:
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证安装:
docker compose version

::: tip 也可以通过sudo apt-get install docker-compose-plugin安装Ubuntu指定版本 :::

5.2 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 命令

# 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

Dockerfile 是用来构建 Docker 镜像的文本文件,包含了一系列构建指令,可以自动化地创建包含应用及其运行环境的镜像。
  基本结构:

# 基础镜像
FROM 镜像名:标签

# 维护者信息
LABEL maintainer="name@email.com"

# 设置工作目录
WORKDIR /app

# 复制文件
COPY 源路径 目标路径

# 执行命令
RUN 命令

# 暴露端口
EXPOSE 端口

# 容器启动命令
CMD ["可执行文件", "参数1", "参数2"]

  典型示例 ::: code-group

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
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 $@
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"]
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 — 从入门到实践
  2. Docker完整项目的部署