【Docker】什么是Dockerfile

news2024/11/19 12:46:54

文章目录

  • 1、认识DockerFile
  • 2、DockerFile的构建过程
  • 3、DockerFile常用指令
  • 4、实战:构建自己的centos
  • 5、CMD和ENTRYPOINT的区别
  • 6、DockerFile制作tomcat镜像
  • 7、发布镜像到DockerHub
  • 8、发布镜像到阿里云

1、认识DockerFile

Dockerfile是用来构建docker镜像的文件,是一个命令参数脚本。基本流程是:

  • 编写一个dockerFile文件

  • docker build 构建成为一个镜像

  • docker run 运行镜像、启动容器

  • docker push 发布镜像(DockerHub、阿里云镜像)

查看一下官方的镜像是怎么做的(在dockerhub搜centos为例):

在这里插入图片描述
再点可以看到构建它的Dockerfile文件:注意FROM这里的scratch,99%的镜像都是从这个基础镜像过来的,然后加需要的软件和配置进行构建。

在这里插入图片描述

很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己构建满足自己需求和用途的镜像!

2、DockerFile的构建过程

  • 每个保留关键字(指令)都是必须大写字母

  • 执行从上到下顺序执行

  • # 表示注释

  • 每个指令都会创建提交一个新的镜像层,并提交

在这里插入图片描述
dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件。步骤:

  • DockerFile: 构建文件, 定义了一切的步骤,源代码

  • DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!

  • Docker容器:容器就是镜像运行起来提供服务器

3、DockerFile常用指令

FROM            # 基础镜像,一切从这里开始构建
MAINTAINER      # 镜像是谁写的, 姓名+邮箱
RUN             # 镜像构建的时候需要运行的命令
ADD             # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR         # 镜像的工作目录
VOLUME          # 挂载的目录
EXPOSE          # 暴露端口配置(-p)
CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD         # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY            # 类似ADD, 将我们文件拷贝到镜像中
ENV             # 构建的时候设置环境变量!

在这里插入图片描述

4、实战:构建自己的centos

dockerhub中的Centos镜像从scratch开始,里面没有vim、ifconfig等指令,是一个纯净的centos,下面构建我需要的定制的centos:

# 编写Dockerfile的文件
[root@9527 dockerfile] cat mydockerfile-centos 
FROM centos
MAINTAINER code-9527<9527@csdn.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH     # 镜像的工作目录,以后启动进入容器后,就是这个目录
 
RUN yum -y install vim
RUN yum -y install net-tools
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
 

构建镜像:

# 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
 
[root@9527 dockerfile] docker build -f mydockerfile-centos -t mycentos:0.1 .
step1... 
step2...
Successfully built d2d9f0ea8cb2
Successfully tagged mycentos:0.1

用这个镜像启动并进入容器,就可以执行vim、ifconfig等指令。

# 查看镜像本地进行的变更历史
docker history ImageId

在这里插入图片描述

5、CMD和ENTRYPOINT的区别

结论:

CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令

验证:

先看CMD:
# 1. 编写dockerfile文件
[root@9527 dockerfile] vim dockerfile-cmd-test 
FROM centos
CMD ["ls", "-a"]
 
# 2. 构建镜像
[root@9527 dockerfile] docker build -f dockerfile-cmd-test -t cmdtest .
 
# 3. run运行, 发现我们的ls -a 命令生效
[root@9527 dockerfile] docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
 
# 4.此时想追加一个命令 -l 变成 ls -al,报错:
[root@9527 dockerfile] docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
[root@9527 dockerfile] docker run ebe6a52bb125 ls -l

cmd的情况下 -l替换了CMD[“ls”, “-a”]命令, -l不是命令,所以报错了

再看ENTRYPOINT:
# 1. 编写dockerfile文件
[root@9527 dockerfile] vim dockerfile-entrypoint-test 
FROM centos
ENTRYPOINT ["ls", "-a"]
 
# 2. 构建文件
[root@9527 dockerfile] docker build -f dockerfile-entrypoint-test -t entrypoint-test .
 
# 3. run运行 发现我们的ls -a 命令同样生效
[root@9527 dockerfile] docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
 
# 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@9527 dockerfile] docker run entrypoint-test -l
total 56
drwxr-xr-x  1 root root 4096 Aug 13 07:52 .
drwxr-xr-x  1 root root 4096 Aug 13 07:52 ..
...

ENTRYPOINT下,docker run时追加命令, 是直接拼接到ENTRYPOINT命令的后面的。

6、DockerFile制作tomcat镜像

准备镜像文件 tomcat压缩包,jdk的压缩包

在这里插入图片描述
编写Dockerfile文件,官方命名Dockerfile, build会自动寻找这个文件,就不需要-f指定了

[root@9527 tomcat] cat Dockerfile 
FROM centos
MAINTAINER code-9527<9527@csdn.com>
 
COPY readme.txt /usr/local/readme.txt
 
ADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/
 
RUN yum -y install vim
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
ENV JAVA_HOME /usr/local/jdk1.8.0_73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 
EXPOSE 8080
 
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
 

构建镜像:

# 不用-f
docker build -t diytomcat .

启动容器:

docker run -d -p 3344:8080 --name tomcat1 
-v /home/9527/build/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test 
-v /home/9527/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.37/logs 
diytomcat

此时,访问localhost:3344即可。且这里做了数据卷挂载,在本地目录编辑项目就可发布,不用进入容器。

在本地test目录编写/WEB-INF/web.xml和index.jsp查看效果:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. world</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>

此时访问localhost:3344/test即可访问到index.jsp,查看目录tomcatlogs/catalina.out日志:

在这里插入图片描述

7、发布镜像到DockerHub

注册dockerhub:https://hub.docker.com/

在这里插入图片描述

登录

docker login -u liuligang9527

在这里插入图片描述

提交自己的镜像:

# push我们的服务器上镜像
[root@9527Z ~] docker push diytomcat
The push refers to repository [docker.io/library/diytomcat]
2eaca873a720: Preparing 
1b38cc4085a8: Preparing 
088ebb58d264: Preparing 
c06785a2723d: Preparing 
291f6e44771a: Preparing 
denied: requested access to the resource is denied  # 拒绝
 
# push镜像的问题?
The push refers to repository [docker.io/1314520007/diytomcat]
An image does not exist locally with the tag: 1314520007/diytomcat
 
# 解决,增加一个新tag
docker tag diytomcat 1314520007/tomcat:1.0
Tip:
clear  等价于 Clrt+L

8、发布镜像到阿里云

登录阿里云、进入容器镜像服务

在这里插入图片描述

创建命名空间

在这里插入图片描述
创建镜像仓库

在这里插入图片描述
点击仓库名称,可以看到仓库地址以及登录指令

在这里插入图片描述

$ docker login --username=liuligang registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/code-9527/9527:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/code-9527/9527:[镜像版本号]

推送成功:

在这里插入图片描述在这里插入图片描述

最后是Docker所有流程小结:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arduino stm32 开发环境 解决方案

用到工具 hfs.exe 做文件服务器 来模拟所有需要下载的文件 https://download.csdn.net/download/qq_32562225/87754346 其原理就相当于 本应arduinoIDE 下载的文件&#xff0c;先手动通过迅雷工具下载下来&#xff0c;然后再添加到文件服务器中&#xff0c;这样就可以快速…

爬虫想要的HTML

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 接下来回更新一个关于urllib的文章 爬虫一个新浪博客地址 import urllib.requestpage 1 url [" "] *…

如何在线录制视频?教您一个简单的方法!

案例&#xff1a;怎样实现在线录屏&#xff1f; 【听朋友说在线录屏更加便捷&#xff0c;我也想学习如何在线录制电脑屏幕。有没有小伙伴有在线录屏的经验&#xff0c;求好心人给一个简单的方法&#xff01;】 在今天的数字时代&#xff0c;我们经常需要录制电脑屏幕来制作教…

【C++】AVL树的插入实现(详解旋转机制)

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 文章目录 AVL树的定义AVL树的旋转机制1.左旋操作 --- 新节点插入较高右子树的右侧---右右&#xff1a;左单旋2.右旋操作 --- 新节点插入较高左子树的左侧——左左&#xff1a;右单旋3.左右双旋 --- 新节点插入较高左…

JMeter开发自动化接口测试脚本练习

一、打开浏览器代理服务器设置 我这里用的是360浏览器&#xff0c;打开浏览器代理服务器设置&#xff0c;端口要与jmeter中的端口设置保持一致哦。 二、JMeter设置代理 JMeter设置代理&#xff08;jmeter中的端口要与360浏览器端口设置保持一致哦。&#xff09; 三、启动代理运…

BM6 判断链表中是否有环

判断链表中是否有环_牛客题霸_牛客网 (nowcoder.com) 双指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;快指针不为空且快指针的下一个指针不为空的情况下 若快慢指针相遇即位有环。 /** * Definition for singly-linked list. * struct ListNode {…

基于RK3588的8K智能摄像机方案设计

设计了一款基于石墨烯散热的8 K智能摄像头&#xff0c;主控采用瑞芯微RK3588&#xff0c;传感器采用索尼IMX435&#xff0c; 通过HDMI2.1将传感器采集到的图像发送到8 K显示器&#xff0c;实现端到端的8 K呈现&#xff0c;为了确保摄像头性能稳定&#xff0c;本 设计采用石墨烯…

ETL到底是什么?

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 前段时间和大家聊了一个话题&#xff0c;就是为什么要用构建数据仓库&#xff0c;而不是直连数据源的方式开发报表&#xff1f;通…

七、MyBatis自定义映射resultMap

文章目录 七、自定义映射resultMap7.1 resultMap处理字段和属性的映射关系7.2 多对一映射处理级联方式处理映射关系使用association处理映射关系分步查询 7.3 一对多映射处理collection分步查询 本人其他相关文章链接 七、自定义映射resultMap 注意&#xff1a;下面两行表看看…

公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了

说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

分布式光伏发电大规模应用,运维难题如何解?

国家能源局数据显示&#xff0c;2022年我国光伏新增装机达 87.4GW&#xff0c;同比59%&#xff0c;其中&#xff1a;集中式装机达36.29GW&#xff0c;同比41.8%&#xff1b;分布式装机达51.11GW&#xff0c;同比207.9%&#xff0c;已连续两年超过集中式电站。 近年来&#xff…

如何在Windows系统中恢复丢失的分区?

有些时候&#xff0c;您突然发现自己的分区丢失&#xff0c;并且无法在Windows文件资源管理器中看到它&#xff0c;进入磁盘管理工具&#xff0c;丢失的分区也将被显示为额外的未分配空间&#xff0c;而不是原始分区。如果您遇到了与上述案例类似的情况&#xff0c;某个分区丢失…

AntDB数据库受邀参加第六届上海人工智能大会,分享AIGC时代核心交易系统升级方案

近日&#xff0c;第六届上海人工智能大会春季论坛圆满落幕。大会以“数智互联&#xff0c;瞰见未来”为主题&#xff0c;邀请了来自国内外十余个国家和地区的学术界顶级学者和业内知名企业的技术大咖&#xff0c;探讨人工智能的学术、人才、技术、行业发展痛点。亚信科技AntDB数…

新闻月刊 | GBASE 4月市场动态一览

产品动态 4月&#xff0c;GBASE南大通用大规模分布式并行数据库GBase 8a MPP Cluster中标人保财险“2022年基础软件产品及服务采购”项目。这是自2019年GBASE与人保财险达成合作以来支持建设的第三期项目。项目上线后&#xff0c;将极大满足人保财险大数据中心及研发中心的增量…

学网络安全怎么挖漏洞?怎么渗透?

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…

css div上下左右排序

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>div上下左右排序</title> </head> <style>.div-box {display: grid;grid-auto-flow: column; /* 排序方式&#xff1a; column-先列…

编译链接再认识+gdb认识+makefile了解+缓冲区的理解+进度条的实现

索引 一. 编译链接再认识1.预处理2.编译3.汇编4.链接1.静态链接2.动态链接 二.gdb三.makefile/make四.缓存区的理解五. 进度条的实现 一. 编译链接再认识 主要针对gcc展开 一个文件从源文件编译成可执行文件大致要经历四个步骤 预处理&#xff08;进行宏替换&#xff09;编译…

office@word官方文档查看@审阅@批注@修订

文章目录 office官方文档microsoft office 文档教程语言切换文档官网word官方培训资源找到合适的文档 word共享共同创作的相关支持word审阅重点修订批注审阅窗格右侧边窗格修订选项区分标记和修订 officeword官方文档查看审阅批注修订 office官方文档 microsoft office 文档教…

国家信息安全水平考试中NISP三级(专项)网络安全证书介绍

国家信息安全水平考试中NISP三级&#xff08;专项&#xff09;网络安全证书介绍 ​1、什么是NISP? 国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间…

c++ 11标准模板(STL) std::vector (六)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…