首页 > 其他分享 >Dockerfile编写

Dockerfile编写

时间:2024-01-05 16:56:32浏览次数:42  
标签:centos 0.0 nginx html 镜像 编写 docker Dockerfile

什么是 Dockerfile?为什么要编写dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
为什么要编写这个呢,官方不是已经有镜像了吗?
写dockerfile主要是为了自定义镜像,比如官方给你提供的centos镜像里面就是没有vim,ifconfig等等命令的
你想不想做到使用这个镜像启动的容器就自带这些命令呢,这个是可以做到的,但是就得自定义镜像了,也就是编写dockerfile
docker会跟你编写的dockerfile文件来按照你的想法来帮你完成镜像的制作

如何编写dockerfile

首先是基本参数

  1. FROM
  2. MAINTAINER
  3. RUN
  4. COPY
  5. CMD
  6. ADD

这些是基本的参数,我们来一条条介绍

FROM

这个参数的意思就是使用哪个基础镜像来构建你的镜像,比如你想要在官方的centos镜像上安装vim,那么你就是在官方的centos镜像上做的修改,那么这里的FROM就是centos
当然,你也可以在你自己已经做好的镜像上再次镜像修改
比如你已经做好了一个镜像centos:v1 这个镜像里面是安装了vim的,那么你现在想再写一个dockerfile,想要将你自己的镜像再安装一个ftp
那么这里你的镜像就可以写成centos:v1那么这个时候docker就会在你自己制作的镜像之上再去安装ftp了,这个就是FROM

示例
FROM centos:latest
FROM centos:v1

MAINTAINER

这个参数就比较简单了,就是告诉别人这个镜像的制作者/维护者是谁,可以随意编写,甚至可以省略这个参数

示例
FROM centos
MAINTAINER fsd

RUN

这个就是在构建镜像的过程中,在镜像内部执行的命令,注意,是构建镜像的过程中,也就是说他只会在你构建镜像的时候执行,等到镜像构建完之后你使用这个镜像去启动容器他是不用执行的,因为之前就已经执行过了
比如我想在构建的时候就让他安装vim

示例
FROM centos
RUN yum install vim -y
注意,一定要加上 -y让他自动yes,因为在他构建的过程中你是无法与他进行交互的,所以你得让他自己yes
这个镜像构建好了之后你再去使用这个镜像去启动容器,那么你会发现,容器内就自带vim了,官方的是没有的哦

COPY

COPY见名知意,就是拷贝的意思,将宿主机上的文件拷贝到你要制作的镜像内部
比如你用官方的nginx,他的默认页面是welcome to nginx ,那么你就可以使用COPY将你想要的index.html文件给他传入进去,那么他的默认页面也就变成你想要的了

示例
FROM nginx
COPY ./index.html /usr/share/nginx/html/index.html

注意,这里的./index.html只能是在当前目录下存在的文件,如果你的index.html 放在/opt下。你这个地方写的是/opt/index.html 那么他在构建镜像的时候是会报错的

CMD

CMD 是用来指定容器创建时的默认命令,也是就你在使用这个镜像启动容器的时候容器最终执行的命令,容器是为应用而生的,如果容器内的命令执行完毕了,那么容器的生命周期也就结束了
这个CMD就是用来指定他应该执行啥命令的

RUN和CMD的格式

RUN 和 CMD都是有2种格式去编写的
第一种是shell格式
第二种是exec格式

shell格式的长相

RUN <shell命令>
这个也就是你在Linux里面命令是怎么敲的这里就怎么写
比如
RUN yum install httpd -y && yum remove httpd -y
这种就是shell格式,比较好理解

exec 格式

RUN ["可执行命令","参数1","参数2",……]

ADD

ADD参数也是可以将文件传入到镜像内,那他跟COPY的区别是,如果传入的是个压缩包,那么COPY只会把压缩包传进去,不会做其他任何操作
那么如果是使用的ADD的话,他会将你的压缩包解压完然后再传入,你启动容器看到的就不是一个压缩包了,而是压缩包里面的内容
但是如果传入的就是一个普通的文件的话,那么他俩没有区别
>示例
FROM centos:7
COPY aaa.txt /opt
ADD aaa.tar /mnt

实验

实验需求,编写dockerfile,要求使用构建出来的镜像启动容器时会自动启动nginx,并且curl容器会返回hello nginx

# dockerfile
FROM centos:7
# 这里的RUN可以写多条,这里的意思是创建安装wget ,使用wget去下载阿里镜像站的源,安装epel源,使用epel源去安装nginx
RUN yum install wget -y && wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum install epel-release  -y && yum install nginx -y
COPY index.html /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
[root@docker docker]# echo "hello nginx" > index.html 
[root@docker docker]# cat index.html 
hello nginx
[root@docker docker]# docker build -t nginx:v1.0 .
[+] Building 0.1s (8/8) FINISHED                                                             docker:default
 => [internal] load build definition from Dockerfile                                                   0.0s
 => => transferring dockerfile: 320B                                                                   0.0s
 => [internal] load .dockerignore                                                                      0.0s
 => => transferring context: 2B                                                                        0.0s
 => [internal] load metadata for docker.io/library/centos:7                                            0.0s
 => [1/3] FROM docker.io/library/centos:7                                                              0.0s
 => [internal] load build context                                                                      0.0s
 => => transferring context: 49B                                                                       0.0s
 => CACHED [2/3] RUN yum install vim net-tools wget -y && wget -O /etc/yum.repos.d/CentOS-Base.repo h  0.0s
 => [3/3] COPY index.html /usr/share/nginx/html/index.html                                             0.0s
 => exporting to image                                                                                 0.0s
 => => exporting layers                                                                                0.0s
 => => writing image sha256:cf3390c86b18f6e40b4201f8c0892c14ca9ca406d87dbae9fad1bf42d7c2edd1           0.0s
 => => naming to docker.io/library/nginx:v1.0 
[root@docker docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v1.0      cf3390c86b18   22 seconds ago   568MB

# 使用镜像创建容器,使用curl命令查看是否返回hello nginx
[root@docker docker]# docker run -itd --name web nginx:v1.0 
17805dfa6bd2fa3284b848b9cc30d12959ab26f5e29b2c3f2dedfdc52dfb01c5
[root@docker docker]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS     NAMES
17805dfa6bd2   nginx:v1.0   "nginx -g 'daemon of…"   3 seconds ago    Up 2 seconds              web
# 查询容器内部IP
[root@docker docker]# docker inspect web |grep -i IPaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.5",
                    "IPAddress": "172.17.0.5",
[root@docker docker]# curl 172.17.0.5
hello nginx

标签:centos,0.0,nginx,html,镜像,编写,docker,Dockerfile
From: https://www.cnblogs.com/fsdstudy/p/17947306

相关文章

  • 使用Go语言编写高效的HTTP服务器
    随着互联网的快速发展,HTTP服务器在Web开发中扮演着越来越重要的角色。而Go语言作为一种高效、并发性强的编程语言,为编写高性能的HTTP服务器提供了强大的支持。本文将探讨如何使用Go语言编写高效的HTTP服务器。首先,我们需要了解Go语言的HTTP模块。Go语言的标准库中提供了net/http包,......
  • 在Java HttpURLConnection库上编写一个下载程序下载美图秀秀的图片
    在JavaHttpURLConnection库上编写一个下载程序,该下载程序使用Kotlin下载https://xiuxiu.meitu.com/的内容,代码必须使用以下代码:代理主机:www.duoip.cn,代理端口:8000。importjava.io.BufferedReaderimportjava.io.InputStreamReaderimportjava.net.HttpURLConnectionimportjav......
  • python 编写一个脚本 输入字符串 返回其长度 生成api接口
    python编写一个脚本输入字符串返回其长度生成api接口fromflaskimportFlask,request,jsonifyapp=Flask(__name__)@app.route('/get_length',methods=['POST'])defget_length():data=request.get_json()if'input_string'indata:......
  • python 编写api接口 用户能够发送http请求 输入一个字符串 返回其长度
    你可以使用Python中的Flask框架来编写一个简单的API,使用户能够通过HTTP请求发送字符串并获取其长度。首先,确保你已经安装了Flask,如果没有,可以使用以下命令安装:pipinstallflask然后,创建一个Python文件,比如 app.py,并使用以下代码编写一个简单的API:fromflaskimportFl......
  • 文档编写10要素
    1、明确文档目的在开始编写文档之前,确保清楚了解文档的目的和受众,以便能够更好地针对他们的需求和期望进行编写。2、计划和组织在开始编写文档之前,进行计划和组织,列出要讨论的主题和子主题,并确定适当的文档结构。这可以帮助更好地组织思路,并确保文档具有清晰的逻辑和易于理解。......
  • 网络攻防技术——shellcode编写
    实验5:shellcode编写实验实验内容:shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是......
  • windows下编写lua脚本生成exe
    之前我有个想法,想在window下,远程执行服务器Linux下的某个脚本,我第一时间想到的是用jekenis,但感觉如果能对输入参数更灵活操作,会更好些,然后发现一个比较有意思的工具srlua ,它可以将lua编写的代码打包输出成exe文件。srlua目录内容如下:操作说明:glue.exesrlua.exetest.lu......
  • python学习笔记3(概述、开发工具、编写方法、print简单语法)
    上一节学习了环境准备、职业方向、执行方式三个方面学习本节内容:(一)概述1、了解python语言1989年荷兰人发明、面向对向、解释型设计哲学:优雅、明确、简单,“人生苦短,我用python”脱水语言,能够和其他语言编写的模块轻松联结,“脱水语言”2、版本发展历程发展历程比较简单,前两天我在网上......
  • 在 PyCharm 中编写 Vue 项目,你可以按照以下步骤进行: 1. **安装 Vue.js 插件**:在 PyCh
    在PyCharm中编写Vue项目,你可以按照以下步骤进行:1.**安装Vue.js插件**:在PyCharm中,选择`File->Settings…->Plugins`,搜索Vue并点击安装,安装后重启PyCharm¹²。2.**设置JavaScript**:支持Vue语法,选择`File->Settings…->Languages&Frameworks->JavaSc......
  • Adobe InCopy 2024 v19.0 (macOS, Windows) - 编写和副本编辑软件
    AdobeInCopy2024v19.0(macOS,Windows)-编写和副本编辑软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD作者主......