Docker-制作镜像的两种方式=》基于容器制作基于Dockerfile制作

news2024/11/24 7:29:37

本文主要是基于Docker如何制作一个Java镜像,而一个Java镜像想要运行需要系统环境,JDK。所以我们要先有一个系统环境,本文使用的是centos7,JDK选择版本是8,而我使用的Java程序是一个简易的springBoot项目,你可以选择使用本地的Java程序。我了解docker制作镜像有两种方式,一种是Docker Commit基于容器构建镜像;一种是Docker Build基于Dockerfile构建镜像。我接下来都会讲一下这两种方式的使用

文章目录

  • Docker Commit基于容器构建镜像
    • 1.拉取centos7镜像
    • 2.拷贝Java jar程序到容器
    • 3.安装jdk和验证Java程序是否正常运行
    • 4.构建镜像
    • 5.启动容器
  • Dockerfile
    • Dockerfile介绍常用指令
      • FROM
      • MAINTAINER
      • LABEL
      • RUN
      • ADD
      • COPY
      • EXPOSE
      • ENV
      • CMD
      • ENTRYPOINT
      • WORKDIR
      • VOLUME
  • Docker Build基于Dockerfile构建镜像
    • 1.根据指令编写Dockerfile文件
    • 2.构建镜像
    • 3.启动容器
  • 总结

Docker Commit基于容器构建镜像

1.拉取centos7镜像

# 拉取镜像
sudo docker pull centos:7
# 创建容器
sudo docker -di --name centos7 centos:7

2.拷贝Java jar程序到容器

项目源码:简易springboot项目

# 拷贝Java jar包到容器
sudo docker cp demo-0.0.1-SNAPSHOT.jar centos7:/usr/local/data

3.安装jdk和验证Java程序是否正常运行

# 进入容器
sudo docker exec -it  centos7 /bin/bash
# 安装jdk
yum -y install java-1.8.0-openjdk.x86_64
# 验证Java是否成功安装
java -version
# 运行Java 程序
nohup java -jar /usr/local/data/demo-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
# 验证程序是否正常运行,输出hello java即成功
curl localhost:9080/index
# 验证成功后退出该容器
exit

4.构建镜像

# 执行下面命令会生成镜像
docker commit -a="cyl" -m="simple springboot" centos7 mycentos:7

docker commit构建镜像指令格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

-a:提交的镜像作者;
-c:使用 Dockerfile 指令来创建镜像;
-m:提交时的说明文字;
-p:在 commit 时,将容器暂停。

# 查看景象是否生成
sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 7 2ae82069a24b 51 minutes ago 726MB
centos 7 eeb6ee3f44bd 2 years ago 204MB

我们构建的景象mycentos比centos大,因为里面有jdk和Java程序

5.启动容器

# 启动容器
sudo docker run -di --name mycentos7 -p 9080:9080 mycentos:7
# 进入容器
sudo docker exec -it  mycentos7 /bin/bash
# 运行Java 程序
nohup java -jar /usr/local/data/demo-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
# 退出容器
exit
# 主机直接调用Java程序接口,输出hello java即成功
curl ip:9080/index

这种镜像制作的方式就介绍完了,但是执行过程中发现它有些复杂,制作镜像启动后还需要再次进入容器,手动启动Java程序。是否有更简便的方式,启动容器时直接就运行Java程序了呢。接下来我就要讲这种更优的方式,是构建镜像中最常用的方式就是Dockerfile。

Dockerfile

Dockerfile它是一种构建镜像的文本文件,文本内容中包含了一条条镜像所需的指令和说明。可以参考Dockerfile官方文档

Dockerfile介绍常用指令

FROM

语法:FROM <image>:<tag>
指明构建的新镜像是来自于哪个基础镜像,如果没有选择 tag,那么默认值为 latest。
FROM centos:7

MAINTAINER

语法:MAINTAINER <name>
指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用 LABEL。

MAINTAINER cyl <cyl@cyl.com>

LABEL

语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
功能是为镜像指定标签。也可以使用 LABEL 来指定镜像作者。

LABEL maintainer="cyl.com"

RUN

语法:RUN <command>
构建镜像时运行的 Shell 命令,比如构建的新镜像中我们想在 /usr/local 目录下创建一个 java 目录。

RUN mkdir -p /usr/local/java

ADD

语法:ADD <src>... <dest>
拷贝文件或目录到镜像中。src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。还可以是一个 url,如果把 src 写成一个 url,那么 ADD 就类似于 wget 命令,然后自动下载和解压。

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

COPY

语法: COPY <src>... <dest>
拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压。

COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

EXPOSE

语法:EXPOSE <port> [<port>/<protocol>...]
暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。

EXPOSE 80 443 8080/tcp

如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -p 参数。

ENV

语法:ENV <key> <value> 添加单个,ENV <key>=<value> ... 添加多个。
设置容器内环境变量。

ENV JAVA_HOME /usr/local/java/jdk-11.0.6/

CMD

语法:

  • CMD ["executable","param1","param2"],比如:CMD ["/usr/local/tomcat/bin/catalina.sh", "start"]
  • CMD ["param1","param2"],比如:CMD [ "echo", "$JAVA_HOME" ]
  • CMD command param1 param2,比如:CMD echo $JAVA_HOME
    启动容器时执行的 Shell 命令。在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效。
CMD echo $JAVA_HOME

如果创建容器的时候指定了命令,则 CMD 命令会被替代。假如镜像叫 centos:7,创建容器时命令是:docker run -it --name centos7 centos:7 echo “helloworld” 或者 docker run -it --name centos7 centos:7 /bin/bash,就不会输出 $JAVA_HOME 的环境变量信息了,因为 CMD 命令被 echo “helloworld”、/bin/bash 覆盖了。

ENTRYPOINT

语法:

  • ENTRYPOINT ["executable", "param1", "param2"],比如:ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "start"]
  • ENTRYPOINT command param1 param2,比如:ENTRYPOINT ehco $JAVA_HOME

启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖。在 Dockerfile 中只能有一条 ENTRYPOINT 指令。如果设置了多条 ENTRYPOINT,只有最后一条 ENTRYPOINT 会生效。

ENTRYPOINT echo $JAVA_HOME

如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 指令不是一个完整的可执行命令,那么 CMD 指定的内容将会作为 ENTRYPOINT 的参数;
如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

WORKDIR

语法:WORKDIR /path/to/workdir
RUNCMDENTRYPOINT 以及 COPY AND 设置工作目录。

WORKDIR /usr/local

指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时。

VOLUME

语法:VOLUME ["/var/lib/mysql"]

容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的 /var/lib/docker/volumes 目录下

一般不会在 Dockerfile 中用到,更常见的还是在 docker run 的时候通过 -v 指定数据卷。

Docker Build基于Dockerfile构建镜像

1.根据指令编写Dockerfile文件

# 创建宿主机文件目录
sudo mkdir -p /docker/dockerfile
# 到目录下
cd /docker/dockerfile
# 编写Dockerfile文件
vim Dockerfile

Dockerfile文件内容如下:

# 指明构建的新镜像是来自于 centos:7 基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="cyl.com"
# 设置工作目录
WORKDIR /usr/local
# 新镜像构建成功以后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/soft
# 拷贝文件到镜像中并解压
ADD  jdk-8u411-linux-x64.tar.gz /usr/local/java
ADD  demo-0.0.1-SNAPSHOT.jar /usr/local/soft
# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 9080
# 设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.8/
ENV PATH $PATH:$JAVA_HOME/bin
# 指定容器启动时运行Java程序
CMD ["java","-jar","/usr/local/soft/demo-0.0.1-SNAPSHOT.jar"]

其中jdk-8u411-linux-x64.tar.gz和demo-0.0.1-SNAPSHOT.jar我都放在了/docker/dockerfile目录下,和Dockerfile同一个目录

2.构建镜像

Dockerfile 文件编写好以后,真正构建镜像时需要通过 docker build 命令。

# 使用当前目录的 Dockerfile 创建镜像
sudo docker build -t mycentos-01:7 .

在这里插入图片描述
执行sudo docker images可以查看制作的镜像,mycentos-01是我刚刚使用Dockerfile制作的
在这里插入图片描述
还可以通过执行以下命令构建镜像

# 通过 -f Dockerfile 文件的位置创建镜像
docker build -f /docker/dockerfile/Dockerfile -t mycentos:7 .

-f:指定要使用的 Dockerfile 路径;
–tag, -t:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。

最后的 . 号含义是什么?

若是.号则意味着宿主机中的Dockerfile文件和Dockerfile其它文件是同在一个目录下,比如jdk-8u411-linux-x64.tar.gz和demo-0.0.1-SNAPSHOT.jar,由于它们都在一个目录下,所以最后加一个.
若是不在一个目录,比如我的宿主机 jdk 文件在 /root 目录下,Dockerfile 文件在 /usr/local/dockerfile 目录下,文件内容如下:

ADD jdk-8u411-linux-x64.tar.gz /usr/local/java

那么构建镜像时的命令就该这样写:

docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 /root

3.启动容器

# 启动容器
sudo docker run -di --name mycentos1 -p 9080:9080  mycentos-01:7
# 主机直接调用Java程序接口,输出hello java即成功
curl ip:9080/index

总结

本文主要讲解了Docker Commit基于容器构建镜像和Docker Build基于Dockerfile构建镜像的两种方式,同时也介绍了Dockerfile的常用指令操作,一般推荐Dockerfile这种方式构建镜像,只需要在Dockerfile中写好构建所需的指令,非常灵活和方便!

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

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

相关文章

详细分析Vue按钮间距的优化方式(附Demo)

目录 前言1. 按钮间距2. 垂直间距 前言 正常间距如下&#xff1a; 其Demo如下&#xff1a; <el-table-column label"操作" align"center"><template #default"scope"><el-buttonlinktype"primary"click"openFor…

Node.js —— 前后端的身份认证 之用 express 实现 JWT 身份认证

JWT的认识 什么是 JWT JWT&#xff08;英文全称&#xff1a;JSON Web Token&#xff09;是目前最流行的跨域认证解决方案。 JWT 的工作原理 总结&#xff1a;用户的信息通过 Token 字符串的形式&#xff0c;保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用…

Mysql注入详细讲解

特殊字符 0x3a:0x7e~0x23# 注入基础 联合查询注入(union) :::tips 页面将SQL查询内容显示出来&#xff0c;即为有回显&#xff0c;可以尝试联合查询注入 利用关键字union &#xff0c;union all 拼接恶意SQL语句 ::: 注入流程 有报错&#xff0c;可以利用报错。如&#xff…

[datawhale202405]从零手搓大模型实战:TinyAgent

结论速递 TinyAgent项目实现了一个简单的Agent智能体&#xff0c;主要是实现了ReAct策略&#xff08;推理调用工具的能力&#xff09;&#xff0c;及封装了一个Tool。 项目实现有一定的疏漏。为了正确运行代码&#xff0c;本次对代码Agent部分进行了简单修改&#xff08;完善…

VBA语言専攻每周通知20240524

通知20240524 各位学员∶本周MF系列VBA技术资料增加611-615讲&#xff0c;T3学员看到通知后请免费领取,领取时间5月24日晚上18:00-5月26日晚上18:00。本次增加内容&#xff1a; MF611:用InputBox录入日期 MF612:信息提示10秒后关自动关闭 MF613:只是信息提示10秒 MF614:显…

Zynq-Linux移植学习笔记之68- 国产ZYNQ添加用户自定义版本信息

1、背景介绍 在使用复旦微zynq时&#xff0c;有时候虽然针对uboot源码进行了改动&#xff0c;但由于uboot基线版本只有一个&#xff08;2018-07-fmsh&#xff09;&#xff0c;导致无法区分版本信息&#xff0c;虽然可以通过编译时间来区分&#xff0c;但没有版本号直观。内核也…

【Numpy】深入解析numpy中的ravel方法

NumPy中的ravel方法&#xff1a;一维化数组的艺术 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简…

香港服务器负载过高的原因和应对办法

保持网站正常运行看似简单&#xff0c;但事实上&#xff0c;有许多问题会影响网站和应用程序的性能&#xff0c;并可能导致停机。其中一个问题就是服务器过载。而香港服务器作为一种常见的服务器类型&#xff0c;有时会出现负载过高的情况。为了帮助您确保在香港服务器过载不会…

AI应用案例:电能量异常分析智能诊断系统

窃电和计量装置故障造成漏收、少收电费使电力系统利益受损。一般情况主要通过定期巡检、定期校验电表、用户举报窃电等手段来发现窃电或计量装置故障。对人的依赖性太强&#xff0c;抓窃查漏的目标不明确。利用电力系统中逐步积累下来的海量真实数据&#xff0c;采用数据挖掘技…

C++多生产者,多消费者模型

C11实现多生产者&#xff0c;多消费者模型 在C标准库中实现多生产者多消费者模型&#xff0c;可以使用std::thread、std::queue、互斥锁(std::mutex)、条件变量(std::condition_variable)等组件。下面是一个简单的示例&#xff0c;展示如何创建多生产者和多消费者模型&#xf…

构建智能化的语言培训教育技术架构:挑战与机遇

随着全球化的发展和人们对语言学习需求的增长&#xff0c;语言培训教育行业正面临着越来越多的挑战和机遇。在这个背景下&#xff0c;构建智能化的语言培训教育技术架构成为提升服务质量和效率的重要手段。本文将探讨语言培训教育行业的技术架构设计与实践。 一、智能化教学平台…

Jupyter Notebook的三个使用场景:网页端、PyCharm专业版和VScode

说明&#xff0c;以下都是我个人的摸索感悟和总结&#xff0c;自己理解和猜测的是这样&#xff0c;欢迎指正。 Jupyter Notebook的三个常用使用地方&#xff08;网页端、PyCharm专业版、VScode&#xff09;&#xff1a; 总结一句话&#xff1a;网页端、PyCharm中和VScode中三…

Python使用multiprocessing实现多进程

大家好&#xff0c;当我们工作中涉及到处理大量数据、并行计算或并发任务时&#xff0c;Python的multiprocessing模块是一个强大而实用的工具。通过它&#xff0c;我们可以轻松地利用多核处理器的优势&#xff0c;将任务分配给多个进程并同时执行&#xff0c;从而提高程序的性能…

ROCm上情感分析:使用循环神经网络

15.2. 情感分析&#xff1a;使用循环神经网络 — 动手学深度学习 2.0.0 documentation (d2l.ai) 代码 import torch from torch import nn from d2l import torch as d2lbatch_size 64 train_iter, test_iter, vocab d2l.load_data_imdb(batch_size)class BiRNN(nn.Module):…

躺赚零撸项目,看广告赚红包,零门槛提现,秒到账,单机每日100+

这个项目是跟广告商直接对接的&#xff0c;跟以前小游戏看广告差不多&#xff0c;看完广告得金币5000个兑换5毛钱。 不过这个是可以直接提现&#xff0c;而是无门槛就可以提&#xff0c;有设备就可以操作&#xff0c;有空边看连续剧边刷也是挺香的&#xff0c;单机可以达到100…

组网智能是啥?

组网智能是一种基于穿透技术的远程连接解决方案&#xff0c;它为用户提供了操作简单、跨平台应用、无网络要求和独创的安全加速方案等优势。由于这些特点&#xff0c;组网智能已经被几十万用户广泛应用&#xff0c;解决了各行业客户的远程连接需求。 跨平台应用 组网智能具备跨…

《我的阿勒泰》观后感(二、返璞归真也是一种美)

看了李娟的小说《我的阿勒泰》逐渐悟到一个道理&#xff0c;返璞归真也是一种美&#xff0c;没必要每个人的人生三十年的年华&#xff0c;都去追求房子&#xff0c;车子等逐渐贬值的东西。人究竟应该追求怎样的一种活法&#xff1f; 什么是城市化&#xff1f;这是我听到的最好…

ffmpeg-webrtc(metartc)给ffmpeg添加webrtc协议

这个是使用metrtc的库为ffmpeg添加webrtc传输协议&#xff0c;目前国内还有一个这样的开源项目&#xff0c;是杨成立大佬&#xff0c;大师兄他们在做&#xff0c;不过wili页面维护的不好&#xff0c;新手不知道如何使用&#xff0c;我专门对它做过介绍&#xff0c;另一篇博文&a…

Ansible01-Ansible的概述、实验环境初始化、Inventory

目录 写在前面1. Ansible是什么1.1 简介与来历1.2 Ansible的特点1.3Ansible的架构与工作流程1.3.1 ansible 任务执行模式1.3.2 ansible 执行流程1.4 Ansible的模块 2. Ansible实验初始化2.1 实验环境2.2Ansible的安装2.2.1 Ansible的程序结构 2.3 修改Ansible配置文件2.3.1 配置…

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子&#xff08;以《天谕》为例&#xff09;2.1 下载微星 afterburner 软件 查看游戏内信息&#xff08;可跳过&#xff09;2.2 查看D3D9 帧数2.3 关闭游戏&#xff0c;替换 dll 文件2…