03-Dockerfile

Dockerfile简介

Dockerfile是什么?

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本

Dockerfile官网

https://docs.docker.com/engine/reference/builder/

Dockerfile构建三步曲

  • 编写Dockerfile文件
  • docker build 命令构建镜像
  • docker run 依照新编写的镜像运行容器实例

Dockerfile构建过程

Dokcerfile基础知识

1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2)指令按照按照从上到下,顺序执行

3)表示注释

4)每条指令都会创建一个新的镜像层并对镜像进行提交

Docker执行Dockerfile的大致流程

1)docker从基础镜像运行一个容器

2)执行一条指令并对容器做出修改

3)执行类似docker commit 的操作提交一个新的镜像层

4)docker再基于刚提交的镜像运行一个新容器

5)执行dockerfile中的下一条指令直到所有的指令都执行完

Dockerfile小总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

  • Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等

  • Docker镜像,在用Docker定义一个文件之后,docker build 时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务

  • Docker 容器,容器是直接提供服务的

Dockerfile常用保留字

FROM

基础镜像,当前新镜像是基于哪一个镜像的,指定一个已存在的镜像作为模板,第一条必须为FROM

MAINTAINER

镜像维护者的名字和邮箱地址

RUN

容器构建时需要运行的命令

两种格式:

  • shell格式
RUN <命令行命令>
# <命令行命令> 等同于在终端操作的 shell 命令# 例如
RUN yum -y install vim 相当于在build的时候下载一个vim
  • exec格式
RUN ["可执行文件", "参数1", "参数2"]# 例如
RUN ["./test.php", "dev", "offline"]  等价于 RUN ./test.php dev offline

RUN是在 docker build 时运行的

EXPOSE

当前容器对外暴露的端口

WORKDIR

指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

USER

指定该镜像以什么样的用户去执行,如果不指定,默认为root

ENV

用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest 
这个环境变量可以在后续的任何 RUN 指令中使用,这就如同在命令前面指定了环境变量前缀一样
也可以在其他指定中直接使用这些环境变量例如: WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中 <源路径>的文件/复制到新的一层的镜像内的<目标路径>位置

COPY src dest
COPY ["src", "dest"]
<src源路径>:源文件或源路径
<dest目标路径>:容器内的指定路径,该路径不用事先创建好,会自动创建

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定容器启动后要干的事情

CMD 指令与 RUN类似,也有两种格式:

  • shell格式
CMD <命令行命令>
# <命令行命令> 等同于在终端操作的 shell 命令
  • exec格式
CMD ["可执行文件", "参数1", "参数2",...]CMD [参数1", "参数2",...] 在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数

注意:

  • Dockerfile中可以有多条CMD指令,但只有最后一条生效,CMD 会被docker run 之后的参数替换

他与 RUN 的区别:

  • CMD是在docker run 时运行的
  • RUN是在docker build 时运行的

ENTRYPOINT

也是用来指定一个容器启动时要运行的命令

类似于 CMD 指令,但是ENTEYPOINT 不会被docker run 后面的命令覆盖,而且这些命令行参数会被当作参数传递给 ENTEYPOINT 指令指定的程序

命令格式

ENTRYPOINT ["executable", "param1", "param2"]# ENTEYPOINT 可以与 CMD 一起用,一般是 变参 才会使用 CMD,这里的CMD等于是给ENTEYPOINT 传参
# 当指定了ENTEYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令,而是将CMD的内容作为参数传递给ENTEYPOINT 指令,它两组合会变为<ENTEYPOINT	> "<CMD>"

案例

假设已通过Dockerfile 构建了 nginx:test 镜像:

FROM nginxENTEYPOINT ["nginx","-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 形参
是否传参按照dockerfile编写执行传参执行
Docker 命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf
衍生出的实际命令nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

案例演示

自定义镜像mycentosjava8

需求

要求centos7镜像具备 vim + ifconfig + jdk8

jdk下载地址: https://mirrors.yangxingzhen.com/jdk/

编写

1)准备Dockerfile文件(注意Dockerfile中的D一定要大写


[root@nhk myfile]# pwd
/myfile
[root@nhk myfile]# ll
total 185340
-rw-r--r--. 1 root root 189784266 Jun  4 03:25 jdk-8u152-linux-x64.tar.gz  # 准备好的jdk
[root@nhk myfile]# docker images centos
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       centos7   eeb6ee3f44bd   20 months ago   204MB   # 准备好的cnetos镜像
[root@nhk myfile]# vim Dockerfile

Dockerfile参考内容如下

FROM centos
MAINTAINER nhk<13605975424@163.com>ENV MY_PATH /usr/local
WORKDIR $MY_PATH# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令查看网络IP
RUN yum -y install net-tools
# 安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# ADD 是相对路径jar,把 jdk-8u152-linux-x64.tar.gz 添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u152-linux-x64.tar.gz /usr/local/java/
# 配置Java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_152
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success-------------------ok"
CMD /bin/bash

构建

docker build -t 新镜像名字:TAG .   # 需要注意TAG 后面有个 .
[root@nhk myfile]# docker build -t mycentosjava8:1.5 .
[+] Building 160.4s (12/12) FINISHED                                                                                                                         => [internal] load .dockerignore                                                                                                                       0.0s=> => transferring context: 2B                                                           ...

如果构建过程中遇到如下报错

 => ERROR [3/7] RUN yum -y install vim                                                                                                                  1.8s
------> [3/7] RUN yum -y install vim:
#0 1.696 CentOS Linux 8 - AppStream                       34  B/s |  38  B     00:01    
#0 1.698 Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
------
Dockerfile:8
--------------------6 |     7 |     # 安装vim编辑器8 | >>> RUN yum -y install vim9 |     # 安装ifconfig命令查看网络IP10 |     RUN yum -y install net-tools
--------------------
ERROR: failed to solve: process "/bin/sh -c yum -y install vim" did not complete successfully: exit code: 1

我们修改Dockerfile文件中镜像版本信息即可解决

FROM centos:centos7  # 添加版本
MAINTAINER nhk<13605975424@163.com>ENV MY_PATH /usr/local
WORKDIR $MY_PATH
....

运行


[root@nhk myfile]# docker run -it --name mycnentos7test mycentosjava8:1.5
[root@e7d8ce7b2d37 local]# pwd     # 尽量工作目录直接就是 /usr/local 说明我们WORKDIR配置成功
/usr/local
[root@e7d8ce7b2d37 local]# vim
[root@e7d8ce7b2d37 local]# java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
[root@e7d8ce7b2d37 local]# 

再次体会 Unionfs(联合文件系统)

​ UnionFS(联合文件系统):UnionFS文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a singls virtual filesystem)。Union文件系统是 Docker 镜像的基础。镜像通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各自具体的应用镜像。

虚悬镜像

什么是虚悬镜像?

仓库名、标签都是 的镜像,俗称 dangling image

查看虚悬镜像的命令

docker image ls -f dangling=true

用Dockerfile制作一个虚悬镜像

1)编写Dockerfile文件

[root@nhk myfile]# mkdir test
[root@nhk myfile]# cd test/
[root@nhk test]# pwd
/myfile/test
[root@nhk test]# vim Dockerfile
[root@nhk test]# 

Dockerfile参考内容如下

FROM ubuntu
CMD echo 'action is success'

2)docker build构建镜像

[root@nhk test]# docker build .
[+] Building 0.1s (5/5) FINISHED                                                                                                                             => [internal] load build definition from Dockerfile                                                                                                    0.0s=> => transferring dockerfile: 135B                                                                                                                    0.0s=> [internal] load .dockerignore                                                                                                                       0.0s=> => transferring context: 2B                                                                                                                         0.0s=> [internal] load metadata for docker.io/library/ubuntu:latest                                                                                        0.0s=> [1/1] FROM docker.io/library/ubuntu                                                                                                                 0.0s=> exporting to image                                                                                                                                  0.0s=> => exporting layers                                                                                                                                 0.0s=> => writing image sha256:e39580f94507868694e52fb093f68d5e7f146199a46c1b0e4cf28c2c05c4bf12                                                            0.0s
[root@nhk test]# 

3)查看镜像

[root@nhk test]# docker image ls -f dangling=true
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    e39580f94507   19 months ago   72.8MB

4)删除虚悬镜像

虚悬镜像已经失去了存在的价值,可以删除

[root@nhk test]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:e39580f94507868694e52fb093f68d5e7f146199a46c1b0e4cf28c2c05c4bf12Total reclaimed space: 0B
[root@nhk test]# 

自定义镜像myubuntu

1)编写Dockerfile文件

[root@nhk myfile]# mkdir myubuntu
[root@nhk myfile]# cd myubuntu/
[root@nhk myubuntu]# pwd
/myfile/myubuntu
[root@nhk myubuntu]# vim Dockerfile

Dockerfile文件内容如下

FROM ubuntu
MAINTAINER nhk<13606975424@163.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN apt-get update
# RUN apt-get install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "install inconfig cmd into ubuntu success... ok"
CMD /bin/bash

2)docker build 构建镜像

[root@nhk myubuntu]# docker build -t myubuntu:6.6 .
...[root@nhk myubuntu]# docker images
REPOSITORY                   TAG            IMAGE ID       CREATED         SIZE
myubuntu                     6.6            519211dbf26a   6 minutes ago   72.8MB

3)运行新镜像

[root@nhk myubuntu]# docker run -it myubuntu:6.6 
root@b94a506968bf:/usr/local#    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac安装adobe需要注意的tips(含win+mac all安装包)

M2芯片只能安装2022年以后的&#xff08;包含2022年的&#xff09; 1、必须操作的开启“任何来源” “任何来源“设置&#xff0c;这是为了系统安全性&#xff0c;苹果希望所有的软件都从商店或是能验证的官方下载&#xff0c;导致默认不允许从第三方下载应用程序。macOS sie…

力扣(LeetCode)算法_C++——寻找重复的子树

给你一棵二叉树的根节点 root &#xff0c;返回所有 重复的子树 。 对于同一类的重复子树&#xff0c;你只需要返回其中任意 一棵 的根结点即可。 如果两棵树具有 相同的结构 和 相同的结点值 &#xff0c;则认为二者是 重复 的。 示例 1&#xff1a; 输入&#xff1a;root…

php如何设置随机数

第一种方法用mt_rand() 第二种方法&#xff08;最快的&#xff09; 第三种取当时时间戳 第四种打乱字符串 5 //开始创建验证码(直接用函数生成&#xff0c;比较方便快捷) php mt_rand生成0~1随机小数的效果比较 第一种方法用mt_rand() function GetRandStr($length){ $s…

智能合约安全分析,Vyper 重入锁漏洞全路径分析

智能合约安全分析&#xff0c;Vyper 重入锁漏洞全路径分析 事件背景 7 月 30 日 21:10 至 7 月 31 日 06:00 链上发生大规模攻击事件&#xff0c;导致多个 Curve 池的资金损失。漏洞的根源都是由于特定版本的 Vyper 中出现的重入锁故障。 攻击分析 通过对链上交易数据初步分…

Ubutnu允许ssh连接使用root与密码登录

文章目录 1. 修改sshd_config2. 设置root密码3. 重启SSH服务 1. 修改sshd_config 修改/etc/ssh/sshd_config文件&#xff0c;找到 #Authentication&#xff0c;将 PermitRootLogin 参数修改为 yes。如果 PermitRootLogin 参数被注释&#xff0c;请去掉首行的注释符号&#xff…

机器学习:基于梯度下降算法的逻辑回归实现和原理解析

这里写目录标题 什么是逻辑回归&#xff1f;Sigmoid函数逻辑回归损失函数梯度下降 逻辑回归定义逻辑函数线性组合模型训练决策边界 了解逻辑回归&#xff1a;从原理到实现什么是逻辑回归&#xff1f;逻辑回归的原理逻辑回归的实现逻辑回归的应用代码示例算法可视化 当涉及到二元…

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有&#xff1a;基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器&#xff08;DSP&#xff09;。 其中&#xff0c;C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…

SpingBoot整合Sa-Token框架(1)

一、文档参考&#xff1a;框架介绍 (sa-token.cc) 框架生态——开源项目 (sa-token.cc) 二、与SpingBoot整合 1、创建项目 在 IDE 中新建一个 SpringBoot 项目&#xff0c;例如&#xff1a;sa-token-demo-springboot&#xff08;不会的同学请自行百度或者参考&#xff1a;Sp…

代码随想录算法训练营第三十九天 |● 62.不同路径 ● 63. 不同路径 II

题目链接&#xff1a;62.不同路径 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 因为只能向右或则向下走&#xff0c;所以到第i&#xff0c;j位置有dp[i][j]的方法数等于 dp[i - 1] 的方法数加…

macOS Ventura 13.5.1 上 lrzsz无法使用的问题

背景 最近更新了版本从macOS12.4更新到了13.5.1&#xff0c;发现lrzsz无法使用了&#xff0c;具体表现形式是rz选完文件后卡在那个rz waiting to receive.**B0100000023be50&#xff0c;或者sz后卡在**B0100000。 过程 一开始怀疑的是expect的问题&#xff0c;因为我是自己写…

Docker技术入门| Part03:Dockerfile详解(Dockerfile概念、Dockerfile 指令、使用Dockerfile构建镜像)

文章目录 1. Dockerfile概念2. Dockerfile 指令FROM 指定基础镜像RUN执行命令CMD 容器启动命令COPY 复制文件ADD 更高级的复制文件ENV 设置环境变量ARG 构建参数VOLUME 定义匿名卷EXPOSE 暴露端口WORKDIR 指定工作目录USER 指定当前用户LABEL 为镜像添加元数据SHELL 指令 3. 使…

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemarti…

『C语言进阶』指针进阶(一)

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言 &#x1f325;️每日语录&#xff1a;无论你怎么选&#xff0c;都难免会有遗憾。 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 在C语言初阶中&#xff0c;我们对指针有了一定的…

合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)

页面 (Page) 当控件内容过多&#xff0c;无法在屏幕内完整显示时&#xff0c;可让其在 页面 内显示。 示例代码 page lvgl.page_create(lvgl.scr_act(), nil) lvgl.obj_set_size(page, 150, 200) lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0)label lvgl.label_crea…

【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

文章目录 前言一、SpringDoc是什么&#xff1f;二、使用步骤1.引入库2.配置类3.访问测试 总结其他配置立个Flag 前言 之前常用的SpringFox在2020年停止更新了&#xff0c;新项目集成SpringFox出来一堆问题&#xff0c;所以打算使用更活跃的SpringDoc&#xff0c;这里简单介绍一…

Nomad 系列-快速上手

系列文章 Nomad 系列文章 Nomad 重要术语 Nomad 安装设置相关术语 agent - 代理。Agent 是在 Server&#xff08;服务器&#xff09; 或 Client&#xff08;客户端&#xff09; 模式下运行的 Nomad 进程。client - 客户端。Nomad 客户端负责运行分配给它的任务。它还向服务器…

centos编译升级cmake,痛苦的Linux小白

环境 root 用户 下载 cmake官网下载地址&#xff1a;https://cmake.org/download/ 获取下载地址&#xff0c;右击cmake-3.27.4.tar.gz 命令行输入链接地址&#xff0c;下载 wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz解压 tar -zx…

如何重置 docker中的mariadb的root

停止 Mariadb 容器&#xff1a;运行以下命令停止正在运行的 Mariadb 容器&#xff1a; docker stop <container_name>将 <container_name> 替换为你的 Mariadb 容器的名称或容器ID。 删除 Mariadb 容器&#xff1a;运行以下命令删除已停止的 Mariadb 容器&#x…

基于Pytest+Allure+Excel的接口自动化测试框架

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…

鼠标键盘管理 ShareMouse for Mac最新

软件“ShareMouse”允许您通过单个鼠标和键盘控制多台计算机&#xff1a; 将鼠标移动到您想要控制的计算机的监视器上&#xff0c;指针会神奇地跳转到该计算机。任何鼠标和键盘输入都会传输到相应的计算机。 与网络KVM类似&#xff0c;ShareMouse通过本地LAN传输鼠标移动和点…