1.Dockerfile介绍

在之前Docker的使用中,我们直接从仓库下载需要的镜像到本地,然后稍加配置就可以应用了,通常从仓库下载下来的镜像都是通用的,无任何私有化的东西,我们拿过来就需要加很多的配置,每次使用就很麻烦。如果我们想定制化某一个镜像可以吗?比如Nginx,我不想每次使用都加很多的配置,而是定制化后,我再按照定制化的规则去使用,及时的安装部署我需要的Nginx环境。DockerFile就是做这个工作的,一个用基础镜像来构建新镜像的文本文件,里面包含构建镜像需要的各种指令。

1.1 编写Dockerfile

使用Dockerfile构建Nginx镜像,在一个空目录下创建Dockerfile文件

[root@hadoop101 nginx]# pwd
/home/docker_test/docker_files/nginx
[root@hadoop101 nginx]# vim Dockerfile
[root@hadoop101 nginx]# ll
total 4
-rw-r--r-- 1 root root 153 Mar 29 23:33 Dockerfile

Dockerfile内容如下:

FROM nginx

VOLUME ["volume01","volume02"]

RUN echo 'welcome,this is a nginx image of build local.' > /usr/share/nginx/html/index.html

RUN echo '----end----'

RUN /bin/bash

1.2 构建镜像

[root@hadoop101 nginx]# docker build -t zhangbao/nginx001:1.0 .

[root@hadoop101 nginx]# docker build -t zhangbao/nginx001:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM nginx
---> 605c77e624dd
Step 2/5 : VOLUME ["volume01","volume02"]
---> Running in d9ff85f068bf
Removing intermediate container d9ff85f068bf
---> 801484ddbb09
Step 3/5 : RUN echo '构建本地nginx镜像' > /usr/share/nginx/html/index.html
---> Running in 6614ebace633
Removing intermediate container 6614ebace633
---> 29a385ed17b6
Step 4/5 : RUN echo '----end----'
---> Running in 3449cc6cf814
----end----
Removing intermediate container 3449cc6cf814
---> 5d6941c830a4
Step 5/5 : RUN /bin/bash
---> Running in 1f106444b093
Removing intermediate container 1f106444b093
---> 440fd4b943c7
Successfully built 440fd4b943c7
Successfully tagged zhangbao/nginx001:1.0
[root@hadoop101 nginx]#

1.3 运行镜像

docker run -d -p 80:80 zhangbao/nginx001:1.0

访问:http://192.168.88.71/

首页可以查看 welcome,this is a nginx image of build local.

2. Dockerfile构建过程

构建一个新镜像,我们可以大致分为三个步骤:编写Dockerfile文件 > docker build > docker run

2.1 基础知识

Dockerfile的基础知识

  1. 每个关键字(指令)都必须大写

  2. 执行过程从上到下,顺序执行

  3. #为注释

  4. 每个指令代表一层,都会创建提交一个新的镜像层

Dockerfile指令

FROM            指定基础镜像
MAINTAINER 指定作者
RUN 执行参数中定义的命令,构建镜像时需要的命令
EXPOSE 向容器外部公开的端口号
WORKDIR 设置容器内默认工作目录
USER 指定用户
ENTROYPOINT 指定一个容器启动时运行的命令
ENV 设置环境变量
ADD|COPY 复制文件到镜像中
VOLUME 容器数据卷,向镜像创建的容器添加卷
CMD 容器启动时要运行的命令,可以有多个,但只有最后一个生效

2.2 构建过程

Dockerfile的构建过程就是build的执行过程

1.把当前目录和子目录当做上下文传递给docker服务,命令最后的点表示当前上下文。
2.从当前目录(不包括子目录)找到Dockerfile文件,如果不指定文件,必须是此文件名。
3.检查docker语法。
4.从基础镜像运行一个容器。
5.执行指令,修改容器,如上面操作添加数据卷,修改首页。
6.对修改后的容器提交一个新的镜像层,也可叫做中间层镜像。
7.针对中间层生成的镜像,运行新的容器。
8.重复执行修改容器、提交镜像、运行容器指令,直到所有指令执行完成。

注:每条指令都会生成新的镜像,也就是生成中间层镜像,这样执行速度其实会很慢,可以不使用缓存。在构建命令中加上--no-cache=true 即可。可根据实际场景选择是否需要缓存。

3. 构建一个自己的centos

我们已经熟悉了构建Dockerfile的基础指令,现在可以做一些基本实践了。

3.1 运行一个官方centos

首先我们运行一个原生的centos,然后做一些linux的基本操作

[root@hadoop101 ~]# docker run -it centos /bin/bash
[root@a0db59573b95 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@a0db59573b95 /]# ll
bash: ll: command not found
[root@a0db59573b95 /]# vim test
bash: vim: command not found
[root@a0db59573b95 /]# ifconfig
bash: ifconfig: command not found
[root@a0db59573b95 /]#

可以看到,我们已经运行一个centos,然后发现一些基础的命令是没有的,这就说明这个contos是一个压缩版的,如果我们想运行一个有这些命令的镜像呢?这就需要在Dockerfile中做一些操作了?

3.2 编写Dockerfile文件

记住在一个空白的目录下创建Dockerfile文件,我这里文件名dockerfile-mycentos,内容如下:

FROM centos
#指定作者
MAINTAINER zhangbao<zhangbaohpu@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#下载需要的工具类
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo "--end--"
CMD /bin/bash

3.3 构建新镜像

如果是自定义Dockerfile文件名,则构建时必须指定文件名,否则文件名必须是:Dockerfile

[root@hadoop101 mycentos]# docker build -f dockerfile-mycentos -t mysentos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/9 : FROM centos
---> 5d0da3dc9764
Step 2/9 : MAINTAINER zhangbao<zhangbaohpu@163.com>
---> Running in d9b4afe40ef6
Removing intermediate container d9b4afe40ef6
---> 87e522a4dcb6
Step 3/9 : ENV MYPATH /usr/local
---> Running in 2fe975209f1e
Removing intermediate container 2fe975209f1e
---> 30491c2e1634
Step 4/9 : WORKDIR $MYPATH
---> Running in cd9b1810f244
Removing intermediate container cd9b1810f244
---> d2addbefe4f6
Step 5/9 : RUN yum -y install vim
---> Running in d6a8caa012e9
CentOS Linux 8 - AppStream                       64 B/s |  38 B     00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1
[root@hadoop101 mycentos]#

3.4 问题及修复

这时候发现失败了,查问题是centos8的官方源已经下线了,导致yum下载失败。那刚好,我们在自定义镜像的时候可以修复这些问题。只需修改yum的默认源就可以了,这个操作也放在Dockerfile文件内。我们修复后Dockerfile文件如下:

FROM centos
#指定作者
MAINTAINER zhangbao<zhangbaohpu@163.com> #ENV kv格式,这里指定工作目录,及默认进入容器的目录
ENV MYPATH /usr/local
WORKDIR $MYPATH #将原有的yum配置备份下
RUN tar cvf /etc/yum.repos.d.tar /etc/yum.repos.d #修改yum源配置,
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo #删除掉多于的repo文件
RUN rm -rf /etc/yum.repos.d/CentOS-Linux-* #使yum配置更新
RUN yum clean all
RUN yum makecache #下载需要的工具类
RUN yum -y install vim
RUN yum -y install net-tools EXPOSE 80 CMD echo "--end--"
CMD /bin/bash

3.5 重新构建镜像

重新构建下修改后的Dockerfile文件

docker build -f dockerfile-mycentos -t mysentos:1.0 .

[root@hadoop101 mycentos]# docker build -f dockerfile-mycentos -t mysentos:1.0 .
Sending build context to Docker daemon 2.56kB
Step 1/14 : FROM centos
---> 5d0da3dc9764
Step 2/14 : MAINTAINER zhangbao<zhangbaohpu@163.com>
---> Running in 79ff0ddc554d
Removing intermediate container 79ff0ddc554d
---> 0cc1bf4a4ba0
Step 3/14 : ENV MYPATH /usr/local
---> Running in 59d3d432c58c
Removing intermediate container 59d3d432c58c
---> 839ed1e4b944
Step 4/14 : WORKDIR $MYPATH
---> Running in d085e4887d92
Removing intermediate container d085e4887d92
---> 41c10774900b
Step 5/14 : RUN tar cvf /etc/yum.repos.d.tar /etc/yum.repos.d
---> Running in 1ab58ab850c0
/etc/yum.repos.d/
/etc/yum.repos.d/CentOS-Linux-AppStream.repo
/etc/yum.repos.d/CentOS-Linux-BaseOS.repo
/etc/yum.repos.d/CentOS-Linux-ContinuousRelease.repo
/etc/yum.repos.d/CentOS-Linux-Debuginfo.repo
/etc/yum.repos.d/CentOS-Linux-Devel.repo
/etc/yum.repos.d/CentOS-Linux-Extras.repo
/etc/yum.repos.d/CentOS-Linux-FastTrack.repo
/etc/yum.repos.d/CentOS-Linux-HighAvailability.repo
/etc/yum.repos.d/CentOS-Linux-Media.repo
/etc/yum.repos.d/CentOS-Linux-Plus.repo
/etc/yum.repos.d/CentOS-Linux-PowerTools.repo
/etc/yum.repos.d/CentOS-Linux-Sources.repo
tar: Removing leading `/' from member names
Removing intermediate container 1ab58ab850c0
---> bfd1c4cd694c
Step 6/14 : RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
---> Running in 73ebef623f8a
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2495 100 2495 0 0 12351 0 --:--:-- --:--:-- --:--:-- 12351
Removing intermediate container 73ebef623f8a
---> 22812c68f967
Step 7/14 : RUN rm -rf /etc/yum.repos.d/CentOS-Linux-*
---> Running in eb8426f499b0
Removing intermediate container eb8426f499b0
---> 8dc6bd0b4e84
Step 8/14 : RUN yum clean all
---> Running in a508fb503158
0 files removed
Removing intermediate container a508fb503158
---> c6831cfda20f
Step 9/14 : RUN yum makecache
---> Running in 67c3f0dc0a6a
CentOS-8.5.2111 - Base - mirrors.aliyun.com 16 MB/s | 4.6 MB 00:00
CentOS-8.5.2111 - Extras - mirrors.aliyun.com 45 kB/s | 10 kB 00:00
CentOS-8.5.2111 - AppStream - mirrors.aliyun.co 16 MB/s | 8.4 MB 00:00
Metadata cache created.
Removing intermediate container 67c3f0dc0a6a
---> 6ca3b2fbeb13
Step 10/14 : RUN yum -y install vim
---> Running in e81b9f1a4705
Last metadata expiration check: 0:00:05 ago on Tue Apr 5 09:35:43 2022.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-16.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-16.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-16.el8 AppStream 49 k
which x86_64 2.21-16.el8 base 49 k Transaction Summary
================================================================================
Install 5 Packages Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 235 kB/s | 39 kB 00:00
(2/5): which-2.21-16.el8.x86_64.rpm 203 kB/s | 49 kB 00:00
(3/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 776 kB/s | 49 kB 00:00
(4/5): vim-common-8.0.1763-16.el8.x86_64.rpm 16 MB/s | 6.3 MB 00:00
(5/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 5.4 MB/s | 1.4 MB 00:00
--------------------------------------------------------------------------------
Total 19 MB/s | 7.8 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 1/5
Installing : vim-common-2:8.0.1763-16.el8.x86_64 2/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 3/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 3/5
Installing : which-2.21-16.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
Verifying : which-2.21-16.el8.x86_64 1/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 2/5
Verifying : vim-common-2:8.0.1763-16.el8.x86_64 3/5
Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 4/5
Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 5/5 Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
which-2.21-16.el8.x86_64 Complete!
Removing intermediate container e81b9f1a4705
---> 3d731b0904e6
Step 11/14 : RUN yum -y install net-tools
---> Running in f45f6c7c9c8c
Last metadata expiration check: 0:00:17 ago on Tue Apr 5 09:35:43 2022.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.52.20160912git.el8 base 322 k Transaction Summary
================================================================================
Install 1 Package Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 934 kB/s | 322 kB 00:00
--------------------------------------------------------------------------------
Total 930 kB/s | 322 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Installed:
net-tools-2.0-0.52.20160912git.el8.x86_64 Complete!
Removing intermediate container f45f6c7c9c8c
---> adc0f183e07e
Step 12/14 : EXPOSE 80
---> Running in 9422041e18c2
Removing intermediate container 9422041e18c2
---> e94ae254891f
Step 13/14 : CMD echo "--end--"
---> Running in 9183b6a1444d
Removing intermediate container 9183b6a1444d
---> c3978bb3cb17
Step 14/14 : CMD /bin/bash
---> Running in 536c8de964d3
Removing intermediate container 536c8de964d3
---> 68f0ddc7c99f
Successfully built 68f0ddc7c99f
Successfully tagged mysentos:1.0
[root@hadoop101 mycentos]#

总共分为14步,即每个指令一步,也表示每一步算一层。整个构建过程还是很详细的。

3.6 运行自定义镜像

自定义镜像已经构建完成,下面我们开始运行镜像,并检测下基础命令

[root@hadoop101 mycentos]# docker run -it mysentos:1.0
[root@2f70cc22b493 local]# pwd
/usr/local
[root@2f70cc22b493 local]# ll
bash: ll: command not found
[root@2f70cc22b493 local]# vim test
[root@2f70cc22b493 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@2f70cc22b493 local]#

可以看到 vimifconfig 命令已经可以使用,ll 命令还需要下载对应的工具包,这里就不在下载了。

更多请在某公号平台搜索:选手一号位,本文编号:2003,回复即可获取。

Dockerfile入门的更多相关文章

  1. docker入门-Dockerfile入门

    1.dockerfile 构建基础命令 2. 构建镜像命令 Usage: docker image build [OPTIONS] PATH | URL | -Options:-t, --tag li ...

  2. 4.Docker容器学习之Dockerfile入门到放弃

    原文地址: 点击直达 0x01 Dockerfile 编写 描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内 ...

  3. Docker(四)Dockerfile入门

    摘自: https://mp.weixin.qq.com/s/Im4axroExgrJoj05g_TQ-w 一.Docker的工作流程 Docker组件协作运行容器可以分为以下几个过程: Docker ...

  4. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  5. 【云计算】Dockerfile、镜像、容器快速入门

    Dockerfile.镜像.容器快速入门 1.1.Dockerfile书写示例 Dockerfile可以用来生成Docker镜像,它明确的定义了Image的生成过程.虽然直接修改容器也可以提交生成镜像 ...

  6. Docker入门之七Dockerfile

    Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像.首先我们可以先看一个dockerfile是什么样子.这里可以有一个网站不错:http://dockerfile.github ...

  7. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  8. Docker 入门教程(3)——Dockerfile

    Dockerfile Dockerfile是一个文本文件,用来定制镜像. 镜像是分层存储的,前一层会是下一层的基础.而镜像的定制就是定制每一层镜像在上一层做了什么改变. Dockerfile其内包含一 ...

  9. Docker 快速入门之 Dockerfile

    在 Docker 中我们可以从名为 Dockerfile 的文件中读取指令并且自动构建镜像.在本文中,将介绍 Dockerfile 的基本语法以及基本知识. Dockerfile 是什么 Docker ...

随机推荐

  1. ArcGIS对进行数据拓扑修改

    空间数据处理--题目1 土地利用数据每年都在发生变化,故每年都要根据去年的数据进行修改.请根据以下要求,修改A区域的数据并对B区域已做好的数据进行拓扑检查. 一. 数据说明(见"题目1&qu ...

  2. Net Framework 中托管代码与非托管代码的区别

    托管代码与非托管代码的区别 1 简单的说,就是代码被编译成MSIL后在.net的Framework下运行,同操作系统底层的交互都交给framework去做. 所谓非托管代码就是脱离了Framework ...

  3. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

    对. 因为equals()方法可以用开发者重写,hashCode()方法也可以由开发者来重写,因此它们是否相等并没有必然的关系. 如果对象要保存在HashSet或HashMap中,它们的equals( ...

  4. Dubbo 使用过程中都遇到了些什么问题?

    在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解 无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确

  5. MySQL 根据JSON类型的字段进行过滤数据的方式

    第一种方式:JSON_CONTAINS 函数 : 执行相等形式的比较 注意:值的类型一定要相同,不然会报错 文档地址:https://dev.mysql.com/doc/refman/8.0/en/j ...

  6. 关于kafka客户端版本与服务端版本不一致导致的一次坑

    上周开发了一个功能,需要使用kafka接上游数据并入库,本地开发时,自己安装了一个kafka服务,开发测试时使用本地的kafka服务给主题发消息,然后在自己本地的代码中进行调试.使用的kafka版本如 ...

  7. MySQL安装速成指南(ZIP)

    MySQL初始化数据库 第一步:将MySQL ZIP压缩包进行解压 第二部:在MySQL主目录创建my.ini文件,并添加以下内容 [client] port=3306 socket=/tmp/mys ...

  8. 学习openstack(五)

    OpenStackOpenStack介绍OpenStack是一种免费的开源平台,帮助服务提供商实现类似于亚马逊EC2和S3的基础设施服务.OpenStack当前有三个核心项目:计算(Nova),对象存 ...

  9. 学习saltstack (四)

    一.salt常用命令 salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令 salt [options] '<target>' <function ...

  10. Spark学习摘记 —— Pair RDD行动操作API归纳

    本文参考 参考<Spark快速大数据分析>动物书中的第四章"键值对操作",本篇是对RDD转化操作和行动操作API归纳的最后一篇 RDD转化操作API归纳:https:/ ...