Docker镜像与容器管理

server/2024/12/20 20:16:48/
1. Docker镜像的概念与生命周期

Docker镜像(Image)是构建Docker容器的基础。镜像是一个只读的模板,包含了容器运行所需的操作系统环境、应用程序、依赖库和配置文件等。镜像的创建过程是通过Dockerfile定义的,每个镜像层(Layer)都可以看作是对基础镜像的增量更新。这种分层结构使得Docker镜像非常高效,并且在不同容器之间可以共享相同的层,从而节省存储空间。

镜像的生命周期:
  1. 镜像创建:镜像可以通过两种方式创建:

    • 拉取镜像:从公共或私有镜像仓库(如Docker Hub)拉取现有的镜像。
    • 自定义镜像:使用Dockerfile文件构建镜像,这些文件定义了如何从基础镜像出发,安装应用程序、配置环境并构建最终的镜像。
  2. 镜像存储:镜像通常存储在Docker本地的存储库中,也可以推送到Docker Hub或私有镜像仓库中,供其他人或机器使用。

  3. 镜像使用:镜像创建完成后,可以用来启动多个容器。容器是镜像的一个实例,因此镜像相当于容器的蓝图。

  4. 镜像删除:镜像不会自动删除,当镜像不再需要时,可以手动删除,以节省存储空间。

镜像的分层:

Docker镜像是通过多个只读层组成的,每一层表示应用的一部分,如安装软件包、添加文件等。通过这种分层机制,Docker能够高效管理和存储镜像。每一层都会被缓存,如果镜像的某一层发生变化,Docker会复用之前的层,避免重复构建。

镜像与容器:
  • 镜像是静态的,用来创建容器。
  • 容器是镜像的一个运行实例,容器的生命周期和状态(如运行、停止等)可以独立于镜像管理。
2. 拉取镜像与推送镜像到Docker Hub

Docker Hub是一个公共的容器镜像仓库,用户可以在其中拉取和推送镜像。Docker Hub上有许多官方和社区维护的镜像,涵盖了从操作系统到应用程序的各种环境。以下是拉取和推送镜像的常见操作:

拉取镜像:

使用docker pull命令从Docker Hub或其他远程仓库拉取镜像。命令格式为:

docker pull <repository>/<image>:<tag>

例如,拉取官方的nginx镜像:

docker pull nginx

拉取特定标签的镜像:

docker pull ubuntu:20.04

如果没有指定标签,Docker会默认拉取latest标签的镜像。

推送镜像:

推送镜像到Docker Hub需要先登录到Docker Hub账号。如果没有账号,可以通过以下命令进行注册:

docker login

推送镜像的命令格式为:

docker push <repository>/<image>:<tag>

例如,将本地的myapp镜像推送到Docker Hub:

docker push myusername/myapp:1.0

推送镜像之前,需要先标记镜像(tag)为目标仓库格式:

docker tag myapp:1.0 myusername/myapp:1.0
3. 使用Dockerfile创建自定义镜像

Dockerfile是一个文本文件,包含了构建Docker镜像的所有指令。通过编写Dockerfile,用户可以定义镜像的构建过程,如安装应用、配置环境等。

Dockerfile的基本结构:

一个典型的Dockerfile包括以下常见指令:

  • FROM:指定基础镜像。
  • RUN:在镜像构建过程中执行命令(如安装软件)。
  • COPY:将本地文件复制到镜像中。
  • ADD:与COPY类似,但支持解压缩本地tar文件及下载远程文件。
  • WORKDIR:设置容器内的工作目录。
  • CMD:指定容器启动时默认执行的命令。
  • EXPOSE:声明容器要监听的端口。

以下是一个简单的Dockerfile示例,它基于ubuntu镜像安装nginx并启动服务:

# 使用官方的 Ubuntu 镜像作为基础镜像
FROM ubuntu:20.04# 安装 Nginx
RUN apt-get update && apt-get install -y nginx# 将本地的 index.html 文件复制到镜像的指定路径
COPY index.html /var/www/html/# 设置容器的工作目录
WORKDIR /var/www/html# 暴露容器运行时的端口
EXPOSE 80# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

构建镜像的命令:

docker build -t mynginx:latest .

这条命令会根据Dockerfile中的指令构建镜像,标记为mynginx:latest

4. 镜像优化技巧:分层与缓存

镜像的分层结构和缓存机制是Docker性能和效率的关键。通过合理的编写Dockerfile,可以避免不必要的镜像重建,减少镜像的大小,提高构建速度。

分层优化:

每个RUNCOPY等指令都会创建一个新的层。为避免频繁的层重新构建,可以遵循以下最佳实践:

  • 合并RUN指令:多个RUN指令会创建多个层,因此可以通过合并命令来减少层数。例如,将apt-get updateapt-get install合并:

    RUN apt-get update && apt-get install -y nginx
  • 避免频繁COPY:每次使用COPYADD指令时,都会创建新的一层。尽量将所有文件一次性复制到容器中,避免每次修改文件时都重新构建镜像。

  • 利用缓存:Docker会缓存每个层的构建过程。当Docker构建镜像时,如果检测到某个层没有变化,它会复用缓存,从而加速构建。因此,避免频繁修改镜像中的早期层。

构建优化:
  • 利用多阶段构建:对于复杂的镜像,可以使用多阶段构建,将构建环境与生产环境隔离,以减少镜像的体积。例如,在构建Java应用时,可以先在一个构建镜像中构建代码,再将编译后的文件拷贝到一个更轻量的镜像中:
    # 构建阶段
    FROM maven:3.6-jdk-11 AS build
    COPY . /usr/src/app
    WORKDIR /usr/src/app
    RUN mvn package# 运行阶段
    FROM openjdk:11-jre
    COPY --from=build /usr/src/app/target/app.jar /app/app.jar
    CMD ["java", "-jar", "/app/app.jar"]
5. 容器与镜像的管理:创建、启动、停止、删除容器

管理容器和镜像是Docker使用中的重要部分。以下是常见的命令:

创建与启动容器:
docker run -d --name mynginx-container mynginx:latest
  • -d:以后台模式运行容器。
  • --name:指定容器名称。
  • mynginx:latest:要运行的镜像。
查看正在运行的容器:
docker ps
停止容器:
docker stop mynginx-container
删除容器:

停止容器后,可以删除它:

docker rm mynginx-container
删除镜像:

删除镜像时,首先确保没有容器使用该镜像,否则需要先删除相关容器:

docker rmi mynginx:latest
6. 使用docker commit与docker save备份镜像
  • docker commit:用于将容器的当前状态保存为一个新的镜像。这在需要在运行中的容器中进行临时修改并将其保存为镜像时非常有用:

    docker commit mynginx-container mynginx:v2
  • docker save:用于将镜像保存为一个.tar归档文件,便于备份或传输:

    docker save -o mynginx.tar mynginx:latest

    之后可以通过docker load命令将该镜像重新加载到Docker中:

    docker load -i mynginx.tar
实践环节:创建自定义镜像与容器管理
  1. 创建一个自定义镜像

    • 编写一个Dockerfile,基于ubuntu安装nginx,并创建一个自定义镜像。
    • 使用docker build命令构建镜像。
  2. 使用docker exec进入容器

    • 使用docker exec -it进入运行中的容器,进行调试或修改。
  3. 将本地镜像推送到Docker Hub

    • 将构建的自定义镜像推送到Docker Hub,供其他人使用。

小结:

在本章中,我们详细介绍了Docker镜像和容器的管理,包括如何创建和优化镜像,如何使用Dockerfile进行自定义镜像构建,如何管理容器的生命周期。通过实践环节,您已经能够熟练创建自定义镜像、管理容器,并将本地镜像推送到Docker Hub。接下来,我们将深入探讨Docker网络和存储的高级用法。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我


http://www.ppmy.cn/server/151773.html

相关文章

安卓LiveDataBus使用记录

创建三个文件 BusMutableLiveData.ktpackage com.donews.common.livedatabus;import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.…

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

题目 3010: 奇偶数之和

题目 3010: 奇偶数之和 时间限制: 2s 内存限制: 192MB 提交: 3298 解决: 2005 题目描述 利用循环&#xff0c;分别输出1∼n之间的所有奇数的和、偶数的和。 输入格式 输入n 输出格式 输出为一行&#xff0c;两个数(用一个空格隔开)&#xff0c;偶数之和与奇数之和。 样例输入 1…

python实现视频切分图片

python脚本 import os import subprocess from tkinter import * import tkinter.messagebox import tkinter as tkdef videoCut(video_path,fps):# 获取当前工作路径</

快速解决oracle 11g中exp无法导出空表的问题

在一些生产系统中&#xff0c;有些时候我们为了进行oracle数据库部分数据的备份和迁移&#xff0c;会使用exp进行数据的导出。但在实际导出的时候&#xff0c;我们发现导出的时候&#xff0c;发现很多空表未进行导出。今天我们给出一个快速解决该问题的办法。 一、问题复现 我…

系列5:基于Centos-8.6 Kubernetes master节点允许运行pod节点

每日禅语 不识本心&#xff0c;内心不定&#xff0c;心就会随物转&#xff1b;倘若能了知自己的心&#xff0c;动静如一&#xff0c;那么万象万物都可以随心而转。净心才能入定&#xff0c;从而摆脱外物的牵绊&#xff1b;心不因外物而动才能真正认清自己&#xff0c;遇到顺境不…

Android 获取屏幕物理尺寸

注&#xff1a;编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view &#xff0c;对 view 显示的位置要求比较精确&#xff0c;通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…

淘系商品评论json数据示例参考,API接口系列

以下是一个淘系商品评论的JSON数据示例&#xff0c;以及如何使用相关API接口的简要说明&#xff1a; JSON数据示例 {"status": "success","message": "评论数据获取成功","data": {"product_id": "1234567…