首页 > 其他分享 >docker入门加实战—Docker镜像和Dockerfile语法

docker入门加实战—Docker镜像和Dockerfile语法

时间:2023-10-14 17:12:57浏览次数:36  
标签:java demo jar 镜像 docker Dockerfile Docker

docker入门加实战—Docker镜像和Dockerfile语法

镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

镜像结构

我们要从0部署一个Java应用,大概流程是这样:

  1. 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

  2. 安装并配置JDK

  3. 拷贝jar包

  4. 配置启动脚本

镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

Java项目镜像结构

Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

其中的语法比较多,比较常用的有:

指令 说明 示例
FROM 指定基础镜像 FROM centos:7
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的;
但是后面还是需要-p来做端口映射的
EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

以后我们会有很多java项目需要打包为镜像,它们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是很麻烦的。

所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建镜像

在/root/demo目录下有如下两个文件

目录文件

其中docker-demo.jar是Java项目;Dockerfile如下:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

然后,执行命令,构建镜像:

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .
  • docker build : 就是构建一个docker镜像

  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

    • # 直接指定Dockerfile目录
      docker build -t docker-demo:1.0 /root/demo
      

如果没有指定Dockerfile的名字,就必须叫Dockerfile。

运行结果如下:

运行结果

查看镜像

查看镜像

可以看到多了一个docker-demo的镜像;

尝试运行:

docker run -d --name dd -p 8080:8080 docker-demo:1.0

运行结果

标签:java,demo,jar,镜像,docker,Dockerfile,Docker
From: https://www.cnblogs.com/nicaicai/p/17764380.html

相关文章

  • Windows访问Oracle VM VirtualBox虚拟机下Linux docker
    设置网络中的NAT方式下的端口转发  配置主机端口和客体端口,客体端口设置Linuxdocker容器端口,主机端口设置windows访问docker时用到的端口。比如,Linuxdocker容器端口为80,客体端口设置为80,在windows访问时,通过localhost:主机端口,如localhost:80,就能访问。 ......
  • docker细节上的一些验证
    命名空间网络命名空间文件相关容器网络1命名空间dockerpsdockerinspect〈IDorNAME〉dockerinspectivlan_test43"Pid":6338,root@vm-133:~#ls-l/proc/6338/nstotal0lrwxrwxrwx1rootroot0Oct1315:49cgroup->'cgroup:[4026532870]'lrwxrwxrwx1r......
  • 博学谷学习记录 自我总结 用心分享 | Docker容器化
    前言容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,容器技术可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性。由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此容器技术(Container)结合虚拟化技术的解决方案正在......
  • 使用 Docker 在 Linux 上运行 Delphi 应用程序
     从RadStudio10.2Tokyo开始,可以编译和运行Linux服务器应用程序(无用户界面)。我们将使用Ubuntu准备一个docker映像,以及通过PAServer在Linux上运行Delphi应用程序所需的一切。使用Docker,我们可以将这些应用程序在Linux容器中部署到我们的生产系统中。从建立一......
  • label-studio docker-compose 运行试用
    label-studio是一个支持多格式的数据标注工具,以下是基于docker-compose运行的试用环境准备docker-composeversion:"3.9"services:nginx:image:heartexlabs/label-studio:latestports:-"8080:8085"-"8081:8086"......
  • Docker配置Oracle
    1.下载镜像dockerpullregistry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g2.创建并启动容器默认启动方式dockerrun-itd-p1521:1521--nameoracle--restart=alwaysregistry.aliyuncs.com/helowin/oracle_11g持久化启动方式dockerrun-itd-p1521:1521-......
  • 使用PasteSpider把你的代码升级到服务器的Docker/Podman上,K8S太庞大,PasteSpider极易上
    如果你的服务器的内存小于16GB,那么K8S就和你无缘了,但是你可以使用PasteSpider来实现发布你的项目到服务器上!PasteSpider是一个运维工具,使用NET编写的,部署于服务器的Docker/Podman上,他可以帮助你把你的项目发布到服务器上,支持源码模式,支持发布模式,支持一键发布!下面基于实际案例做......
  • docker搭建gitlab,集成CI/CD(gitlab-runner)
    搭建gitlab和gitlab-runner首先配置GITLAB_HOMEexportGITLAB_HOME=/srv/gitlab如果你是在BASH下,可以将以上配置放到~/.bash_profile文件中,使用source~/.bash_profile使其永久生效。dockerrun--detach\--hostname192.168.1.205\--publish9443:443--publish9......
  • 搭建Halo博客教程(阿里云 Docker)
    搭建Halo博客教程(阿里云Docker)购买阿里云服务器ECS在阿里云购买需要的服务器ECS这里选择安装的操作系统CentOS8.264位连接阿里云的服务器用SSH客户端进行连接服务器用PuTTY进行连接服务器打开阿里云控制台服务器ECS第一次创建的服务器要进行重置实例......
  • Docker dnmp 多版本php安装 php8.2
    Laravel9开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1.从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh和 install-php-extensions这两个文件 2.修改.env文件,添加php82的配置参数:##PHP82##......