docker之dockerFile

概念

我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,这个脚本就是Dockerfile;
Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;

dockerFile指令

基本指令如图:

从上图我们可以看到dockerFile的一些相关指令,
完整指令如图:

自定义一个centos镜像


我们现在写一个dockerFile自定义一个centos镜像让它有这些命令;

构建一个dockerFile我们一定要有一个dockerFile文件,文件的命名可以随意,但是不建议随意命名,官方的命名就是DockerFile;
我们在本机的home目录下新建一个文件dokerFile

cd /home
mkdir dockerFile
cd dockerFile
vim myDokerFile-centos


可以看到我们是基于centos来构建的,注明了作者,定义了一个MYPATH的环境变量并指定为工作目录,在运行构建的时候安装vim命令和网络工具,对外暴露的是80端口,容器启动的时候输出自定义的环境变量,构建完成后输出一个bilid-end标记;最后跳转到默认的控制台;

有了这个dockerFile后我们基于它构建一个我们自己的镜像

docker build -f myDokerFile-centos -t mycentos:1.0 . # -f指哪个文件 不指定就会去找默认的名为DockeFile的文件 -t起个镜像的名字 注意最后的点别掉了

我们通过命令看下镜像的构建历史,可以看到镜像确实是按照我们的命令一层一层构建的;而且每一条命令执行完毕,就提交生成一个新的镜像层;

CMD & ENTRYPOINT

疑问?我们构建镜像的时候,用了三个CMD命令,发现只有最后一个CMD命令生效了,其实关于dockerfile 的CMD和ENTRYPOINT 命令有一个的区别,其中一个最主要的区别的时,CMD,ENTRYPOINT 命令编写多个时会只有最后一个生效,其中CMD命令如果在启动的时候加了命令会被替换,而ENTRYPOINT命令如果在启动的时候加了命令是在原命令中追加;具体实践很简单,自己尝试下即可;

CMD和ENTRYPOINT的应用场景

比如我们指定环境的运行内存时,如果我们用了CMD命令,那么用户在启动镜像的时候就可以更改;如果我们使用了ENTRYPOINT命令,那么用户只能在启动容器的时候追加命令,不能更改;

如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT 的参数;

如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

dockerFile卷挂载

之前我们使用-v命令指定了tomcat的目录挂载,接下来我们看看另外一种挂载方式:dockerFile卷挂载

同样我们还是在home目录下新建一个测试目录,测试下dockerFile的卷挂载
gN41Vx.png
vim 进去我们编写一个简单的dockerFile脚步

FROM centos
VOLUME ["/datavolume01","/datavolume02]
CMD echo "------build-end-----"
CMD /bin/bash

注📢:命令后面都要用空格
我们执行看下

执行完毕后,我们启动刚刚创建的镜像,看下下面的挂载,果然已经挂载了我们需要的目录

接下来我们进入datavolume01下,新建一个aaa.text文件,后面看下这个文件被同步到哪里去了;

我们新开一个窗口,看下运行中的docker,因为我们运行镜像时没有起容器的别名,所以docker给了个默认的名称,我们看最新运行的那个镜像即可

"Mounts": [
    {
        "Type": "volume",
        "Name": "b50422404045013251322ac0e02f64aee621898a89c1d78c0d78e77b53724eaa",
        "Source": "/var/lib/docker/volumes/b50422404045013251322ac0e02f64aee621898a89c1d78c0d78e77b53724eaa/_data",
        "Destination": "/datavolume01",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "d8383a8dc4b2016c0df7a29fe05f6b3dabd57565d63624e83a6ca08719ccbfb0",
        "Source": "/var/lib/docker/volumes/d8383a8dc4b2016c0df7a29fe05f6b3dabd57565d63624e83a6ca08719ccbfb0/_data",
        "Destination": "/datavolume02",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

对应的容器就是了;我们用inspect命令看下容器的详情,我么看下它下面的挂载详情,可以看到我们刚才设置的两个挂载目录以及挂载上去了,并且不出意外这个source就是docker容器和我们本机目录默认的挂载地址;

果然,就是这个目录下,我们刚新增的目录被挂载到这个目录下了,且新增的文件已经同步过去了

匿名挂载&具名挂载

上面我们看到,我们用dockerFile脚本指定了两个挂载卷,docker默认把这两个卷挂载到docker目录下,且随机生成了一个id,辨识度不高,难以维护;这种docker自动挂载的我们没有指定挂载目录的就是匿名挂载,那什么样的才是具名挂载呢?

docker volume help #查看卷相关命令
docker volume ls #查看所有的挂载卷
# 匿名挂载
docker run -d -P --name tomcat01 -v /etc/tomcat tomcat:9.0
# 具名挂载
docker run -d -P --name tomcat02 -v tomcatconfig:/etc/tomcat tomcat:9.0
# 指定目录挂载
docker run -d -P --name tomcat03 -v /home/data/tomcatconfig:/etc/tomcat tomcat:9.0
# -v命令后路径如果是/开头说明就是一个指定目录挂载,如果不是/开头就是指定名称的具名挂载

小结:本篇博客我们自己写了一个dockerFile文件,看到了镜像的加载过程,对与镜像的分层概念有了更深层次的理解;也通过dokcerFile的VOLUME 命令了解了dockerFile挂载卷的方法,以及了解了具名挂载和匿名挂载的区别;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker部署Dockerfile是通过使用Docker来构建和运行镜像的一种方式。可以使用手动部署的方式来熟悉部署流程,也可以使用插件方式来编写Dockerfile文件。 对于手动部署,首先需要修改docker配置,开放远程部署(上传)端口。可以通过编辑docker.service文件,在ExecStart=后添加配置"-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock"来实现。 对于使用插件的方式,则是通过配置Dockerfile的命令参数来生成Dockerfile文件,并最终根据jar包和Dockerfile构建镜像。 在进行Docker部署之前,首先需要进行Docker的安装和部署。具体的流程包括配置Docker、测试Docker、镜像的分层以及镜像的构建。 Docker部署Dockerfile的具体步骤包括: 1. 配置Docker,确保远程部署(上传)端口已经开放。 2. 使用插件方式或手动方式编写Dockerfile文件。 3. 将需要的jar包和Dockerfile放置在同一个目录下。 4. 使用命令行工具进入到该目录,并执行docker build命令来构建镜像。 5. 根据构建后的镜像,运行相应的容器。 通过以上步骤,就可以成功部署Dockerfile并运行相应的容器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [docker实战之Dockerfile构建部署项目(三)](https://blog.csdn.net/weixin_42322925/article/details/121697564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker 1 (安装部署、Dockerfile详解)](https://blog.csdn.net/qq_38664479/article/details/119488160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值