• Docker容器化技术(使用Dockerfile制作镜像)


    Docker中的镜像分层

    Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。

    1、Docker 镜像为什么分层

    镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜 像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共 享。

    如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容 器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

    2、可写的容器层

    当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫 “镜像层”。 

    所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容 器层下面的所有镜像层都是只读的。

    3、容器层的细节说明

    镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同 路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器 层中,用户看到的是一个叠加之后的文件系统。

    Dockerfile 介绍

      Docker中有个非常重要的概念叫做——镜像(Image)。Docker 镜像是一个特殊的文件系统,除 了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。   

            镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构 建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜 像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。   

            Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每 一条指令的内容,就是描述该层应当如何构建。

    1. [root@localhost ~]# mkdir /db
    2. [root@localhost ~]# cd /db
    3. [root@localhost db]# systemctl start docker
    4. [root@localhost db]#
    5. [root@localhost db]# vim Dockerfile
    6. ARG VER=latest
    7. FROM busybox:$VER
    8. MAINTAINER wyx
    9. ENV WEB_DOC_ROOT="/data/web/html"
    10. RUN mkdir -p ${WEB_DOC_ROOT}
    11. COPY index.html ${WEB_DOC_ROOT}/index.html
    12. EXPOSE 80
    13. CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

    Dcokerfile指令介绍 

     FROM 

     介绍

    • FROM 指令必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句; FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环 境;
    • 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指 定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的 镜像文件,docker build 会返回一个错误信息;
    • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。 如果FROM语句没有指定镜像标签,则默认使用latest标签。

    ARG

    介绍

    • ARG指令类似ENV,定义了一个变量;区别于ENV:用户可以在构建时docker build --build-arg = 进行对变量的修改;ENV不可以;
    • 如果用户指定了未在Dockerfile中定义的构建参数,那么构建输出警告。 

     MAINTAINER 

    介绍

            用于让dockerfile制作者提供本人的详细信息 dockerfile 并不限制MAINTAINER 指令可在出现的位置,但推荐将其放置于FROM指令之后

    COPY

    介绍

    用于从docker 主机复制新文件或者目录至创建的新镜像指定路径中

     EXPOSE

    介绍

    用于为容器打开指定要监听的端口以实现与外部通信

    RUN

    介绍

    用于指定docker build过程中运行的程序,其可以是任何命令 

    ENV

    介绍

    • 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、 COPY等)所调用
    • 调用格式为$variable_ name 或 ${variable_ name}

    示例 

    1. [root@localhost db]# docker build -t web:v2 ./ --load
    2. [+] Building 1.5s (7/7) FINISHED docker-container:default
    3. => [internal] load build definition from Dockerfile 0.0s
    4. => => transferring dockerfile: 344B 0.0s
    5. => [internal] load metadata for docker.io/library/busybox:latest 1.3s
    6. => [internal] load .dockerignore 0.0s
    7. => => transferring context: 2B 0.0s
    8. => [1/2] FROM docker.io/library/busybox:latest@sha256:650fd573e056b679a5110a70aabeb01e26b76e545ec4b9c70a9523f2dfaf18c6 0.0s
    9. => => resolve docker.io/library/busybox:latest@sha256:650fd573e056b679a5110a70aabeb01e26b76e545ec4b9c70a9523f2dfaf18c6 0.0s
    10. => CACHED [2/2] RUN mkdir -p /data/web/html && echo "

      Busybox httpd server

      "
      > /data/web/html/index.html 0.0s
    11. => exporting to docker image format 0.1s
    12. => => exporting layers 0.0s
    13. => => exporting manifest sha256:ac9ab7ea17a22df4d6b811825b8d72617057773c55d4ac1333202c077d02edc9 0.0s
    14. => => exporting config sha256:d295a55faa063775dc81658b0f9a2b022e8c3ebee479fe7b94386155c695c810 0.0s
    15. => => sending tarball 0.1s
    16. => importing to docker 0.0s
    17. => => loading layer 29daefb0147a 223B / 223B 0.0s
    18. [root@localhost db]# docker images
    19. REPOSITORY TAG IMAGE ID CREATED SIZE
    20. web v2 d295a55faa06 6 minutes ago 4.26MB
    21. moby/buildkit buildx-stable-1 480495983c47 5 weeks ago 172MB
    22. wordpress latest 2fc2a7b04129 5 weeks ago 739MB
    23. tencentci/discuz latest caba9d3ea6d8 8 weeks ago 574MB
    24. mysql 5.7 5107333e08a8 3 months ago 501MB
    25. goharbor/harbor-exporter v2.8.4 b8d33e28ec68 6 months ago 97.7MB
    26. goharbor/redis-photon v2.8.4 7b7324d651ca 6 months ago 120MB
    27. goharbor/trivy-adapter-photon v2.8.4 91d8e9f0b21a 6 months ago 464MB
    28. goharbor/notary-server-photon v2.8.4 a46f91560454 6 months ago 113MB
    29. goharbor/notary-signer-photon v2.8.4 da66bd8d944b 6 months ago 110MB
    30. goharbor/harbor-registryctl v2.8.4 805b38ca6bee 6 months ago 141MB
    31. goharbor/registry-photon v2.8.4 756769e94123 6 months ago 79MB
    32. goharbor/nginx-photon v2.8.4 375018db778b 6 months ago 116MB
    33. goharbor/harbor-log v2.8.4 8a2045fb24d2 6 months ago 124MB
    34. goharbor/harbor-jobservice v2.8.4 97808fc10f64 6 months ago 141MB
    35. goharbor/harbor-core v2.8.4 c26fcd0714d8 6 months ago 164MB
    36. goharbor/harbor-portal v2.8.4 4a8b0205c0f9 6 months ago 124MB
    37. goharbor/harbor-db v2.8.4 5b8af16d7420 6 months ago 174MB
    38. goharbor/prepare v2.8.4 bdbf974d86ce 6 months ago 166MB
    39. busybox latest ba5dc23f65d4 9 months ago 4.26MB
    40. mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
    41. y109/discuz latest 607a1b6e9cc4 8 years ago 542MB
    42. training/webapp latest 6fae60ef3446 8 years ago 349MB
    43. training/postgres latest 6fa973bb3c26 9 years ago 365MB
    44. [root@localhost db]# docker run -d --name test1 -P web:v2
    45. ed9d72069d829036d826e87875f1b15242c358d67d95130862ef8ee440caa0f3
    46. [root@localhost db]# docker ps
    47. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    48. ed9d72069d82 web:v2 "/bin/sh -c '/bin/ht…" 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp test1
    49. faed7103e3ff moby/buildkit:buildx-stable-1 "buildkitd" 11 minutes ago Up 11 minutes buildx_buildkit_default

     

  • 相关阅读:
    域控主机 带瘤
    SQL刷题查漏补缺5
    Zookeeper面试题大全
    【Unity面试】 最全NGUI和UGUI优化 | 面试真题 | UI框架 | 全面总结 |建议收藏
    微擎模块 名片小程序 1.7.9 小程序前端+后端有加密,优化代码,新增付费发布幻灯片
    小米面试——计算机视觉算法实习生
    TCP串流场景剖析
    Elasticsearch:了解人工智能搜索算法
    如何找出电脑内的重复文件,查找电脑磁盘重复文件的方法
    【流式传输】使用Spring Boot实现ChatGpt流式传输
  • 原文地址:https://blog.csdn.net/m0_66011019/article/details/136656649