• Docker build创建指定容器镜像


    Docker build: Build an image from a Dockerfile.

    按照Dockerfile文件所定义内容创建临时性容器,把Docker中所定义的每行命令在临时容器中执行,然后生成镜像分层,所有命令执行结束后,生成一个新的镜像,中间过程为commit。

    一行命令就是一个分层,一行命令多条命令就涉及到镜像优化。

    一次一次的commit执行情况就是pause暂停打包、暂停打包、暂停打包……的过程。

    Docker build执行的Dockerfile文件,执行的却是docker commit操作。

    Dockerfile原理:在Dockerfile定义所要执行的命令,使用docker build创建镜像,过程中会按照Dockerfile所定义的内容打开临时性容器(使用docker commit容器),把Dockerfile文件中的命令全部执行完毕,就得到一个容器应用镜像。

    执行的命令越多,最终得到的容器应用镜像越大,所以要做优化。

    Dockerfile关键字:

    1、FROM:指定基础镜像;

    2、MAINTAINER: 用来指定镜像创建者;

    3、RUN:运行命令;

    4、CMD:设置container启动时执行的操作;(如果容器镜像有此命令,启动容器时不要手动再让容器执行其他的命令。)

    5、ENTRYPOINT:设置Container启动时执行的操作;

    6、USER:设置容器中的用户;

    7、EXPOSE:指定容器需要映射到宿主机的端口;

    8、ENV:设置环境变量

    9、ADD:从宿主机的src复制文件到container的dest路径;

    10、VOLUME:指定挂载点;

    11、WORKDIR: 在子镜像中执行工作路径切换;

    12、ONBUILD:

    这些关键字都是要理解的。

    1、示例:

    目的: 通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像。

    步骤:

    1、创建一个文件夹(目录),用于存储Dockerfile所使用的文件;

    2、在此目录中创建Dockerfile文件及制作镜像所使用的文件,比如网站的首页,启动apache启动的脚本;

    3、在此目录中,使用docker build创建镜像,读取Dockerfile文件;

    4、验证:使用创建的镜像启动容器。

    过程:

    第一步:创建test目录:

    mkdir test

    第二步:进入目录并创建用于启动httpd的脚本文件:

    1. cd test
    2. vim run-httpd.sh
    3. #!/bin/bash
    4. rm -rf /run/httpd/*
    5. exec /usr/sbin/httpd -D FOREGROUND

    第三步:创建用于测试httpd是否可用的index.html:

    1. vim index.html
    2. It's work!

    第四步:创建Dockerfile:

    1. FROM centos:7
    2. MAINTAINER "chang_chunhua@qq.com"
    3. RUN yum clean all && yum install -y httpd
    4. ADD run-httpd.sh /run-httpd.sh
    5. RUN chmod -v +x /run-httpd.sh
    6. ADD index.html /var/www/html
    7. EXPOSE 80
    8. WORKDIR /
    9. CMD ["/bin/bash","run-httpd.sh"]

    说明:centos:8已经停服。

    第五步:使用docker build创建容器应用镜像,镜像名称为centos-base-httpd,版本为v1。

    1. [root@vm1 test]# docker build -t centos-base-httpd:v1 .
    2. Sending build context to Docker daemon 4.096kB
    3. Step 1/9 : FROM centos:7
    4. 7: Pulling from library/centos
    5. 2d473b07cdd5: Pull complete
    6. Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
    7. Status: Downloaded newer image for centos:7
    8. ---> eeb6ee3f44bd
    9. Step 2/9 : MAINTAINER "chang_chunhua@qq.com"
    10. ---> Running in c26b1ca650a4
    11. Removing intermediate container c26b1ca650a4
    12. ---> e796b74765c8
    13. Step 3/9 : RUN yum clean all && yum install -y httpd
    14. ---> Running in 13bb29923568
    15. Loaded plugins: fastestmirror, ovl
    16. Cleaning repos: base extras updates
    17. Loaded plugins: fastestmirror, ovl
    18. Determining fastest mirrors
    19. * base: mirrors.tuna.tsinghua.edu.cn
    20. * extras: mirrors.tuna.tsinghua.edu.cn
    21. * updates: mirrors.tuna.tsinghua.edu.cn
    22. Resolving Dependencies
    23. --> Running transaction check
    24. ---> Package httpd.x86_64 0:2.4.6-97.el7.centos.5 will be installed
    25. --> Processing Dependency: httpd-tools = 2.4.6-97.el7.centos.5 for package: httpd-2.4.6-97.el7.centos.5.x86_64
    26. --> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-97.el7.centos.5.x86_64
    27. --> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-97.el7.centos.5.x86_64
    28. --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
    29. --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
    30. --> Running transaction check
    31. ---> Package apr.x86_64 0:1.4.8-7.el7 will be installed
    32. ---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
    33. ---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
    34. ---> Package httpd-tools.x86_64 0:2.4.6-97.el7.centos.5 will be installed
    35. ---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
    36. --> Finished Dependency Resolution
    37. Dependencies Resolved
    38. ================================================================================
    39. Package Arch Version Repository Size
    40. ================================================================================
    41. Installing:
    42. httpd x86_64 2.4.6-97.el7.centos.5 updates 2.7 M
    43. Installing for dependencies:
    44. apr x86_64 1.4.8-7.el7 base 104 k
    45. apr-util x86_64 1.5.2-6.el7 base 92 k
    46. centos-logos noarch 70.0.6-3.el7.centos base 21 M
    47. httpd-tools x86_64 2.4.6-97.el7.centos.5 updates 94 k
    48. mailcap noarch 2.1.41-2.el7 base 31 k
    49. Transaction Summary
    50. ================================================================================
    51. Install 1 Package (+5 Dependent packages)
    52. Total download size: 24 M
    53. Installed size: 32 M
    54. Downloading packages:
    55. Public key for apr-1.4.8-7.el7.x86_64.rpm is not installed
    56. warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
    57. Public key for httpd-tools-2.4.6-97.el7.centos.5.x86_64.rpm is not installed
    58. --------------------------------------------------------------------------------
    59. Total 1.7 MB/s | 24 MB 00:14
    60. Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    61. Importing GPG key 0xF4A80EB5:
    62. Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) "
    63. Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
    64. Package : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS)
    65. From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    66. Running transaction check
    67. Running transaction test
    68. Transaction test succeeded
    69. Running transaction
    70. Installing : apr-1.4.8-7.el7.x86_64 1/6
    71. Installing : apr-util-1.5.2-6.el7.x86_64 2/6
    72. Installing : httpd-tools-2.4.6-97.el7.centos.5.x86_64 3/6
    73. Installing : centos-logos-70.0.6-3.el7.centos.noarch 4/6
    74. Installing : mailcap-2.1.41-2.el7.noarch 5/6
    75. Installing : httpd-2.4.6-97.el7.centos.5.x86_64 6/6
    76. Verifying : httpd-tools-2.4.6-97.el7.centos.5.x86_64 1/6
    77. Verifying : mailcap-2.1.41-2.el7.noarch 2/6
    78. Verifying : apr-1.4.8-7.el7.x86_64 3/6
    79. Verifying : apr-util-1.5.2-6.el7.x86_64 4/6
    80. Verifying : httpd-2.4.6-97.el7.centos.5.x86_64 5/6
    81. Verifying : centos-logos-70.0.6-3.el7.centos.noarch 6/6
    82. Installed:
    83. httpd.x86_64 0:2.4.6-97.el7.centos.5
    84. Dependency Installed:
    85. apr.x86_64 0:1.4.8-7.el7
    86. apr-util.x86_64 0:1.5.2-6.el7
    87. centos-logos.noarch 0:70.0.6-3.el7.centos
    88. httpd-tools.x86_64 0:2.4.6-97.el7.centos.5
    89. mailcap.noarch 0:2.1.41-2.el7
    90. Complete!
    91. Removing intermediate container 13bb29923568
    92. ---> c1b6b195b759
    93. Step 4/9 : ADD run-httpd.sh /run-httpd.sh
    94. ---> 1f85b533d455
    95. Step 5/9 : RUN chmod -v +x /run-httpd.sh
    96. ---> Running in bd3ef63efe8a
    97. mode of '/run-httpd.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
    98. Removing intermediate container bd3ef63efe8a
    99. ---> 938f5dcddad5
    100. Step 6/9 : ADD index.html /var/www/html
    101. ---> 026c49eb2266
    102. Step 7/9 : EXPOSE 80
    103. ---> Running in bb9b4ff22bf7
    104. Removing intermediate container bb9b4ff22bf7
    105. ---> 50c117e5c73b
    106. Step 8/9 : WORKDIR /
    107. ---> Running in ef989d3ca39b
    108. Removing intermediate container ef989d3ca39b
    109. ---> e12ce12352d9
    110. Step 9/9 : CMD ["/bin/bash","run-httpd.sh"]
    111. ---> Running in 94f40a65dbe4
    112. Removing intermediate container 94f40a65dbe4
    113. ---> 62581b44dd05
    114. Successfully built 62581b44dd05
    115. Successfully tagged centos-base-httpd:v1

    第六步:验证,使用上述创建的镜像启动容器:

    docker run -d centos-base-httpd:v1

    使用docker run --help 查看-d命令的意思:

    -d:Run container in background and print container ID。

    另外需要注意的是后面不再需要如/bin/bash的命令了,因为/bin/bash的命令比CMD命令优先级要高。

    验证容器及httpd是否可用:

    1. docker inspect 6a6 # 查看容器的IP地址
    2. curl http://172.17.0.11
    3. It's working!

    案例二:把nginx容器化:

    1)要求通过基础镜像做nginx应用镜像;

    2)使用nginx应用镜像启动容器的时候,nginx要求启动;

    3)验证nginx服务是否启动。

    第一步:创建一个目录:

    1. mkdir nginxtest
    2. cd nginxtest

    第二步:创建测试文件:

    1. [root@localhost nginxtest]# echo 'nginx s running!!!' >> index.html
    2. [root@localhost nginxtest]# ls
    3. index.html

    第三步:创建Dockerfile文件:

    1. FROM centos:7
    2. MAINTAINER "chang_chunhua@qq.com"
    3. RUN yum clean all && yum install -y yum-plugin-ovl && yum -y install epel-release
    4. RUN yum -y install nginx
    5. ADD index.html /usr/share/nginx/html/
    6. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    7. EXPOSE 80
    8. CMD /usr/sbin/nginx

    第四步:使用docker build命令创建nginx镜像:

    docker build -t centos-nginx:v1 .

  • 相关阅读:
    图解第一类曲面积分与第二类曲面积分的关系
    c# 页面跳转
    ROS自学笔记十六:URDF优化_xacro文件
    elform-item动态prop
    Java多线程-线程同步简述
    Linux下用C语言实现<<图书管理系统>>
    PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术
    【机器学习范式】监督学习,无监督学习,强化学习, 半监督学习,自监督学习,迁移学习,对比分析+详解与示例代码
    项目复现 | DETR:利用transformers端到端的目标检测
    嵌入式学习记录6.14(练习)
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/127806494