Docker构建文件Dockerfile简单入门

Docker构建文件Dockerfile简单入门

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的基础知识

每个关键字(指令)都必须大写执行过程从上到下,顺序执行#为注释每个指令代表一层,都会创建提交一个新的镜像层

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]#

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

更多关于Docker构建文件Dockerfile的说明请查看下面的相关链接

推荐阅读

    聊聊docker下怎么启动容器

    聊聊docker下怎么启动容器,镜像,应用程序,下载,启动,名称,命令,Docker是一种轻量级的虚拟化解决方案,可以将应用和其所有的依赖性封装到一个独立

    如何在linux上安装docker

    如何在linux上安装docker,安装,运行,命令,步骤,用户,版本,随着容器技术的兴起,Docker 已经成为了最为流行的容器引擎。它可以快速构建、部署、运

    如何彻底卸载docker

    如何彻底卸载docker,删除,命令,软件包,文件,卸载,步骤,随着云计算和容器技术的快速发展,Docker已成为现今最流行的容器化应用平台之一。然而,对于

    如何启动docker中的容器

    如何启动docker中的容器,启动,命令,服务,镜像,文件,方法,Docker是一种流行的容器化平台,容器是一种轻量级、可移植的软件包,包含软件应用程序及其

    docker安装的详细步骤

    docker安装的详细步骤,安装,步骤,命令,软件包,系统,应用程序,Docker是一款开源的容器化应用程序,它可以将应用程序及其依赖项打包到一个容器中,从

    怎么给docker换镜像源

    怎么给docker换镜像源,镜像源,镜像,加速器,加速,步骤,命令,随着Docker的普及,越来越多的人开始使用它来构建和部署应用程序。不过,当我们使用Dock

    怎么启动docker

    怎么启动docker,启动,命令,安装,执行,删除,名称,Docker 是一个由 Linux 内核提供的容器化引擎,可以在同一台主机上运行多个容器,这些容器彼此隔离

    docker怎么删除镜像

    docker怎么删除镜像,镜像,删除,命令,系统,执行,名称,Docker是一个用于开发、运行和部署应用程序的开放平台,可以轻松地将应用程序与所依赖的库打

    docker是啥意思

    docker是啥意思,虚拟化,核心,镜像,应用程序,服务器,虚拟机,docker有两种意思:1、指英文单词docker,其中文翻译是“码头工人”;2、指Docker容器,是一

    docker如何正确删除指定容器

    docker如何正确删除指定容器,删除,命令,备份,镜像,数据,运行,随着云计算和虚拟化技术的不断发展,Docker 容器已经成为了应用程序开发和部署的重

    docker怎么在windows上安装

    docker怎么在windows上安装,安装,运行,应用程序,启用,命令,镜像,Docker是一个非常流行的容器化技术,可以在不同的平台上实现应用程序的封装、分

    docker环境怎么进

    docker环境怎么进,镜像,命令,名称,用于,操作,运行,Docker是一种容器化技术,方便开发者进行应用程序的部署和管理。Docker环境是在操作系统上的一

    docker是一个软件吗

    docker是一个软件吗,虚拟化,虚拟机,运行,平台,开发者,用于,docker是一个软件,是一个运行与linux和windows上的软件,用于创建、管理和编排容器;dock