【Docker】什么是Dockerfile

news/2024/10/29 4:23:57/

🌳🌳【Docer篇整理】🌳🌳

=========================
篇一:docker核心概念与常用指令
篇二:镜像与docker数据卷
篇三:dockerfile
篇四:docker网络

文章目录

  • 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-toolsEXPOSE 80CMD 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.txtADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV 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/binEXPOSE 8080CMD /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.ppmy.cn/news/97716.html

相关文章

第二章:ShardingSphere简介

什么是ShardingSphere 何为ShardingSphere呢?其实我们总结如下三点就能很好的理解: 1、一整套开源的分布式数据库中间件解决方案 2、有三个产品组成:Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar(规划中) 3、他的定位是关系型数据库的中间件,在分布式环境下合理的…

关于云计算和raid技术的对比

云计算和RAID技术是两个不同领域的概念&#xff0c;但它们可以在存储和数据保护方面进行对比。 云计算&#xff08;Cloud Computing&#xff09;是指通过网络将计算资源、存储资源和应用程序提供给用户的一种计算模式。它基于虚拟化技术&#xff0c;通过互联网实现按需访问和使…

Web基础 ( 六 ) AJAX

4.6.AJAX 4.6.1.什么是ajax Ajax&#xff08;Asynchronous JavaScript and XML , Asynchronous 异步的&#xff09;指的是一种使用 JavaScript、XML 和 HTTP 请求进行前端数据异步交互的技术。Ajax 不需要刷新整个页面就可以更新其中的一部分&#xff0c;使得网页的反应更快、…

Yarn学习笔记

Apache Hadoop YARN &#xff08;Yet AnotherResource Negotiator&#xff0c;另一种资源协调者&#xff09;是一种新的 Hadoop 资源管理器&#xff0c;它是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度&#xff0c;它的引入为集群在利用率、资源统一…

java基础入门-16-【阶段项目(综合练习doudizhu游戏)】

Java基础入门-16-【阶段项目(综合练习&doudizhu游戏)】 25、阶段项目(综合练习&doudizhu游戏)斗地主小游戏斗地主游戏1(控制台版)步骤一:准备牌步骤二:洗牌步骤三:发牌步骤四:看牌步骤五:给牌进行排序(两种方式排序)方式一:利用序号进行排序方式二:给每一…

【腾讯云 Finops Crane 集训营】降本增效利器Crane应用实战

文章目录 前言一、Crane是什么&#xff1f;二、Crane的特点三、Crane使用1、环境准备安装 kubectl安装 Helm安装 kind安装 Docker 2、安装Crane3、访问dashboard4、页面展示集群总览成本洞察成本分析 5、功能应用智能弹性 EffectiveHPA推荐规则 四、Crane的优势总结参考文献 前…

排序算法:堆排序

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下栈和队列方面的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人 …

关于指针作为函数参数;一级、二级指针、指针引用——编程小总结(四)

一、指针作为参数 在C 中&#xff0c;指针作为函数参数传递时&#xff0c;指针本身也会被复制一份。 这意味着&#xff0c;函数内部的指针和函数外部的指针是两个不同的指针变量&#xff0c;它们指向的是同一块内存空间。 以下是一个示例代码&#xff1a; void func(int* p)…