创建一个Dockerfile
[root@server1 ~]# docker rm demo
[root@server1 ~]# docker rmi demo:v1
[root@server1 ~]# mkdir docker
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
RUN mkdir westos
构建镜像
[root@server1 docker]# docker build -t demo:v1 .
从当前目录中找Dokerfile ,运行里面的指令
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v1
在history里我们可以详细的看到所运行的所有指令。一目了然。
Dokerfile 最佳实践
每一步操作都是由docker commit来实现的,每一条指令生成一个镜像层
[root@server1 docker]# vim Dockerfile
FROM demo:v1
RUN touch file2
RUN mkdir redhat
[root@server1 docker]# docker build -t demo:v2 .
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v2
在demo:v1的基础上又加了两层
四、Dockerfile详解
还原环境
[root@server1 docker]# docker rmi demo:v1
[root@server1 docker]# docker rmi demo:v2
1.dockerfile常用指令
(1) FROM
指定base镜像,如果本地不存在会从远程仓库下载。
(2) MAINTAINER
设置镜像的作者,比如用户邮箱等。
(3) COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest 和 COPY [“src”, “dest”]
src必须指定build context中的文件或目录
示例:
[root@server1 docker]# vim index.html
www.sun.com
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
查看
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v1
进入交互式页面,查看刚才指令是否执行成功
[root@server1 docker]# docker run -it --rm demo:v1
(4)ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:
示例:
[root@server1 docker]# tar zcf test.tar.gz /etc
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
[root@server1 docker]# docker build -t demo:v2 .
查看效果:
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v2
[root@server1 docker]# docker run -it --rm demo:v2
(4) ENV
设置环境变量,变量可以被后续的指令使用:
ENV HOSTNAME sevrer1
示例:
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
[root@server1 docker]# docker build -t demo:v3 .
查看命令和之前相同,这里直接验证最后结果
(5) EXPOSE
如果容器中运行应用服务,可以把服务端口暴露出去:
EXPOSE 80
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
[root@server1 ~]# docker run -d --name demo -P nginx
[root@server1 ~]# docker inspect demo
随机指定端口:
(6) VOLUME
申明数据卷,通常指定的是应用的数据挂在点:
VOLUME [“/var/www/html”]
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# docker build -t demo:v4 .
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v4
[root@server1 docker]# docker run -it --name demo demo:v4
/ # cd /data/
/data # ls
/data # touch dokerfile1
这里不要直接退出,将其打入后台 CTRL+P+Q,保证进程 一直存在
查看/data是否成功挂载
[root@server1 docker]# docker inspect demo
上图我们看到/data实际上挂载到了我选中的那个路径中,数据也存在在宿主机里面,然后我们测试删掉文件,然后重新见一个文件,再次进入demo中查看,我们新建的文件也存在。说明容器可以做数据持久化。
[root@server1 docker]# cd /var/lib/docker/volumes/ad7567a0c7d9a0694ea1f3ea1798bd12a8b1f3eb036a8cd3476359c6c7e6db19/_data
[root@server1 _data]# ls
dokerfile1
[root@server1 _data]# rm -f dokerfile1
[root@server1 _data]# cp /etc/passwd .
passwd
[root@server1 _data]# docker attach demo
/data # ls
passwd
用以下命令我们可以将没有被挂载的数据
[root@server1 _data]# docker rm demo
demo
[root@server1 _data]# docker volume ls
DRIVER VOLUME NAME
local ad7567a0c7d9a0694ea1f3ea1798bd12a8b1f3eb036a8cd3476359c6c7e6db19
[root@server1 _data]# docker volume prune
(7) WORKDIR
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。
(8) RUN
在容器中运行命令并创建新的镜像层,常用于安装软件包:
(9) CMD 与 ENTRYPOINT
这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
示例:
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]
CMD echo "hello world"
[root@server1 docker]# docker build -t demo:v5 .
[root@server1 docker]# docker run --rm demo:v5
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]
CMD ["/bin/sh", "-c", "echo hello $HOSTNAME"] ## 解析变量
[root@server1 docker]# docker build -t demo:v9 .
[root@server1 docker]# docker run --rm demo:v9
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]
ENTRYPOINT ["echo hello"]
CMD ["world"]
[root@server1 docker]# docker build -t demo:v10 .
[root@server1 docker]# docker run --rm demo:v10
[root@server1 docker]# docker run --rm demo:v10 linux
我们可以看的CMD后的东西是可以被覆盖的
五、配置镜像加速器
容器镜像服务
在阿里云注册,每个人都可以有免费加速
[root@server1 docker]# cd /etc/docker/
[root@server1 docker]# vim daemon.json
{
"registry-mirrors": ["https://2r0ei25n.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl reload docker.service
六、镜像的优化
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去用构建缓存
- 使用多阶段构建镜像
1.实例分析:
这里我们使用nginx镜像制作作为示例
首先我们需要搭建base,这里使用的是rhel7,
链接:rhel7 提取码: k2dm
[root@server1 test]# docker load -i rhel7.tar
- 编写Dockerfile 文件
[root@server1 ~]# mkdir test
[root@server1 ~]# cd test/
[root@server1 test]# vim Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make && yum clean all
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
这里我们还需要nginx-1.18.0的tar包放在test目录下
链接:nginx tar包 提取码: tscn
还需要将本地的yum源放置test目录下
[root@server1 test]# docker build -t webserver:v2 .
[root@server1 test]# docker images
这里我们看到我们构建出来的nginx镜像144M,由于我们知道官方的nginx镜像是133M,所以需要做优化。
我们可以看到刚才的base rhel7就占140M,我们要再优化的话只能从base入手,所以我们需要换一个小一点的base
下面我们就使用goole最简base做实验,对比刚才做好的镜像大小。
七、构建nginx容器镜像
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-UYnl2IT6-1712656843483)]