欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > Docker学习笔记

Docker学习笔记

2025/9/23 15:53:28 来源:https://blog.csdn.net/weixin_43368992/article/details/147747166  浏览:    关键词:Docker学习笔记
Docker是开源应用容器引擎,让开发者可以将应用程序和所有依赖打包到一个轻量级可移植容器中。然后在任何支持Docker的环境中运行。

Docker核心概念:容器、镜像、Dockerfile和镜像仓库。

容器
一种轻量级的虚拟化技术,共享操作系统内核但保持独立的运行环境,比传统虚拟机更快速且占用资源少。

容器是Docker技术的核心运行单元,是一种轻量级的虚拟化技术实现方式。与传统虚拟机相比,容器不需要模拟完整的硬件环境,也不需运行独立的操作系统内核。容器在运行时与其他容器和宿住机共享操作系统内核。容器之间相互独立,每个容器都拥有自己的文件系统、网络和进程空间,应用之间不会互相干扰。

镜像
镜像是用于创建容器的模版,包含运行应用所需的代码、库和配置文件。

镜像是创建Docker容器的基础,用户可直接用现成镜像如从Docker Hub下载。镜像采用分层存储结构,每一层代表一个修改步骤。镜像中不包含任何的动态数据,构建后内容不再变动。

Dockerfile
一个写明了如何一步步构建镜像的文本文件,通过执行其中指令,Docker能自动生成镜像。

Dockerfile是用于定义镜像构建过程的脚本文件,由一系列指令组成,比如FROM指定基础镜像,RUN执行命令,COPY复制文件等,Docker根据Dockerfile的指令自动构建镜像。

镜像仓库
集中存储和分发镜像的地方。

Docker Hub是最常用的公共仓库,由官网和社区维护的镜像。可以基于镜像构建镜像。我们也可以搭建自己私有镜像库。
以上4个共同构成Docker的工作流程:
1、开发者编写Dockerfile定义环境,构建Docker镜像;
2、构建好的镜像推送到镜像仓库;
3、在支持Docker等机器上拉取镜像并运行容器。
虚拟机:通过Hypervisor软件模拟完整的硬件环境,管理每个虚拟机中操作系统的运行。每个虚拟机都需要独立的操作系统、应用程序和必要的依赖文件等,也因此启动速度较慢且占用大量内存和存储。

镜像使用

拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • OPTIONS(可选):选项参数。
    • –all-tags,-a:下载指定镜像的所有标签。
    • –disable-content-trust:跳过镜像签名验证。
  • NAME:镜像名称,通常含注册表地址如docker.io/library.ubuntu,不带注册表地址默认从Docker Hub进行拉取。
  • TAG(可选):镜像标签,默认为latest。
  • DIGEST(可选):镜像的SHA256摘要。
    例:下载最新nginx镜像docker pull nginx,下载某版本的nginx镜像docker pull nginx:1.0.0
镜像标签

用来标识和管理镜像版本的工具,每个镜像可以多个标签,可用于区分不同版本或不同环境。使用docker tag可以为镜像创建标签。
将本地nginx镜像标记为my-nginx:v1。

docker tag nginx:latest my-nginx:v1
推送镜像
docker push 
查看镜像

查看所有镜像列表:docker images nginx
查看指定镜像详细信息:docker inspect nginx
查看镜像构建的历史:docker history nginx

查找镜像

docker search

删除镜像

1、删除单个镜像
docker rmi 镜像ID|镜像名称
查找镜像ID:docker images
2、清除镜像缓存
docker image prune
不加标签时会只删除悬空镜像(没有标签且不被任何镜像引用的中间层)。加上-a参数会删除所有未被容器或镜像引用的镜像,包括构建缓存和旧版本镜像。
清理完成后可用docker system df查看磁盘使用情况。

私有仓库镜像

Docker Dockerfile

Dockerfile文件使用
用于构建Docker镜像的文本文件,其中包含一系列指令和配置,告诉Docker如何构建一个镜像。

使用Dockerfile可以自动构建镜像,在不同环境下都能得到一样的镜像。其中的指令可以指定用什么基础镜像、往镜像里放什么文件、安装什么软件、设置什么环境变量、打开什么端口、使用什么命令运行等等。每一条指令都在镜像里新建一层,所有层叠加在一起就是最终的镜像。
官方镜像虽然提供基础的运行环境,但是项目通常仍需要特定的配置、依赖和文件以及程序代码,所以我们需要用Dockerfule文件来定制自己的镜像。
以下是以web开发为例子,在nginx镜像基础上,添加自定义网页文件、修改配置文件和安装必要的工具等操作。
1、创建一个新的空白目录myweb。
2、在目录myweb下创建一个新的文本文件,命名为Dockerfile,并在文件中添加以下内容:

FROM nginx:lastest=》指定使用最新版nginx作为基础镜像
RUN echo '<h1>My Custom Nginx Page</h1>‘ > /usr/share/nginx/html/index.html=》将网页内容放到容器的nginx默认的网页目录中
EXPOSE 80=》声明容器使用80端口

3、在myweb目录下运行命令docker build -t my-web .进行自定义nginx镜像构建,-t my-web .是给新镜像命名为my-web,最后的点表示使用当前目录的Dockerfile。
查看新构建的镜像:docker images
4、运行docker run -d -p 80:80 my-web启动容器。表示容器内部端口80映射到外部80端口,访问主机的80端口就可以看到自定义的网页。

Dockerfle常用指令

镜像的元数据(Metadata)是描述镜像本身属性、结构、来源或使用方式的关键信息,类似于“关于镜像的说明手册”。

命令描述
FROM(常用)指定基础镜像,用于后续指令构建。
LABEL添加镜像的元数据,使用键值对的形式。
RUN创建镜像时,在镜像中要执行的命令。
CMD指定容器启动时默认要执行的命令(可以被覆盖)。如果执行 docker run 后面跟启动命令会被覆盖掉。
ENTRYPOINT设置容器创建时的主要命令(不可被覆盖)。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
EXPOSE声明容器运行时监听的特定网络端口。
ENV设置环境变量COPY将文件或目录复制到镜像中。
ADD将文件、目录或远程 URL 复制到镜像中。
WORKDIR指定工作目录VOLUME为容器创建挂载点或声明卷。
USER切换执行后续命令的用户和用户组,但这个用户必需首先已使用 RUN 的命令进行创建好了。
ARG定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。ONBUILD
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
FROM <image>[:<tag>] [AS <name>]
  • :必需,指定镜像基础名称
  • [:] :可选,指定镜像版本标签,默认latest
  • AS :可选
    示例:
FROM nginx:1.23
FROM python:3.9-alpine
FROM ubuntu:20.04 AS builder
FROM指令
FROM指令:用于指定基础镜像,必须是Dockerfile文件的第一个指令。可以是官方镜像也可以是用户自定义的镜像。如不指定标签默认使用latest。每个Dockerfile文件可以有多个FROM指令用于构建多阶段镜像,但是最后只会保留最后一个FROM生成的镜像层。基础镜像的选择直接影响最终镜像的大小和安全性,通常推荐官方维护的最小化镜像如alpine版本。最后的AS name是为新生成阶段指定名称(可选)。
# 阶段1:构建JAR
FROM maven:3.9.6-eclipse-temurin-17-alpine AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY src ./src
RUN mvn -DskipTests package
# 阶段2:生成运行镜像
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
HEALTHCHECK CMD curl -f http://localhost:8080/actuator/health || exit 1
# 多阶段构建示例
FROM eclipse-temurin:17-jdk-alpine AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpine
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
LABEL指令
LABEL指令:用于添加元数据到镜像,采用价值对格式。
LABEL <key>=<value>
#示例
LABEL version="1.0.1"
LABEL maintainer="admin@example.com"
RUN指令
RUN指令:在镜像构建过程中执行命令,每条RUN指令都会创建一个新的镜像层。RUN指令有两种格式,分别是shell格式(RUN <command>)和exec格式(RUN ["executable“,”param1“,”param2“])。shell格式默认使用/bin/sh/c执行,exec格式直接调用可执行文件。为了减少镜像层数,一般建议将多个命令合并到单个RUN命令中,使用&&连接命令,用\换行。

RUN指令格式及示例:

# Shell 格式
RUN <command># Exec 格式
RUN ["executable", "param1", "param2"]

示例

RUN yum -y install wget
RUN apt-get update && apt-get install -y \git \curl \&& rm -rf /var/lib/apt/lists/*
RUN ["/bin/bash", "-c", "echo Hello, Docker!"]
RUN ["yum", "-y", "install", "wget"]
CMD指令
CMD指令:指定容器使用时的默认命令,一个Dockerfile只能有一个有效的CMD指令。如果docker run指定了命令,CMD 会被覆盖。CMD 有三种格式:Exec 格式(推荐)、Shell 格式和作为 ENTRYPOINT 的参数。Exec 格式直接调用可执行文件,不经过 shell 处理环境变量;Shell 格式会通过 /bin/sh -c 执行。例如运行 Python 应用时可以使用 CMD ["python", "app.py"]。

指令格式:

CMD ["executable","param1","param2"]# Shell 格式
CMD command param1 param2# 作为 ENTRYPOINT 的参数
CMD ["param1","param2"]

示例

# Shell 格式示例: 运行 Python 脚本
CMD python app.py# Exec 格式示例: 运行 Nginx
CMD ["nginx", "-g", "daemon off;"]# 作为 ENTRYPOINT 参数
CMD ["--port=8080"]
EXPOCE指令
EXPOSE 指令:声明容器运行时监听的网络端口,只是文档性质的说明,不会实际发布端口。实际端口映射需要在运行容器时通过 -p 参数设置。EXPOSE 可以指定 TCP 或 UDP 协议,默认是 TCP。例如 EXPOSE 80/tcp 表示容器会监听 80 端口。这个指令主要作用是帮助使用者理解容器提供的服务端口,同时被一些编排工具如 Docker Compose 使用。

指令格式

EXPOSE <port> [<port>/<protocol>...]

示例

# 声明单个端口
EXPOSE 80
# 声明多个端口
EXPOSE 80 443
# 指定协议
EXPOSE 53/udp
COPY指令
COPY指令:将文件或目录从构建上下文复制到镜像中,源路径必须是相对路径(相对于 Dockerfile 所在目录),不能使用绝对路径或 ../ 父目录引用。目标路径可以是绝对路径或相对于 WORKDIR 的路径。COPY 会保留文件元数据(权限、时间戳),但不支持自动解压压缩包。与 ADD 指令相比,COPY 更推荐用于简单的文件复制操作,因为它的行为更可预测。例如复制项目代码到镜像的 /app 目录。

指令格式

COPY <src>... <dest>

示例

# 复制单个文件
COPY requirements.txt /app/
# 复制整个目录
COPY src /app/src
# 使用通配符复制多个文件
COPY *.sh /scripts/
USER指令
USER 指令:切换执行后续指令的用户身份,用户必须已通过 RUN 指令创建。例如 USER nobody 让后续命令以 nobody 身份运行,增强安全性。该用户需要有足够的权限访问所需文件。USER 会影响 RUN、CMD、ENTRYPOINT 的执行身份。在运行时可以通过 docker run -u 覆盖此设置。典型的用法是在安装软件包后创建非 root 用户并切换,避免容器以 root 权限运行。

格式

USER <user>[:<group>]

示例

RUN groupadd -r app && useradd -r -g app appuser
USER appuser
CMD ["python", "app.py"]
ADD指令
ADD指令:功能类似 COPY,但增加了自动解压压缩包和处理远程 URL 的能力。当源路径是本地压缩文件(如 .tar、.gz)时,ADD 会自动解压到目标路径。源路径也可以是 URL,Docker 会下载文件到镜像中。例如 ADD https://example.com/file.tar.gz /tmp 会下载并解压文件。由于 ADD 行为较复杂,官方建议优先使用 COPY,除非明确需要解压或下载功能。

指令格式

ADD <src>... <dest>

示例

# 添加本地文件
ADD app.jar /opt/app/
# 自动解压压缩包
ADD project.tar.gz /app
# 从 URL 下载文件
ADD https://example.com/data.json /data

以上内容均来自Datawhale,仅供本人学习使用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词