当前位置: 首页 > news >正文

Docker--docker的学习

一、什么是 Docker?

Docker 是一个轻量级容器化平台,可以将应用和其依赖打包在一个标准化的“容器”中,做到“一次构建,到处运行”。

✅ 优势:

  • 快速部署:容器启动快,秒级响应

  • 环境一致:本地、测试、生产一模一样

  • 节省资源:多个容器共享宿主机内核,资源占用小

  • 易于扩展:结合 CI/CD、K8s 实现自动化部署与扩容


二、核心概念

名称说明
镜像 (Image)应用及其依赖的只读模板,如 .iso 文件
容器 (Container)镜像的运行实例,可读写,彼此隔离
仓库 (Registry)存储镜像的地方,如 DockerHub 或私有 Harbor
Dockerfile构建镜像的脚本
Docker Compose管理多个容器的配置工具,使用 docker-compose.yml 文件


三、Docker 安装

✅ Linux以 CentOS 7 为例)

# 卸载旧版本(可选)
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2# 添加官方 Docker 仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装最新版 Docker CE
yum install -y docker-ce docker-ce-cli containerd.io# 启动 Docker
systemctl start docker# 设置开机自启
systemctl enable docker# 查看版本
docker --version

✅ Windows / Mac

推荐使用 Docker Desktop,下载安装即可(需开启 WSL2 或 Hyper-V)。


四、常用命令

🔍 镜像相关

docker images                # 查看本地镜像
docker pull nginx            # 拉取镜像
docker rmi nginx             # 删除镜像

🚀 容器相关

docker ps                    # 查看正在运行的容器
docker ps -a                 # 查看所有容器
docker run -d -p 8080:80 nginx       # 后台运行 nginx 容器
docker run -it ubuntu /bin/bash     # 交互式运行
docker stop <容器ID>         # 停止容器
docker rm <容器ID>           # 删除容器

📦 构建与执行

docker build -t myapp .      # 当前目录下 Dockerfile 构建镜像
docker exec -it <容器ID> bash  # 进入容器内部

五、Dockerfile:构建镜像模板

📄 示例:Spring Boot构建镜像模应用

# 使用 Java 基础镜像
FROM openjdk:17# 作者信息
MAINTAINER 程子强 <example@example.com># 创建并进入应用目录
WORKDIR /app# 将 jar 包复制到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar# 暴露应用端口
EXPOSE 8080# 容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

构建并运行:

docker build -f DockerfileApp -t boyatop-member:1 .
docker run -p 3000:3000 boyatop-member===========解释==================
第一个:docker build -f DockerfileApp -t boyatop-member:1 .
参数	                作用
docker build	        Docker 镜像构建命令
-f DockerfileApp	    指定用来构建的 Dockerfile 文件是当前目录下的 DockerfileApp(自定义名称)
-t boyatop-member:1	    给构建出来的镜像打标签(tag),名字是 boyatop-member,版本号是 1
.	                    构建上下文路径,表示将当前目录所有文件发送给 Docker 构建进程第二个:docker run -p 3000:3000 boyatop-member
参数	         作用
docker run	     启动一个新的容器
-p 3000:3000	 端口映射,把宿主机的 3000 端口映射到容器的 3000 端口,方便外部访问容器服务
boyatop-member	 运行镜像名为 boyatop-member 的镜像(默认启动最新版本

六、Docker Compose:多容器编排工具

用于同时运行数据库、Redis、Web服务等多个容器。

📄 示例:SpringBoot + MySQL + Redis

version: '3.8'
services:app:build: .ports:- "8080:8080"depends_on:- db- redisdb:image: mysql:8restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: testdbports:- "3306:3306"redis:image: redis:alpineports:- "6379:6379"

运行:

docker-compose up -d   # 后台启动
docker-compose down    # 停止并移除容器

七、数据持久化与挂载

📁 数据卷挂载:

docker run -v /host/path:/container/path -d nginx
  • 宿主机的 /host/path 会映射到容器内 /container/path

  • 数据卷也可使用 docker volume 管理


八、网络管理

docker network ls                    # 查看网络
docker network create mynet         # 创建网络
docker run --network=mynet ...      # 使用网络

九、实战项目案例:部署 Spring Boot 应用

  1. 项目结构:

    myapp/
    ├── Dockerfile
    ├── target/myapp.jar
    └── docker-compose.yml
    
  2. Dockerfile

    FROM openjdk:17
    COPY target/myapp.jar app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
  3. docker-compose.yml

    version: '3'
    services:myapp:build: .ports:- "8080:8080"depends_on:- mysqlmysql:image: mysql:8environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbports:- "3306:3306"
    
  4. 构建并运行:

docker-compose up -d

十、常见问题与排查

问题原因解决方案
容器启动后立刻退出没有运行主进程确保 CMDENTRYPOINT 正确
端口无法访问映射端口未配置-p 参数
文件修改无效镜像未重新构建重新构建 docker build

十一、Dockerfile 与 Docker Compose进一步讲解

11.1  Dockerfile 是什么?

  • Dockerfile 是一个用于构建 Docker 镜像的脚本文件

  • 里面包含了一条条的构建指令,每条指令用于定义镜像的一部分内容。

  • Docker 根据 Dockerfile 生成自定义镜像。

📌 作用:构建镜像的配方,自动化构建。


11.2  Docker Compose 是什么?

  • Docker Compose 是 Docker 提供的一个容器编排工具

  • 使用 YAML 文件来定义和管理多个容器服务,例如 Web 服务 + 数据库。

  • 一条命令即可启动所有服务(docker-compose up)。

📌 作用:统一管理和运行多个容器服务,常用于微服务项目。


11.3、Dockerfile 详解

        (1) Dockerfile 常见指令说明
指令含义
FROM指定基础镜像(如:FROM openjdk:17
MAINTAINER镜像维护者信息(非必须)
COPY将文件从主机复制到镜像中
ADD类似于 COPY,但支持自动解压压缩包和网络地址
RUN在镜像内执行命令(常用于安装依赖)
WORKDIR设置工作目录
EXPOSE声明容器对外暴露的端口
CMD容器启动时执行的默认命令
ENTRYPOINT容器启动时的主命令,可以与 CMD 结合使用
ENV设置环境变量
        (2) Dockerfile 示例(Java Spring Boot 项目)
# 使用 Java 基础镜像
FROM openjdk:17# 作者信息
MAINTAINER 程子强 <example@example.com># 创建并进入应用目录
WORKDIR /app# 将 jar 包复制到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar# 暴露应用端口
EXPOSE 8080# 容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

代码解释

1.# 使用 Java 基础镜像===================
FROM openjdk:17
作用:指定构建镜像所基于的基础镜像,这里使用的是带有 Java 17 环境的官方镜像 openjdk:17。
这意味着镜像里已经预装了 Java 17 运行环境,方便你直接运行 Java 应用。2.# 作者信息=======================
MAINTAINER 程子强 <example@example.com>
作用:标明镜像作者和联系方式,属于元数据,方便识别镜像归属。
这条指令现在官方推荐用 LABEL maintainer="..." 来替代,但 MAINTAINER 依然可用。3.# 创建并进入应用目录=============
WORKDIR /app
作用:设置工作目录为 /app。
后续所有命令(如复制文件、执行命令)都将在 /app 目录下执行。
如果目录不存在,会自动创建。4.# 将 jar 包复制到容器中=========================
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
作用:将宿主机(你本地项目目录)中的 target/demo-0.0.1-SNAPSHOT.jar 文件复制到镜像的当前工作目录 /app 下,命名为 app.jar。
这是把打包好的 Java 应用放到容器中,方便运行。5.# 暴露应用端口===========================
EXPOSE 8080
作用:声明容器内部应用监听的端口是 8080。
这只是告诉 Docker 这个端口会被用到,并不会自动发布端口给宿主机。
你需要启动容器时用 -p 宿主机端口:8080 映射端口,才能从外部访问。6.# 容器启动时运行的命令===============================
ENTRYPOINT ["java", "-jar", "app.jar"]
作用:设置容器启动时默认执行的命令。
这里表示:运行 java -jar app.jar,即启动你的 Java 应用。
ENTRYPOINT 用 JSON 数组格式写,保证命令和参数准确,不经过 shell 解析,避免特殊字符出错。

📝 说明:

  • FROM 指定了基础镜像。

  • WORKDIR /app 会在容器中创建并切换到 /app 目录。

  • COPY 是将打包好的 jar 文件复制到容器内。

  • EXPOSE 8080 告诉 Docker 这个服务会监听 8080 端口。

  • ENTRYPOINT 启动容器时执行 java -jar app.jar 命令。


🧩 11.4 Docker Compose 详解

 (1)  Docker Compose YAML 文件结构
version: '3'   # 使用的 compose 文件版本
services:      # 服务列表web:         # 服务名为 webimage: nginx:latestports:- "8080:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: testdbports:- "3306:3306"

📝 说明:

  • version:YAML 文件版本,一般用 3。

  • services:定义多个服务,支持多个容器。

  • image:使用的镜像名或自定义镜像。

  • ports:端口映射,格式为 主机端口:容器端口

  • environment:环境变量(如 MySQL 密码、数据库名等)。


 (2) 结合 Spring Boot 示例项目

目录结构:

.
├── docker-compose.yml
└── Dockerfile
Dockerfile:
FROM openjdk:17
WORKDIR /app
COPY target/demo.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.yml:
version: '3.8'
services:app:build: .ports:- "8080:8080"container_name: my-springboot-apprestart: always

📌 说明:

  • build: . 表示使用当前目录下的 Dockerfile 构建镜像。

  • restart: always 表示容器异常退出后会自动重启。


🚀 11.5、常用命令总结

(1)  Dockerfile 构建镜像并运行
# 构建镜像(注意最后的 . 表示当前目录)
docker build -t myapp:v1 .# 启动容器
docker run -d -p 8080:8080 --name my-running-app myapp:v1

(2)使用 docker-compose 启动多个服务
# 启动服务
docker-compose up -d# 停止并删除服务
docker-compose down# 查看运行的服务
docker-compose ps# 重启服务
docker-compose restart

11.6 一句话区分Dockerfile与Docker Compose

  • Dockerfile:用于定义一个镜像的构建方式(如何造一个容器)

  • Docker Compose:用于定义和管理多个容器的协作运行(怎么跑起来一组服务)


(1) 类比理解(最容易记住的方式)

假设你在做一个 Web 项目部署,部署包括:

  • 一个 Spring Boot 应用

  • 一个 MySQL 数据库

  • 一个 Redis 缓存

(2)那么:
  • Dockerfile 就像是:“怎么造出一个 Spring Boot 的运行容器”

  • Docker Compose 就像是:“一次性拉起 Spring Boot + MySQL + Redis 并配置好它们之间的关系”


📚 11.7、总结对比

对比项DockerfileDocker Compose
作用构建镜像管理多个容器
文件格式DockerfileYAML
是否支持容器编排❌ 不支持✅ 支持
是否用于生产部署✅ 是✅ 是(配合 Docker Swarm / Kubernetes)
http://www.dtcms.com/a/321442.html

相关文章:

  • Visual Studio 2019 + Qt + MySQL 开发调试全过程问题详解
  • 装配式建筑4.0:建筑工业化的智慧飞跃
  • 训练模型时梯度出现NAN或者inf
  • WiFi 核心概念与实战用例全解
  • git环境配置_笔记
  • [Linux]学习笔记系列 -- [arm[kernel]
  • modem上报SIM卡状态为unknown问题分析
  • 6_基于深度学习的火灾检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 控制建模matlab练习13:线性状态反馈控制器-②系统的能控性
  • #C语言——刷题攻略:牛客编程入门训练(六):运算(三)-- 涉及 辗转相除法求最大公约数
  • JAVA,Maven聚合
  • 【记录】yumdownloader 和 yum install --downloadonly
  • Linux线程概念
  • 一洽客服系统:APP路由等级与路由条件设置
  • FreeRTOS入门知识(初识RTOS)(二)
  • NOIP普及组|2000T1进制转换
  • Spring Boot + Angular 实现安全登录注册系统:全栈开发指南
  • GPT-5 来了:和它改变世界的 982 天
  • 存储管理、XFS 增量备份恢复、LVM
  • Unity_VR_Pico开发手册
  • 防火墙安全作用及 firewalld 交互、端口配置
  • 基于嵌入式Linux RK3568 qt 车机系统开发
  • 前端单元测试最佳实践(一)
  • Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具
  • ubuntu安装gpu驱动
  • 中国的超算中心使用情况如何?是否算力过剩
  • vscode 配置
  • STM32学习笔记5-TIM定时器-1
  • windows安装Docker Desktop报错One prerequisite is not fulfilled.
  • CVPR2025-DEIM改进项目介绍