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 应用
项目结构:
myapp/ ├── Dockerfile ├── target/myapp.jar └── docker-compose.yml
Dockerfile
:FROM openjdk:17 COPY target/myapp.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
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"
构建并运行:
docker-compose up -d
十、常见问题与排查
问题 原因 解决方案 容器启动后立刻退出 没有运行主进程 确保 CMD
或ENTRYPOINT
正确端口无法访问 映射端口未配置 加 -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、总结对比
对比项 Dockerfile Docker Compose 作用 构建镜像 管理多个容器 文件格式 Dockerfile YAML 是否支持容器编排 ❌ 不支持 ✅ 支持 是否用于生产部署 ✅ 是 ✅ 是(配合 Docker Swarm / Kubernetes)