Docker 【通过Dockerfile构建镜像】【docker容器与镜像的关系】

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

命令列子
FROM指定镜像的依赖可以有多条。但多个相连的FROM指令只会执行最后一个。详情在#指令详情中说明
RUN指定运行命令 RUN ls ./相当于在镜像构建目录下的shell窗口中执行ls ./ 命令
COPY将本地文件copy到镜像支持正则表达式拷贝(COPY /local? .)所有匹配local?的文件目录都会拷贝
ADD同COPY一样,但是更强大(支持更多的文件类型的拷贝 如网络文件的下载后拷贝,ADD http://xxxx/test.tar.gz /test/)拷贝归档文件(.tar .gz等)文件会在复制到镜像的过程中自动解压
USER指定Dockerfile后续命令使用哪个用户身份执行,默认root。
WORKDIR目录切换指令,类似shell的cd
ENV指定运行容器时的环境变量
CMD用来指定由镜像创建的容器启动后执行的命令,比如你想让容器启动服务,就可以通过它设置 只能有一条出现多条则最后一条生效
ENTRYPOINT作用CMD类似,但与CMD同时使用时可能会将CMD的值最为参数

2 指令详情

  • FROM
    当遇到FROM指令时,docker会在本地库寻找对应的镜像库
    如果没有发现,则通过docker pull拉取,如果存在则使用本地下载的镜像库
    版本号不一致的镜像是不同的node:16.16.20node:18.18.1 是两个不同镜像
FROM  node; # 当前镜像依赖node镜像

FROM可以多条使用,但不能连续使用。多条使用一般用于Docker多阶段构建

# 第一阶段
FROM node:14 AS build # 使用node:14镜像 设置构建阶段别名提供给COPY --from 访问
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build # 操作完成产生打包结果文件

# 第二阶段
FROM node:14-alpine # 使用node:14-alpine镜像此时将会替换掉之前node:14镜像
WORKDIR /app
COPY --from=build /app . # 复制 build构建阶段下的/app目录到镜像目录
CMD ["node", "index.js"]

连续使用,只有最后一条生效

FROM node:16.16.1
FROM node:18.18.1 # 此条生效


  • RUN
    设置镜像执行命令
RUN npm i # 相当于在镜像目录的shell窗口中执行npm i


  • COPY
    将本地文件活目录拷贝至镜像目录

    • 只能将本地文件拷贝到镜像,不能将镜像文件拷贝到本地
    • 拷贝的源路径只能处在当前构建镜像的上下文的目录下,通过docker build命令的url参数指定构建上下文
    • 语法:COPY [--chown=<user>:<group>] <源路径>... <目标路径>
 COPY /local /app # 将本地/local 下的所有文件、目录拷贝到镜像/app目录下
 COPY /local1 /local2 /app # 可以由多个源路径,它会将本地/local1 和 /local2下的所有文件、目录拷贝到镜像/app下
 COPY /local\* /app # 支持通配符,将本地/local1 /local2 /local3 /local...等符合匹配规则的路径复制到镜像/app下
 COPY --chown=user1:group1 /local /app # 本地文件复制到镜像后,将它归属设置为user1用户和group1组


  • ADD
    也是用于将本地文件拷贝到镜像中,但是它与COP有些不同

    • 可以COPY远程文件,类似于 自动下载远程文件-》移动至镜像
    • 在拷贝归档文件(.tar等压缩文件)时会在拷贝至镜像的过程中自动解压
ADD http://www.test.com/test.tar . # 会自动自动解压到镜像文件

请注意!即便ADD命令能够自动解压tar等压缩文件,官方的Dockerfile使用规范仍推荐使用COPY复制压缩文件,配合解压命令解压。这样在语法上更加明确

// Dockerfile
COPY test.tar .
RUN tar -vxf ./test.tar # 执行tar -vxf解压


  • USER
USER [用户名]:[用户组]


  • WORKDIR
    修改镜像当前上下文目录,类似linux cd命令。
WORKDIR ./src # 之后的指令上下文都是./src
RUN ls ./ 


  • CMDENTRYPOINT
    CMD和ENTRYPOINT指令都是用来指定镜像创建的容器启动时执行的指令,相当于在容器启动时开启了一个shell窗口,然后运行CMD和ENTRYPOINT的指令参数。

它们有相同的语法:

# CMD <shell 命令> 
CMD echo 11;// 容器启动执行 echo 11
ENTRYPOINT echo 11; // 同上

# CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

CMD ["node","-inspect","index.js"] # 相当于shell窗口执行 node -inspect index.js
ENTRYPONT ["node","-inspect","index.js"] // 同上

如果CMDENTRYPONT同时使用

1. `ENTRYPONT`是数组
```
CMD ["--inspect","index.js"]
# or
CMD echo 11

ENTRYPONT ["node"]

```
 `CMD`会作为`ENTRYPONT`的参数,相当于容器启动时执行
```
node --inspect index.js
# or
node echo 11

```
2. `ENTRYPONT`不是数组,`ENTRYPONT`无法接受参数最终只执行ENTRYPONT
```
CMD echo 或者 CMD ["hello"]
ENTRYPONT echo 

```
 最终容器执行
```
echo

```

  • ENV
    定义环境变量,定义之后就可以在后面的任何命令中使用。
    并且连续多次定义ENV的话,它将会叠加而不是覆盖,下面的例子可以访问3个环境变量
ENV $var1 value1; # 定义单个
ENV $var2=value2 $var3=$value3 # 定义多个

RUN echo $var1
COPY $var1 /app
ADD ./src/$var1 /app
CMD echo $var1
WORKDIR $var1

它会在容器内部存在,你可以在代码中访问环境变量

console.log(process.env.$var1);


四、Dockerfile文件规范

  • Dockerfile文件名首字母最好约定大写,因为大多数工具(包括Docker CLI和Docker Compose)都会默认查找名为"Dockerfile"的文件来构建镜像。如果你想指定文件名
docker build -f myDockerfile -t my-image .

  • Dockerfile指令不区分大小写,但是为方便和参数做区分,通常指令使用大写字母。
from node # 这样也可以

FROM node # 这样更清晰

  • Dockerfile中指令按顺序从上至下依次执行。
  • Dockerfile中第一个非注释行必须是FROM指令,用来指定制作当前镜像依据的是哪个基础镜像。
  • Dockerfile中需要调用的文件必须跟Dockerfile文件在同一目录下,或者在其子目录下,父目录或者其它路径无效

五、docker运行build时发生了什么?

当你运行docker build命令构建Docker镜像时,Docker会执行以下步骤:

  • 读取Dockerfile:Docker首先读取Dockerfile,解析其中的指令。
  • 加载构建上下文:Docker将Dockerfile所在的目录(或者你在docker build命令中指定的其他目录)作为构建上下文,将其所有文件和目录发送到Docker守护进程。
  • 执行Dockerfile中的指令:Docker按照Dockerfile中的顺序,一条一条地执行指令。每执行一条指令,Docker都会创建一个新的容器,运行指令,然后提交这个容器为一个新的镜像层。这个过程会重复,直到所有指令都被执行。
  • 对于FROM指令,Docker会加载指定的基础镜像。如果基础镜像不存在,Docker会尝试从Docker Hub或其他配置的镜像仓库下载它。
  • 对于RUN指令,Docker会在当前的镜像上启动一个新的容器,然后在这个容器中运行指令。完成后,Docker会提交这个容器为一个新的镜像层。
  • 对于COPY和ADD指令,Docker会从构建上下文中复制文件或目录到镜像中。完成后,Docker会创建一个新的镜像层。
  • 对于CMD和ENTRYPOINT指令,Docker会设置镜像的默认命令和/或入口点。这些指令不会创建新的镜像层。
    保存最终的镜像:当所有指令都被执行后,Docker会保存最终的镜像。如果你在docker build命令中指定了镜像的标签,Docker会将这个标签应用到最终的镜像。

以上就是docker build命令构建Docker镜像的基本过程。这个过程可能会根据你的Dockerfile和构建上下文的具体内容有所不同。


六、调试手段

1. 修改镜像打包后,如何验证新内容已更新至镜像

通过镜像创建容器

$ docker create --name containerName imageName

进入容器

docker exec -it containerName /bin/bash # 请注意是容器名不是容器id

在容器内部查看对应的目录结构是否存在

ls ./ # 检查更新的相应的目录结构是否存在


为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Q是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-fWWy3fjd-1713126823950)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值