Docker笔记(二)应用的容器化(Dockerfile)

Docker与Java:如何将Java应用程序容器化,以及在Docker环境内部署和运行Java应用程序 创建Java应用程序: 这是我们的起点,你可以使用任何你熟悉的Java框架,如Spring Boot、JavaEE等创建一个标准的Java应用程序。 2. 创建Dockerfile: Dockerfile是一种由Docker提供的、能够方便我们定义和生成Docker镜像的文本文件。在文件中,我们会定义以下内容: 基础镜像:通常成为父镜像,这里我们使用官方的带有Java运行环境的镜像。 依赖:如果您的Java APP需要的某些额外设备或库,需要在这里定义安装命令。 源码COPY:复制应用程序到Docker 阅读详情

一、简介

将应用程序整合到容器中进行运行的过程,称为应用的“容器化”,也可以叫做“Docker化”。一个应用程序在代码编写,测试完成之后,还要面临在生产环境的构建,部署,运维等一系列繁杂的问题,开发人员与运维人员也许要经过多次的协调沟通才能将一个应用成功投入生产。设想如果将应用程序转变成一个容器,那些与应用运行所需环境相关的问题就几乎都不存在了,开发只需要专注于应用代码的开发,稍微加上一点“如何将应用变成容器”的说明工作,而运维人员只需要统一考虑容器的运行管理就可以了,本文就来介绍这个“如何将应用变成容器”的工作---应用的容器化。

二、应用容器化的整体流程

容器化可以简化应用的构建、部署和运行过程,我们先大体掌握以下主要流程步骤:

  1. 编写应用代码
  2. 在应用主目录下,创建一个Dockerfile,其中包括当前应用的描述、环境依赖、以及如何运行这个应用
  3. 在应用主目录下,对Dockerfile文件执行docker image build命令
  4. 等待Docker将应用程序构建到Docker镜像中
  5. 一旦应用被打包成了一个Docker镜像,就能以镜像的形式交付、转移、团队分享等,并以Docker容器的方式运行了

注意,Dockerfile文件首字母必须大写,这是Docker image build默认寻找的Dockerfile文件名,当然其实也可以通过-f 来指定Dockerfile的文件名,只不过一般情况下没有必要

三、Dockerfile详解

Dockerfile的两个主要作用:

  • 对当前应用的描述
  • 指导Docker完成应用的容器化,从构建至运行

打开一个Dockerfile文件,看一下具体长什么样子:

$ cat Dockerfile

# Dockerfile of Example
# Version 1.0
# Base Images
FROM centos
LABEL maintainer="you@example.com"
RUN yum install -y --update nodejs nodejs-npm
COPY . /src
WORKDIR /src
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]

  1. Dockerfile中的注释以#开头,除注释之外的每一行都是一条指令(Instruction)
  2. 指令的格式:INSTRUCTION args,指令不区分大小写,但建议指令大写,增强Dockerfile的可读性
  3. docker image build命令会按行一行一行来解析Dockerfile中的指令,并顺序执行

对上面Dockerfile示例文件的解读:

  • FROM centos    //以centos镜像作为当前镜像的基础,也就是上一篇中讲的基础镜像层
  • LABEL maintainer="you@example.com"    //指定维护者(maintainer)为“you@example.com”,元数据,不会添加新的镜像层,建议添加上维护者信息,这样可以给镜像潜在使用者提供沟通途径。
  • RUN yum install -y --update nodejs nodejs-npm    //在centos上用yum安装Nodejs和NPM到当前镜像中,新建镜像层
  • COPY . /src    //将当前目录中的所有文件(也就是应用代码)复制到镜像中,并新建镜像层
  • WORKDIR /src    //设置当前的工作目录,后续指令在此目录下执行,会作为元数据记录到镜像配置中,不会创建镜像层
  • RUN npm instal    //执行npm install安装依赖文件到镜像中,并创建镜像层
  • EXPOSE 8080    //指定应用的网络端口,通过8080端口对外提供Web服务,属于容器内的端口,元数据,不会新建镜像层
  • ENTRYPOINT ["node", "./app.js"]    //最后将app.js设置为镜像默认运行的应用,元数据,不会新建镜像层
表1  Dockerfile常用操作指令
指令含义
FROM 镜像指定基础镜像,第一条指令必须为FROM,每创建一个镜像就需要一条FROM
MAINTAINER 名字说明镜像的维护者信息
RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中
CMD["要运行的程序","参数一","参数二"]启动容器时要运行的命令或脚本,只能有一条CMD命令,如果有多个,执行最后一个
EXPOSE 端口号指定新镜像加载到Docker时需要开启的端口,也就是容器监听连接者的端口
ENV 环境变量 变量值设置一个环境变量比如path,会被RUN,CMD等指令用到,还可以定义版本信息便于维护
ADD 源文件/目录 目标文件/目录复制文件,源文件要和Dockerfile同级目录,与COPY不同是源文件可以是url
COPY 源文件/目录 目标文件/目录复制文件,源文件要和Dockerfile同级目录
VOLUME ["目录"]在容器中创建一个挂载点,里面存放的数据在容器销毁后仍然存在
USER 用户名/UID指定运行容器时的用户
WORKDIR 路径

为在该条命令之后的RUN,CMD,ENTRYPOINT指定工作目录,建议绝对路径

ENTRYPOINT ["运行的程序","若干参数"]指定镜像以容器方式启动后默认运行的程序
HEALTHCHECK健康检查

两个比较:

  • COPY和ADD  ADD是有更复杂语义的复制文件,COPY就是单纯的复制文件,ADD支持源文件是url远程下载,如果源文件是压缩文件,ADD指令会自动解压,复杂语义会带来一定的不确定性,因此建议复制文件就用明确的COPY
  • CMD和ENTRYPOINT  这两个命令是在镜像运行的时候执行的,RUN是在镜像构建的时候执行的,ENTRYPOINT一般指示镜像的主程序入口,CMD中的在和ENTRYPOINT同时存在时作为ENTRYPOINT的参数,Docker run 后附加的参数会被附加在ENTRYPOINT的后面。推荐的做法是ENTRYPOINT作为镜像的主命令,CMD来设定参数。

四、从Dockerfile构建镜像

进入应用主目录,执行如下命令:

docker image build -t mywebapp:latest -f Dockerfile.dev .

-t 指定镜像标签,-f 指定Dockerfile的路径和名称,如果不写,代表是当前目录下的Dockerfile,最后那个点.不能丢,代表从当前目录构建。

镜像构建完成后,可以从镜像启动容器:

docker run -d --name c1 -p 80:8080 mywebapp:latest

-d 让应用程序以守护进程的形式后台运行,-p 80:8080表示将主机的80端口映射到容器内的8080端口,--name 为容器起个名字,代替容器ID方便后续命令使用。


.Dockerignore文件

类似Git的.gitignore文件,Docker也有自己的构建忽略,就是.Dockerignore文件,像一些temp临时文件,测试文件,.git目录,*.md文件等,不必要放入Docker镜像中,在Docker镜像的构建过程中,加入.Dockerignore文件,可以提高构建效率。


五、Dockerfile的一些原则及注意事项

  • 避免安装非必要软件包,如文本编辑器,辅助工具等
  • 一个容器只运行一个进程,便于对每个容器进行监控和调优,也便于集群扩容或缩容。
  • 镜像层尽量保持最少,COPY,RUN,ADD指令会创建镜像层,不要随意使用这些命令
  • 多行参数分割,如果安装的软件包很多,建议按照字母顺序排序,并用反斜杠\换行分割,增强Dockerfile可读性
  • FROM指令建议使用官方提供的版本,不建议使用上百M的ubuntu,centos,建议使用轻量级安全的Alpine linux
  • Dockerfile文件要看作程序的组成部分,加入Git等版本控制

六、总结

本文主要介绍了通过Dockerfile将自己的应用构建成Docker容器的过程,主要以单体应用的构建为例,至于多容器的应用用到的Docker Compose,以及Docker Swarm集群,后续了解的更为深入时再来介绍。

上一篇:Docker笔记(一)概念理解及常用命令

Docker容器化应用的优势 1.背景介绍 Docker是一个开源的应用容器引擎,它使用标准的容器化技术来打包和运行应用程序,从而实现了应用程序的独立性、可移植性和可扩展性。Docker容器化应用的优势在于它可以帮助开发人员更快地构建、部署和运行应用程序,同时也可以帮助运维人员更好地管理和监控应用程序。 Docker的核心概念是容器,容器是一个包含了应用程序、库、系统 阅读详情

相关推荐

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?

本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。

weixin_30421809的博客 467

应用容器化的五个步骤

如果你是容器的新手,不要被那些术语所吓倒。这些关键原则将帮助你把应用迁移到云中。 一般来说,人们想使用你的应用程序这是一件好事。然而,当应用程序在服务器上运行时,应用程序受欢迎是有代价的。随着用户对资源需求的增加,在某些时候,你可能会发现你需要扩展你的应用程序。一种选择是在这种情况下增加更多的服务器,建立一个像 Nginx 这样的 负载平衡器,以满足需求。 但是,这种方法的成本可能很昂贵,因为当需求低的时候,在没有流量的服务器上运行你的应用程序的实例并不会节省资源。容器的优点是它是非持久的,在有需求时

Free雅轩的博客 1948

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5708

Docker封装服务器项目全流程。

Docker是一个开源的软件容器平台,可以让开发人员将应用程序与其所需的环境(如操作系统和依赖项)打包在一起,并将它们部署到任何地方。

kxlalala的博客 1200

SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】

在SAP系统中,分类账(Ledger)是用于会计核算的核心概念,它允许企业根据不同的会计原则和货币进行财务记录。定义分类账是配置平行账(Parallel Accounting)的第一步。分类账的创建:通过事务代码OX18可以创建新的分类账。通常,一个SAP系统会有一个主分类账(如0L),它代表法定会计和实时传输至管理会计(CO)的账本。分类账属性:在创建分类账时,需要定义其属性,如会计年度变式、货币、会计原则等。这些属性将决定分类账的核算规则和适用性。

数字化2025 4618

【仿真】Carla Python API实战:从零搭建自动驾驶测试环境

本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。

weixin_29050513的博客 214

容器化运维操作(一)——容器化基本介绍 & Docker基本介绍 & Docker 和虚拟机区别 & Docker的工作原理

容器化运维操作(一)——容器化基本介绍 & Docker基本介绍 & Docker 和虚拟机区别 & Docker的工作原理 5-6 容器化运维操作 日趋复杂的运维开发环境,对虚拟服务器及应用服务的要求更加的多元化。我们需要更加容易扩展、性能优越、方便监控的管理服务,容器化应用、容器化运维应运而生。 【知己知彼】你将在学习本课程中学习到: 理解/安装docker容器技术 秒级快速部署mysql、nginx、tomcat等服务 使用容器技术发布nodejs应用 … 【工欲善其事,必

weixin_44867717的博客 2597

RS-485调试踩坑实录:MAX13487数据回环问题排查与修复(附电路图)

本文深入解析了RS-485通信中MAX13487芯片的数据回环问题,提供了详细的排查过程和解决方案。通过分析芯片特性和自动换向机制,揭示了RO引脚配置不当是导致问题的关键原因,并给出硬件(添加上拉电阻)和软件(调整MCU配置)两种修复方案,附有优化设计建议和实际调试技巧。

play7的博客 1300

容器化技术-Docker

Docker

Zz1366的博客 5322

VGG16

VGG16学习笔记

一去不复返的通信er 1177

UE5 StateTree实战:用分层状态机重构你的AI行为逻辑(附蓝图配置避坑点)

本文详细介绍了UE5中StateTree分层状态机的实战应用,帮助开发者重构AI行为逻辑。通过核心概念解析、迁移策略、高级技巧和避坑指南,展示了StateTree在灵活性、可维护性和并行处理方面的优势,特别适合复杂AI行为的开发与优化。

weixin_42558257的博客 249

使用docker容器化应用程序

使用Dockerfile定制镜像 Dockerfile必须在应用的根目录下 指令不区分大小写 新建层的指令:from、run、copy 新增元数据的指令:expose(暴露端口)、workdir、env、entrypoint(入口点) 第一行必须是FROM img - 基础镜像层 LABEL指定标签,key value形式 RUN执行命令 shell 格式:RUN <命令>,就像直接执行在命令行中一样 exec格式:RUN [“可执行文件”,“参数1”,“参数2”]

☜@_@达奚黑雁的博客 192

基于STM32设计的水下水质检测装置(微信小程序)(205)

本项目设计了一款基于STM32微控制器为核心的水下水质检测设备,该设备具有高度集成化、智能化的特点,能够实时监测水深、温度、浊度及溶解性总固体(TDS)等关键水质参数,并通过4G网络将数据上传至腾讯云IOT物联网平台,实现远程监控和数据分析。同时,为了便于操作和移动观测,还配套开发了微信小程序,用户可通过微信小程序实时查看并控制设备的各项功能,如调整下潜深度等。

1252

Docker 通过Dockerfile容器化应用

什么是容器化? 将应用整合到容器并运行起来,成为“容器化”,有时也叫作“Docker化”。 容器化的过程 1.编写应用代码。 2.创建一个Dockerfile,其中包括当前应用的描述、依赖环境以及该如何运行这个应用。 3.对Dockerfile执行docker image build命令。 4.等待Docker将应用程序构建到Docker镜像中。 5.构建完成之后即可将镜像运行到容器中进行测试。 Dockerfile指令解析 FROM 以一个镜像为基础,在这个镜像的基础上制作镜像。因为FROM是指定基础镜

带文豪的零点时分 360

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Docker 容器化应用入门指南

Docker 是一种容器化技术,解决了软件在不同环境中运行效果不一致的问题。与虚拟机不同,Docker 容器共享主机内核,仅打包应用和依赖,使得环境配置更加简便。通过 Docker,开发者可以轻松将本地程序部署到云服务器或其他主机上,避免了手动安装依赖和配置环境的繁琐操作。Docker 的核心概念包括镜像(image)和容器(container),镜像用于创建容器,容器则是独立运行的环境。Dockerfile 是构建镜像的配置文件,通过一系列指令定义镜像的构建过程。Docker 还支持动态扩容和缩容,非常适

2401_84775829的博客 1241

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Docker容器化:快速部署Web应用的步骤

本文详细介绍了Docker容器化快速部署Web应用的步骤,包括编写Dockerfile、构建Docker镜像、运行容器、监控与管理等。Docker容器化技术以其环境一致性、资源隔离等优势,为Web应用的快速部署提供了有力支持。在未来,随着Docker技术的不断发展和完善,容器化部署将更加便捷和高效。同时,我们也需要关注容器化部署中的安全问题,如容器逃逸、镜像漏洞等。通过不断学习和实践,我们可以更好地利用Docker容器化技术,为Web应用的快速部署提供保障。

2501_92489014的博客 2204

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【DockerFile】SpringBoot应用容器化部署实战指南

本文系统介绍了SpringBoot应用容器化部署的全流程。主要内容包括:Dockerfile编写详解,涵盖基础镜像选择、时区配置、应用部署等生产级实践;Docker Compose多容器编排方案,实现SpringBoot+MySQL+Nginx的协同部署;镜像仓库管理方法;常见问题解决方案,如容器时间同步、数据库连接等。文章通过具体示例演示了容器化部署的完整工作流,从Dockerfile编写、镜像构建到Compose编排部署,帮助开发者快速掌握现代化应用部署方法,解决传统部署中的环境不一致等问题。

2302_79380280的博客 1204

Docker-dockerfile实例:容器化python的flask应用

实验目标: 用 Docker 部署一个Python 编写的 Web 应用。 **实验步骤:**基础镜像(python)–>flask–>部署python应用–>前端(html css js)–>flask–>服务(数据库) web框架 flask django 应用代码部分: 代码功能: 如果当前环境中有"NAME"这个环境变量,就把它打印在"Hel...

阿文的博客 3021

docker——容器化部署

- Docker是基于Google公司推出的Golang语言开发而来,基于Linux内核的Cgroups、NameSpace,以及Union Fs等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 - 对进程进行封装隔离,属于操作系统层面的虚拟化技术。 - 利用Docker可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本。

m0_48853274的博客 8224

Dockerfile 和 Docker Compose:容器化世界的两大神器

在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化的代表工具,提供了两种核心的配置文件:Dockerfile和。虽然它们都与 Docker 相关,但它们的用途和使用场景却截然不同。今天,我们就来详细聊聊它们的区别、联系,以及如何在实际项目中灵活运用。1.

leader_song的博客 1471

【Docker深入浅出】【四】单体应用容器化与Dockerfile怎么写

【Docker深入浅出】【四】单体应用容器化与Dockerfile怎么写

hiliang521的博客 1425

Docker容器化技术

Docker容器化技术

qq_49096347的博客 1848

【Docker】进阶之路:(八)应用的容器化

应用的容器化是指将应用整合到容器中并且运行起来的过程。通过应用容器化,可以简化应用的构建、部署和运行。使用容器化技术也可以让应用程序向云环境的部署变得更为高效。就像容器本身一样,运行容器的操作系统也能够被瘦身。因为容器已经持有应用程序运行所需的大部分依赖,所以这些用于容器的新型宿主机操作系统就不再需要包含所有依赖了。Docker提供了一种创建和运行已经在容器中完成配置的应用程序的方法。需要了解容器化应用的几个相关知识点如下。容器化应用不是直接在宿主机上运行的应用。

圈小圈DBA的博客 1190

【Python知识地图】Docker基础:容器化Python应用

Docker 是一个开源的平台,用于开发、交付和运行应用程序。Docker 通过将应用程序及其依赖项打包到一个称为容器的标准化单元中,使得应用程序可以在任何环境中一致地运行。本文将详细介绍如何使用 Docker 容器化 Python 应用,包括 Docker 的基本概念、安装和配置、创建 Dockerfile、构建和运行容器等步骤。

科技改变人类,技术成就未来 1230

使用 Docker 容器化 .NET 应用:从进阶到高深

容器化是一种将应用程序及其所有依赖打包到一个轻量、可移植的容器中的技术。容器与虚拟机不同,它们共享操作系统内核,但提供独立的运行环境。轻量级:相比虚拟机,容器启动更快,消耗资源更少。可移植:容器可以跨平台运行,确保应用在不同环境下的行为一致。隔离性:容器之间互相隔离,降低了资源冲突的可能性。通过本篇博客,我们从基础的容器化概念开始,逐步深入探讨了如何将 .NET 应用与 Docker 结合,并引入了高深的技术实践,如优化镜像、多阶段构建、CI/CD 集成以及 Kubernetes 编排。

qq_43535970的博客 1861

Java中的容器化与Docker应用

容器化技术,尤其是Docker,已成为现代软件开发和运维的核心工具,极大地提升了开发、部署和管理应用的效率。在Java中实现容器化与Docker应用涉及创建Dockerfile、构建和运行Docker镜像、使用Docker Compose管理多容器应用,以及优化和管理容器化的最佳实践。通过容器化技术,开发者可以构建一致、可移植且易于管理的应用环境,提高开发和部署的效率,同时确保应用的高可用性和可维护性。定期扫描镜像中的漏洞,使用Docker的安全功能如用户权限管理和镜像签名来提高容器的安全性。

微赚淘客系统开发者博客 1079
上一篇: Docker笔记(一)概念理解及常用命令
迟风池枫
博客等级 码龄10年 11粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值