首页 > 其他分享 >Docker:文件、镜像与容器,你搞清楚了吗?

Docker:文件、镜像与容器,你搞清楚了吗?

时间:2024-11-18 10:44:32浏览次数:3  
标签:容器 搞清楚 UTF 构建 镜像 Docker Dockerfile docker

Docker是实现容器化和分发完整环境与应用的强大工具。在使用Docker时,文件和镜像是核心概念,但两者之间的关系往往令人困惑。比如,「Dockerfile」是什么?「镜像」的作用是什么?「容器实例」和「镜像」之间又是什么关系?本文将通过通俗易懂的解释、代码示例以及实际案例,清晰揭示这些概念。


在这里插入图片描述

一、Docker中为何需要文件和镜像?

在Docker中,文件和镜像是构建和运行容器的基础。以下是它们的作用和流程:

  1. 定义构建规则:
    Dockerfile是用于定义如何创建镜像的脚本文件。它包含了系统基础配置、依赖项安装以及应用部署的所有指令。

  2. 分发与复用:
    构建完成的环境会被保存为镜像。镜像可以跨平台分发,并确保环境一致性,实现「构建一次,运行到处」。

  3. 实例化运行:
    容器实例是从镜像运行起来的实际环境,是用于部署和测试的实体。


在这里插入图片描述

概念对照表

概念功能和用途实现方式
Dockerfile定义如何构建镜像的脚本文件编写Dockerfile并执行docker build
镜像已构建好的环境封装,包含应用及其依赖使用Dockerfile生成镜像
容器实例从镜像启动的运行环境,用于实际操作和调试通过docker run命令启动实例

在这里插入图片描述

二、深入解析Dockerfile

Dockerfile是镜像构建的基础,它通过多条指令定义了环境搭建的过程。以下是一个简单的Dockerfile示例:

# 使用Ubuntu基础镜像
FROM ubuntu:22.04

# 设置非交互模式,避免安装过程中的用户输入
ENV DEBIAN_FRONTEND=noninteractive

# 更新系统并安装必要的依赖项
RUN apt update && apt install -y gawk wget git-core diffstat unzip texinfo \
    gcc-multilib build-essential chrpath socat file cpio python3 python3-pip \
    python3-pexpect xz-utils debianutils iputils-ping libsdl1.2-dev xterm tar \
    locales net-tools rsync sudo vim curl zstd liblz4-tool libssl-dev bc lzop \
    libgnutls28-dev efitools git-lfs

# 设置语言环境为UTF-8,避免字符集问题
RUN locale-gen en_US.UTF-8 && \
    update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 替换默认Shell为Bash(适合Yocto等工具)
RUN rm /bin/sh && ln -s bash /bin/sh

# 设置工作目录
WORKDIR /workspace

# 镜像构建完成后默认执行的命令
CMD ["/bin/bash"]

Dockerfile的主要指令解析

  1. 基础镜像选择:
    FROM ubuntu:22.04
    指定镜像的基础环境,决定了系统类型和版本。

  2. 环境变量配置:
    ENV DEBIAN_FRONTEND=noninteractive
    避免在安装过程中弹出交互式确认提示。

  3. 安装依赖:
    使用RUN命令安装构建所需的软件包,例如build-essential用于编译,python3用于脚本支持等。

  4. 设置语言环境:
    通过locale-gen配置UTF-8支持,避免字符编码问题。

  5. 工作目录:
    使用WORKDIR指定镜像中的默认工作路径。


三、镜像与容器的关系

镜像的生成与运行

镜像是通过docker build命令生成的,以下是生成镜像的示例:

docker build -t my-docker-image .

生成的镜像可以用docker images命令查看:

docker images

运行镜像以创建容器实例:

docker run -it --name my-container my-docker-image

镜像与容器的区别

镜像容器
静态文件,包含构建好的环境和应用动态运行实例,可以进行交互和操作
可分发,可用于多次实例化运行时环境,不可直接分发
只读可读写

四、实际用例:搭建Yocto构建环境

以下是一个使用Docker搭建Yocto构建环境的完整示例:

  1. 创建Dockerfile:
# 使用Ubuntu作为基础镜像
FROM ubuntu:22.04

# 安装Yocto构建所需依赖
RUN apt update && apt install -y gawk wget git-core diffstat unzip texinfo \
    gcc-multilib build-essential chrpath socat file cpio python3 python3-pip \
    xz-utils debianutils iputils-ping libsdl1.2-dev xterm tar locales

# 设置语言环境
RUN locale-gen en_US.UTF-8 && \
    update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 设置工作目录
WORKDIR /yocto
  1. 构建镜像:
docker build -t yocto-builder .
  1. 运行容器:
docker run -it --name yocto-container yocto-builder

五、常见问题及优化建议

  1. 镜像过大:

    • 使用多阶段构建(FROM ... AS),减少无关文件。
    • 清理构建过程中产生的缓存或中间文件。
  2. 构建时间长:

    • 使用缓存层,避免每次重新下载依赖。
    • 使用更轻量的基础镜像(如alpine)代替ubuntu
  3. 权限问题:

    • 在Dockerfile中添加用户并设置权限,避免以root身份运行容器。

六、总结

Dockerfile定义了镜像的构建规则,镜像是构建后的环境封装,容器是镜像的运行实例。通过清晰区分这三者的关系,我们可以高效构建、分发和运行各种应用环境。同时,理解并优化Dockerfile、镜像与容器的使用方式,能够显著提高开发与部署的效率。希望本文能帮助你更深入理解Docker的核心概念!

标签:容器,搞清楚,UTF,构建,镜像,Docker,Dockerfile,docker
From: https://blog.csdn.net/Interview_TC/article/details/143846597

相关文章

  • vllm docker-compose
    version:'3'services:moonlit-vllm-qwen-hotvideo:image:vllm/vllm-openai:v0.6.2container_name:hitvideos_apirestart:alwayscommand:["--served-model-name","qwen2.5-14b-hitvideos","......
  • docker 运维
    服务器公网IP113.45.148.176mysql初始数据卷设置my.cnf[client]default-character-set=utf8mb4​[mysql]default-character-set=utf8mb4​[mysqld]character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_unicode_ci#collation......
  • 为正在运行的 Docker 容器重启策略,以提高服务的可用性
    为正在运行的Docker容器重启策略,以提高服务的可用性。为正在运行的Docker容器添加--restart=always--restart=always是Docker中一个常用的参数,用来设置容器的重启策略。它的作用是确保容器在一定条件下能够自动重启,以提高服务的可用性。方法:直接修改配置步骤1:查看......
  • 使用 Docker 部署 Next Terminal 轻量级堡垒机
    1)NextTerminal 介绍官网:https://next-terminal.typesafe.cn/GitHub:https://github.com/dushixiang/next-terminal想必经常玩服务器的都了解过 堡垒机,类似于跳板机,但与跳板机的侧重点不同。堡垒机的主要功能是控制和监控对内部网络的远程访问。它提供严格的访问控制、会话审......
  • 安装Harbor镜像仓库
    安装Harbor镜像仓库安装dockercurl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun下载harbor安装包#下载DockerHarbor安装包wgethttps://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-offline-installer-v2.12.0.tgz#解压安装包[......
  • 镜像部署 Node.js 环境
    操作场景腾讯云市场中提供了例如包含多种操作系统、热门软件等不同类型的镜像。您可选择这些镜像,在腾讯云云服务器(CVM)上快速部署具有较高稳定性和安全性的软件环境以及个人网站。本文档介绍在Linux操作系统的腾讯云云服务器(CVM)上通过镜像完成Node.js环境部署。技能要求......
  • zlibrary镜像网页,国内可用官网入口及客户端/app(持续更新)
    Z-Library(也被称为Z-Lib)是一个在线的、开源的、免费的数字图书馆项目,旨在提供各种书籍、文章、科学论文、杂志、漫画等资源的访问。该项目成立于2009年,至今已经收录了超过10,000,000册书籍和80,000,000篇文章。zlibrary电脑客户端/安卓appzlibrary(windows/mac/安卓)安装包下......
  • docker运行rabbitmq,mq用户以及vhost的持久化方法
    一、编写dockerfile文件,配置需要的插件vimpackage/dockerfile-rabbitmq.yamlFROMrabbitmq:3.8.5WORKDIR/var/lib/rabbitmqCOPYrabbitmq_delayed_message_exchange-3.8.0.ez/opt/rabbitmq/plugins/RUNchownrabbitmq:rabbitmq/opt/rabbitmq/plugins/rabbitmq_delayed_......
  • Docker部署Redis哨兵
    哨兵,英文名Sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。RedisSentinel包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Senti......
  • docker安装单机版redis
    Docker安装Redis方法一、dockerpullredis查找DockerHub上的redis镜像#dockersearchredis这里我们拉取官方的镜像,标签为latest#dockerpullredis:latest(第一次启动Docker-Redis主要是查看Docker里面Redis的默认配置,数据位置,日志位置,配置文件位置)#dockerrun-it......