文章目录
- 前言
- 一、问题描述
- 二、具体内容
- 1. Docker 镜像原理
- 2. Docker 镜像制作
- 3. Dockerfile 概念
- Dockerfile 的基本结构:
- 4. Dockerfile 关键字
- 5. Docker 实战案例
- 5.1 基于 Nginx 构建 Web 服务器
- 6. 验证与总结
- 6.1 验证 Dockerfile
- 6.2 总结
前言
Docker 是一种轻量级的容器化技术,而 Docker 镜像是其核心组成部分之一。Dockerfile 作为构建镜像的脚本文件,定义了镜像的构建流程。掌握 Docker 镜像的原理、制作方法、Dockerfile 的关键字及实际案例,可以帮助我们更高效地管理和部署应用。
一、问题描述
在容器化应用的开发过程中,我们需要构建和管理 Docker 镜像,以便快速部署应用程序。但在实际使用 Docker 时,可能会遇到以下问题:
- Docker 镜像的工作原理是什么?
- 如何制作自定义 Docker 镜像?
- Dockerfile 是什么,它如何帮助构建镜像?
- Dockerfile 中有哪些关键指令?
- 如何使用 Docker 实现实际案例?
本篇文章将围绕这些问题展开详细解析。
二、具体内容
1. Docker 镜像原理
Docker 镜像是一个只读的模板,包含了运行容器所需的所有内容,如操作系统、应用程序及其依赖项等。Docker 镜像的底层采用 UnionFS(联合文件系统) 进行管理,它由多个只读层(Layer)组成,每一层代表 Dockerfile 中的一条指令。
Docker 镜像的特点:
- 分层存储:每个指令都会创建一个新层,减少冗余,提高构建效率。
- 写时复制(Copy-on-Write, CoW):容器运行时会创建一个可写层,避免修改基础镜像。
- 可复用性:相同的基础镜像可以被多个容器共享,减少存储开销。
2. Docker 镜像制作
Docker 镜像的制作方式主要有以下几种:
- 基于已有镜像修改并提交
# 将正在运行的容器 (<docker-id>) 保存为新的镜像 (<image-name:version>)
docker commit <docker-id> <image-name:version>
# 将 Docker 镜像 (<image-name:version>) 导出为一个 .tar 文件(可重命名为 .zip)
docker save -o <zipfile-name> <image-name:version>
# 从导出的 .tar 文件中加载 Docker 镜像
docker load -i <zipfile-name>
以tomcat
为例
首先,进入tomcat_app
容器:
docker start tomcat_app
docker exec -it tomcat_app /bin/bash
然后,在根目录下创建一个test
文件
cd
touch test
接着,在webapps
目录下创建挂载文件test2
,用于对比test
与test2
哪个后面会被保留、哪个会被删除。
cd usr
cd local
cd tomcat
cd webapps
mkdir test2
在该过程中可以用ls
查看当前路径下有哪些文件夹。
下面,由容器创建镜像
docker commit 5db54e7325bf test_tomcat:1.0
docker images
接着,进行镜像压缩
docker save -o test_tomcat.tar test_tomcat:1.0
使用ll
可以看到记录
然后,删除原先的test_tomcat
镜像
docker rmi test_tomcat:1.0
下面,解压缩还原压缩的镜像并创建容器
docker load -i test_tomcat.tar
docker run -it --name=newtest_tomcat test_tomcat:1.0 /bin/bash
查看之前的test
与test2
ls
cd webapps
ls
没有显示test2
文件。
cd
ls
test
文件还在。
- 使用 Dockerfile 构建镜像(推荐)
# 在当前目录下创建镜像
docker build -t myapp .
- 通过导入和导出 tar 文件制作镜像
docker export 容器ID > myapp.tarcat myapp.tar | docker import - myimportedimage
3. Dockerfile 概念
Dockerfile 是一个文本文件,包含了一系列指令,每个指令都用于构建 Docker 镜像的不同层。
Dockerfile 的基本结构:
# 指定基础镜像
FROM ubuntu:latest# 维护者信息
MAINTAINER your_name# 运行命令
RUN apt-get update && apt-get install -y curl# 复制文件
COPY app /usr/src/app# 设置工作目录
WORKDIR /usr/src/app# 暴露端口
EXPOSE 8080# 容器启动时执行的命令
CMD ["./app"]
4. Dockerfile 关键字
Dockerfile 中常见的指令及其作用:
指令 | 作用 |
---|---|
FROM | 指定基础镜像 |
RUN | 执行命令并创建新层 |
CMD | 容器启动时默认执行的命令 |
ENTRYPOINT | 设置容器启动时执行的主程序 |
COPY | 复制本地文件到镜像中 |
ADD | 复制文件,可自动解压 tar 包 |
WORKDIR | 设置工作目录 |
EXPOSE | 声明容器监听的端口 |
ENV | 设置环境变量 |
ARG | 定义构建时参数 |
VOLUME | 定义数据卷,实现数据持久化 |
5. Docker 实战案例
5.1 基于 Nginx 构建 Web 服务器
创建dockerfile并编辑
# 使用官方 Nginx 镜像作为基础
FROM nginx:latest# 复制网站文件到 Nginx 目录
COPY ./html /usr/share/nginx/html# 暴露 80 端口
EXPOSE 80# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
在dockerfile同一级目录下创建html目录,并写入内容:
mkdir html
# 添加一个简单的 index.html
echo "<h1>Hello, Docker</h1>" > html/index.html
结构树情况如下所示:
/my-project
├── dockerfile ✅
├── html/
│ ├── index.html ✅
构建与运行:
# 构建镜像
docker build -t mynginx .
# 运行容器
docker run -d -p 8080:80 mynginx
访问 http://localhost:8080
即可查看网页。
6. 验证与总结
6.1 验证 Dockerfile
可以使用以下命令构建并运行 Docker 镜像:
# 构建镜像
docker build -t myapp .# 运行容器
docker run --rm myapp
6.2 总结
本文介绍了 Docker 镜像的原理、制作方法、Dockerfile 关键字及实际案例,包括:
- Docker 镜像的分层结构及存储机制
- 通过 commit、build 及导入导出制作镜像的方法
- Dockerfile 的常见指令及优化策略
- Nginx 的 Docker 实战案例
掌握这些内容后,可以更高效地管理和优化 Docker 容器的构建与部署。