Docker的镜像

简介: 镜像是容器的运行基础,容器是镜像运行后台的形态 镜像的概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上 镜像的系统结构 镜像的本质是磁盘上一系列文件的集合,创建新的镜像其实也就是对已有镜像文件的增删查改。

镜像是容器的运行基础,容器是镜像运行后台的形态

镜像的概念

镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上

镜像的系统结构

镜像的本质是磁盘上一系列文件的集合,创建新的镜像其实也就是对已有镜像文件的增删查改。但镜像之间并不是孤立,而是存在单向的文件依赖关系,如下图中,镜像1的FileA是镜像2FileA的修改版本,NewFile是新创建的文件,其他文件则全部引自镜像2

镜像的写时复制机制

通过docker run命令创建一个容器时,实际上是在改镜像上创建一个空的可读写文件系统层,可以将这个文件系统当成一个新的临时镜像,而命令里所指定的镜像称为父镜像,父镜像的内容都是以只读的方式挂载进来。容器会读取共享父镜像的内容。不过一旦需要修改父镜像文件,便会触发Docker从父镜像中复制这个文件到临时镜像中来,所有的修改均发生在你的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制

本地镜像的管理

查看

通过docker images查看本机上所有的镜像

[root@docker ~]# docker images;
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
import              latest              e9757477bda9        21 hours ago        190.6 MB
imported            centos              4ef3250d4123        21 hours ago        190.6 MB
centos              6.7                 a8b4df3be85c        3 months ago        190.6 MB
[root@docker ~]#

对上述代码结果中各个字段的解释:

REOOSITORY:仓库名称。仓库名称用来存放同一类型的镜像,其名称由它的创建者指定,如果没有指定则为<none>

关于仓库名称,有一下几种形式:

  • [namespace\centos]:由命令空间和实际的仓库名称组成,中国通过\隔开
  • [centos]:只有仓库名,对这种没有命令空间的仓库名,可以认为属于顶级命名空间该空间的仓库只用于官方的镜像
  • [dl.dockerpool.com:5000\centos:6.7]:指定url路径的方式,如果该镜像不是防止在Docker Hub上,而是防止在你自己搭建的或者第三方的Hub上,则使用这种命令方式
  • TAG:用于区分同一仓库中的不同镜像,如果未指定,默认为latest
  • IMAGE ID:每个镜像都有一个字符串类型、长为64位的HashID,用来全网标识一个镜像。改字段只展示前面一部分,因为这一部分已经足以在本机唯一标识一个镜像了
  • CREATED:镜像的创建时间
  • VIRTUAL SIZE:镜像所占用的虚拟大小,改大小包含了所有共享文件的大小

下载

docker run 命令运行一个镜像时,Dokcer首先会在本机寻找该镜像是否存在,如果不存在则会在Docker Hub上搜索

同时可以通过search命令搜索符合要求的镜像

[root@docker ~]# docker search wordpress
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
wordpress                     The WordPress rich content management syst...   1434      [OK]       
appcontainers/wordpress       Centos/Debian Based Customizable Wordpress...   34                   [OK]
bitnami/wordpress             Bitnami Docker Image for WordPress              20                   [OK]
kaihofstetter/wordpress-cli   Installs a configured and ready to use Wor...   12                   [OK]
centurylink/wordpress         Wordpress image with MySQL removed.             12                   [OK]
trafex/wordpress              Wordpress container with Nginx 1.10 & PHP-...   3                    [OK]
maximiliend/wordpress         A enhanced docker image of WordPress with ...   3                    [OK]
scjalliance/wordpress         WordPress with GD and FreeType                  2                    [OK]
dsifford/wordpress            A WordPress docker environment that just w...   2                    [OK]
dsteinkopf/wordpress          wordpress clone plus some php extensions        1                    [OK]
bakudankun/wordpress-ja       WordPress Japanese Edition forked from off...   1                    [OK]
orukami/wordpress             Wordpress image based on FPM and nginx.         1                    [OK]
momonga/wordpress             wordpress with mbstring, sendmail               1                    [OK]
ddaishin/wordpress            Wordpress日本語最新版 Xdebug OSX...                   1                    [OK]
indiehosters/wordpress        WordPress image for IndieHosters service        0                    [OK]
derjudge/wordpress            1:1 clone of docker-library/wordpress with...   0                    [OK]
deardooley/wordpress          Production-ready minimal Wordpress images.      0                    [OK]
cuuats/wordpress              Wordpress image for CUUATS websites.            0                    [OK]
miqueladell/wordpress         Just a tailor made Wordpress.                   0                    [OK]
ikoptiev/wordpress            Official Wordpress image with max file upl...   0                    [OK]
rwindegger/wordpress          A wordpress php-fpm backend.                    0                    [OK]
jamesits/wordpress            Docker image for WordPress/Apache/PHP7, op...   0                    [OK]
appeine/wordpress             Container holding WordPress sources             0                    [OK]
svendocker/wordpress          wordpress + mcrypt  and recode                  0                    [OK]
fusengine/wordpress           Wordpress with php7 and nginx                   0                    [OK]

如果命令镜像的名称没有命名空间,说明该镜像属于Docker Hub的官方镜像

OFFICIAL:则表示是否为官方镜像

如果想要下载可以通过pull命令,但是镜像名必须是完整的包含命令空间和仓库名,如果一个仓库中存在多个镜像,则需要制定TAG,否则默认的TAG为latest

删除

对于那种不在需要的镜像通过rmi命令删除

如果遇到删除不掉的情况,一般是镜像被容器所依赖,所以可以通过-f 参数强制删除

删除所有的容器:docker rm $(docker ps –a -q)

创建本地镜像

使用commit命令创建本地镜像

先用docker run -t -i centos:6.7创建和运行一个容器,并在home目录下新建一个文件,写入:my name is new file 并保存

创建容器的时候记住容器的ID:076c8448ce82

然后退出容器,执行如下命令:

[root@docker ~]# docker commit -m="Message" --author="zhaofan" 076c8448ce82 zhaofan/test:v1
ad8352f07c0e9183b57c365dfac389e1327eb23be08935e8646f3ac7f31deddb

这个时候查看之前创建的文件,发现文件还在

使用Dockerfile创建镜像

官方推荐用Dockerfile的方式创建

将需要对镜像的操作全部写到一个文件中

使用docker build命令中创建镜像

Dockerfile文件以行为单位,行首为Dockerfile命令,命令都是大写,其后紧跟着是命令的参数

下面是一个Dockerfile文件实例:

# Version: 1.0.1
FROM ubuntu:latest
MAINTAINER xxh "xxh@qq.com"
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN apt-get update
RUN apt-get install -y nginx
#使用&&拼接命令
RUN touch test.txt && echo "abc" >> abc.txt
#对外暴露端口
EXPOSE 80 8080 1038
#添加文件
ADD abc.txt /opt/
#添加文件夹
ADD /webapp /opt/webapp
#添加网络文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#设置环境变量
ENV WEBAPP_PORT=9090
#设置工作目录
WORKDIR /opt/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数

CMD ["-a", "-l" ]
#设置卷
VOLUME ["/data", "/var/www"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt

FROM指定待扩展的父级镜像,除了注释,在文件的开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM指令,可以在同一个Dockerfile文件中创建多个镜像

MAINTAINER用来声明创建镜像的作者信息,这个不是必须的

RUN:用来修改镜像的命令,常用来安装库,程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行,RUN语句有两种形式:

RUN apt-get update

RUN [ "apt-get", "update" ]

第一种形式是在/bin/bash环境下执行指定命令,第二种是直接调用exec来执行如果想要执行多个命令可以通过&&连接

EXPOSE:用来指明容器内进程对外开放的端口,多个端口之间用空格隔开

运行容器时:

通过参数 -P (大写)即可将 EXPOSE 里所指定的端口映射到主机上另外的随机端口,其他容

器或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过 -p (小写)参

数将Dockerfile中 EXPOSE 中没有列出的端口设置成公开的

ADD 向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以是一个文件夹。

ADD 命令的第一个参数用来指定源文件(夹) ,它可以是文件路径、文件夹的路径或网络文件的URL地址。需要特别注意的是,如果是文件路径或文件夹路径,它必须是相对Dockerfile所在目录的相对路径。如果是一个文件URL,在创建镜像时,会先下载下来,然后再添加到镜像里去。第二个参数是文件需要放置在目标镜像的位置。如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

VOLUME 该命令会在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个路径可以来自主机或者其他容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问,只有当挂载点的容器引用全部消失时,挂载点才会自动删除。

WORKDIR 为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可是相对目录。根据需要, WORKDIR 可以被多次指定。当启动一个容器时,最后一条 WORKDIR指令所指的目录将作为容器运行的当前工作目录。

ENV 设置容器运行的环境变量。在运行容器的时候,通过 -e 参数可以修改这个环境变量值

CMD 用来设置启动容器时默认运行的命令

CMD 参数的格式和 RUN 类似:

CMD ls -l -a

CMD [ "ls", "-l", "-a" ]

ENTRYPOINT 与 CMD 类似,它也是用来指定容器启动时默认运行的命令。

通常情况下,我们会将 CMD 和 ENTRYPOINT 搭配起来使用。 ENTRYPOINT 用于指定需要运行的命令, CMD 用于指定运行命令所需要的参数,示例如下:

ENTRYPOINT [ "ls" ]

CMD [ "-a", "-l" ]

USER 为容器的运行及接下来 RUN 、 CMD 、 ENTRYPOINT 等指令的运行指定用户或UID。

ONBUILD 触发器指令。构建镜像的时候,Docker的镜像构建器会将所有的 ONBUILD 指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用 FROM 指令指定父镜像为这个镜像时,便会触发执行。

 

 

通过设置 docker build 命令参数 --no-cache=true ,可以禁用缓存机制

 

Docker Hub

Docker Hub的网址是https://hub.docker.com

Docker Hub上的镜像分为两类。 一类是官方镜像, 比如 ubuntu 、 nginx 、 redis 、 mysql 、 wordpress等,此类镜像一般由权威的第三方(比如Canonical、Oracle、Red Hat等极具背景的大公司)进行开发维护,最后还需要Docker官方认证通过。另一类为普通用户镜像。

 

所有的努力都值得期许,每一份梦想都应该灌溉!
目录
相关文章
|
21天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
798 29
|
2月前
|
缓存 监控 持续交付
|
18天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
23天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
108 2
|
25天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
51 1
|
26天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
1月前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
49 1
|
2月前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
878 2
|
2月前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
1008 1
|
18天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
53 0