一、DockerFile

DockerFile是用来构建docker镜像的文件,可以理解为命令参数脚本!

1、构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)

2、官方DockerFile示例

  • 看一下官方的DockerFile

  • 可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

  • 官方既然可以制作镜像,我们亦可以

二、DockerFile构建过程

1、DockerFile基础知识

  1. 每个指令都必须是大写字母
  2. 按照从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建体检一个新的镜像层,并提交

2、Dockerfile、Dockerimages、Docker容器:

  • DockerFile:构建文件,定义了一切的步骤,源代码
  • Dockerlmage:通过 DockerFile 构建生成的镜像,最终发布和运行的产品!
  • Docker容器:容器就是镜像运行起来提供服务器

三、DockerFile命令

  • **FROM # 基础镜像 **

  • MAINTAINER # 镜像是谁写的 姓名+邮箱

  • RUN # 镜像构建时需要运行的命令

  • ADD # 添加,比如添加一个tomcat压缩包

  • WORKDIR # 镜像的工作目录

  • VOLUME # 挂载的目录

  • EXPOSE # 指定暴露端口,跟 -p 一个道理

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

  • ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

  • ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令

  • COPY # 将文件拷贝到镜像中

  • ENV # 构建的时候设置环境变量

四、实战构建自己的centos

Docker Hub中99%的镜像都是从FROM scratch开始的

1、创建自己的centos镜像的Dockerfile文件:

  • Dockerfile 文件的内容:
# 创建一个自己的centos
# 进入home目录
cd /home
# 创建一个目录,之后的东西都保存到这里
mkdir dockerfile
# 进入这个目录
cd dockerfile/
# 创建一个dockerfile,名字叫mydockerfile
vim mydockerfile-centos
# 下面给官方centos加上自定义的内容
FROM centos
MAINTAINER padaxing<010301200@hai.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

2、docker build 文件创建镜像

docker build -f dockerfile-centos -t mycentos:0.1 .

3、docker run 启动容器:

docker run -it mycentos:0.1 # 版本号必须写,不然他会去找最新的
  • 这时可以看到这些功能都有了:

    • pwd
    • vim
    • ifconfig

4、docker history:查看docker构建历史

  • 可以看到当前这个镜像是怎么一步一步构建起来的

五、CMD与ENTRYPOINT

  • 测试cmd
FROM centos
CMD ["ls","-a"] # 启动centos展示目录

  • 测试ENTRYPOINT

  • run的时候可以直接加命令:

Docker中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试

六、实战Tomcat镜像--自定义tomcat环境镜像

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

2、编写Dockerfile文件

■ 如果构建文件名为Dockerfile(官方命名),则构建镜像时不需要写构建文件位置

  • 命名为Dockerfile,build 会自动寻找这个文件,就不需要-f指定了!
  • Dockerfile 内容:
FROM centos:7
MAINTAINER shan<qq2363581677@163.com> ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local/
WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out

3、构建镜像:

docker build -t diytomcat .

Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirrorlist

  • 注意,指明版本,指明centos的版本,FROM centos:7

  • 查看本地镜像是否有构建成功的镜像:
docker images

4、启动镜像:运行镜像,同时挂载项目目录和日志目录:

docker run -d -p 9090:8080 --name shantomcat -v /home/shan/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/shan/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.62/logs diytomcat

5、访问测试

报错:自定义的tomcat镜像无法访问curl: (56) Recv failure: Connection reset by peer

● 打印docker日志查看报错原因:

命令:docker logs docker的id

  • 日志信息:

    Tomcat started.

    /usr/local/apache-tomcat-9.0.62/bin/catalina.sh: line 504: /usr/local/jdk1.8.0_301/bin/java: cannot execute binary file

  • 更换jdk,我用错jdk的类型,应该使用的是jdk-8u301-linux-x64.tar.gz,而我使用的是jdk-8u301-linux-aarch64.tar.gz

6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以进行发布)

  • 在咱挂载的宿主目录,test目录下,新建一个hello.jsp 和 WEB-INF(然后再该目录下建立web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" metadata-complete="false"> </web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
老师好
<%
System.out.println("-----my test web logs");
%>
</body>
</html>
  • 进行访问测试

发现:项目部署成功,可以直接访问ok!

我们以后开发的步骤:需要掌握Dokcerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

七、发布自己的镜像---发布到Docker Hub 或者 阿里云

1、发布到 Docker Hub:

① 在官网Docker Hub 上注册账号

② cmd上登录确定这个账号 docker login

③ 在服务器上提交自己的镜像 docker push

[root@iZwz9535z41cmgcpkm7i81Z test]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon. Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username [root@iZwz9535z41cmgcpkm7i81Z tomcat]# docker login -u yilele
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded

(1)提交镜像 docker push

(2)docker push失败:denied: requested access to the resource is denied

# push 自己的镜像到服务器上!自己发布的镜像尽量带上版本号
docker push yilele/diytomcat:1.0
  • 又失败:

解决:增加一个 tag

  • docker tag 镜像id 你的账户名/镜像仓库名:tag名
# 失败
docker push yilele/diytomcat:1.0
# docker tag 镜像id(或者是镜像名称) 你的账户名/镜像仓库名:tag名
docker tag diytomcat yilele/diytomcat:1.0
docker push yilele/diytomcat:1.0

2、发布到阿里云镜像

① 登录阿里云

② 打开容器镜像服务

③ 创建命名空间

④ 创建容器镜像

⑤ 浏览一下阿里云提示的基本信息

  • 看到公网地址,可以访问当前仓库

⑥ 开始推送工作:

(1)登录上阿里云账号

(2)增加一个tag(咱在提交到docker hub 就做过啦)

(3)docker push


  • 想要创建命名空间:先进入个人实例

  • 创建命名空间:

  • 创建容器镜像:

  • 浏览一下阿里云提示的基本信息:

  • docker push 到阿里云仓库发生错误:

  • 解决:按照阿里云提示的基本信息操作,重新增加一个 tag

参考来源:

狂神的B站视频《【狂神说Java】Docker最新超详细版教程通俗易懂》 https://www.bilibili.com/video/BV1og4y1q7M4

如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

Docker学习重点(7)~DockerFile的更多相关文章

  1. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  2. DOCKER学习_011:使用Dockerfile制作docker镜像

    前面使用commit的方式,制作一个docker镜像,本次介绍使用Dockerfile制作一个dockers镜像 [root@docker-server3 ~]# mkdir /openssh [ro ...

  3. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  4. Docker学习总结(六)--Dockerfile

    什么是 Dockerfile Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像. 对于开发人员:可以为开发团队提供一个完全一致的开发环境; 对于测试人 ...

  5. Docker学习笔记之Dockerfile

    Dockerfile的编写格式为<命令><形式参数>,命令不区分大小写,但一般使用大写字母.Docker会依据Dockerfile文件中编写的命令顺序依次执行命令.Docker ...

  6. Docker 学习8 Dockerfile详解2

    一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...

  7. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  8. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  9. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

随机推荐

  1. shell脚本编程(一) 变量、条件判断、循环

    目录   1. shell脚本编程   2. 运行 Shell 脚本有两种方法   3. 变量   4. 本地变量   5. 环境变量   6. 参数变量   7. 多行注释   8. if条件判断 ...

  2. jquery+html5实现单张图片上传预览

    js: if (window.File && window.FileReader && window.FileList && window.Blob){ ...

  3. 【前端Talkking】CSS系列——CSS深入理解之line-height

    1.写在前面 两个多周的时间没有写文章了,手好痒好痒,趁着公司在装修,从上周末到本周都在家办公,同时公司的项目并不紧急,于是抽着时间梳理了一下CSS中关于行高line-height的理解,今天发布出来 ...

  4. POP3:基于命令行的电子邮件(EMail)在线查看和批量下载工具

    使用该工具可以在不安装outlook和foxmail等邮件客户端的情况下快速下载指定邮箱的邮件,并将下载的邮件以eml格式进行保存. 附: 查看eml格式的邮件可使用 EmlReader 工具,该工具 ...

  5. linux安装mongodb磁盘空间不足

    Insufficient free space for journal filesPlease make at least 3379MB available in /export/servers/mo ...

  6. Pullword 中文分词

    安装 npm install pullword   使用 var defaultOptions = { url: 'http://api.pullword.com/post.php', /* api ...

  7. vue配置请求转发解决跨域问题

    通过nodejs的请求转发到后台,前端地址:http://localhost:8080   后端地址:http://localhost:8081 vue.config.js内容如下: let prox ...

  8. web.xml的作用及基本配置

    web工程中的web.xml文件有什么作用呢?它是每个web.xml工程都必须的吗? 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的.那什么时候需要,什 ...

  9. 引用nodejs的url模块实现url路由功能

    我们在本地创建服务器之后需要写不同的后缀名来访问同一个站点的不同页面,如果不实现路由功能.则每次访问localhost:3000 不论后面写什么  比如localhost:3000/index.loc ...

  10. 在UnityUI中绘制线状统计图

    ##先来个效果图 觉得不好看可以自己调整 ##1.绘制数据点 线状图一般由数据点和连线组成 在绘制连线之前,我们先标出数据点 这里我选择用Image图片来绘制数据点 新建Canvas,添加空物体Gra ...