首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Dockerfile 实践:构建 Java、Python、Vue 和 Go 环境

Dockerfile 实践:构建 Java、Python、Vue 和 Go 环境

原创
作者头像
蚂蚁蚂蚁
修改于 2024-03-29 11:27:05
修改于 2024-03-29 11:27:05
4430
举报
文章被收录于专栏:技术分享技术分享

在这篇文章中,我将分享如何使用 Dockerfile 为不同的编程语言和框架创建 Docker 镜像。我们将覆盖 JavaPython、Vue3 和 Go。

Python

对于 Python,我们从一个基于 Python 3.10.12 的 Docker 镜像开始。我们设置环境变量 TZLANG,然后将工作目录切换到 /app/YOUR_PROJECT

接下来,我们复制 requirements.txt 文件,并使用 pip3 命令安装依赖项。然后,我们复制源代码和 .env 文件。

最后,我们暴露端口 8080,并设置 ENTRYPOINT 以启动我们的 Python 应用程序。

代码语言:dockerfile
AI代码解释
复制
FROM python:3.10.12-slim
ENV TZ=Asia/Shanghai
ENV LANG zh_CN.UTF-8

WORKDIR /app/YOUR_PROJECT
COPY ./requirements.txt /app/YOUR_PROJECT/
RUN pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple --upgrade pip && \
    pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple --no-cache-dir -r requirements.txt

COPY ./src .
COPY .env ./

EXPOSE 8080
ENTRYPOINT ["python3", "main.py"]

Go

对于 Go,我们首先在本地初始化项目:

代码语言:sh
AI代码解释
复制
go mod init YOUR_PROJECT
go mod tidy

然后,我们创建一个 Dockerfile。我们从一个基于 Go 1.20.2 的 Docker 镜像开始,设置时区,并将工作目录切换到 /app

接下来,我们复制 Go 源代码,并运行 go mod initgo mod tidy 命令来初始化 Go 模块。然后,我们使用 go build 命令构建我们的应用程序。

最后,我们复制 .env 文件,暴露端口 8080,并设置 CMD 以启动我们的 Go 应用程序。

代码语言:dockerfile
AI代码解释
复制
FROM golang:1.20.2
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /app

# V1: go mod init in builder
COPY *.go ./
RUN go mod init godemo && go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -o /godemo

# V2: go mod tidy locally and download Go modules in builder
#COPY go.mod go.sum ./
#RUN go mod download
#COPY *.go ./
#RUN CGO_ENABLED=0 GOOS=linux go build -o /godemo

# V3: copy excutable to container
#COPY build/godemo /

COPY .env ./

EXPOSE 8080
CMD ["/godemo"]

可以参考:Docker.Docs - Build your Go image(

Java

首先,我们从一个基于 Maven 和 OpenJDK 8 的 Docker 镜像开始构建我们的 Java 应用程序。然后,我们将 pom.xml 和源代码复制到临时目录,并运行 mvn package 命令来构建我们的应用程序。

在第二阶段,我们从一个基于 Alpine Linux 和 OpenJDK 8 的 Docker 镜像开始,更新系统,添加 libc6-compat 包,并创建一个符号链接。然后,我们将工作目录切换到 /app/,并从构建阶段复制我们的应用程序和资源文件。

最后,我们设置 ENTRYPOINT 以启动我们的 Java 应用程序。

代码语言:dockerfile
AI代码解释
复制
FROM maven:3-openjdk-8-slim AS BUILD
COPY pom.xml /tmp/
COPY src /tmp/src/
WORKDIR /tmp/
RUN mvn package

FROM openjdk:8-alpine AS RUNTIME
RUN apk update && apk add --no-cache libc6-compat
RUN ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2
WORKDIR /app/
COPY --from=BUILD /tmp/target/javademo-0.1-jar-with-dependencies.jar .
COPY src/main/resources ./resources
ENTRYPOINT ["java", "-cp", "*", "demo.JavaDemo"]

Vue

对于 Vue3 项目,可以使用 Vite 构建和打包,并通过 Nginx 对外提供服务

首先添加一个 Nginx 的配置文件

代码语言:conf
AI代码解释
复制
worker_processes 4;
events { worker_connections 1024; }

http {
    server {
        listen 8080;
        root  /usr/share/nginx/html/app;
        include /etc/nginx/mime.types;

        location /app/ {
            root  /usr/share/nginx/html;
            try_files $uri $uri/ /app/index.html;
        }
    }
}

然后,我们创建一个 Dockerfile。在构建阶段,我们从一个基于 Node.js 18 的 Docker 镜像开始,复制 package.json 文件,并安装依赖项。然后,我们复制源代码,并运行 npm run build 命令来构建我们的应用程序。

在生产阶段,我们从一个基于 Alpine Linux 和 Nginx 的 Docker 镜像开始,设置环境变量 TZ,并复制 Nginx 配置文件。然后,我们清空 Nginx 的默认 HTML 目录,并从构建阶段复制我们的应用程序。

最后,我们暴露端口 8080,并设置 ENTRYPOINT 以在前台运行 Nginx。

代码语言:dockerfile
AI代码解释
复制
FROM node:18-alpine AS build-stage
COPY package.json ./
RUN npm config set registry https://registry.npmmirror.com && npm install
COPY ./ .
RUN npm run build

FROM nginx:alpine as production-stage
ENV TZ=Asia/Shanghai
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build-stage /dist /usr/share/nginx/html/app
EXPOSE 8080

# set the container to run Nginx in the foreground
ENTRYPOINT ["nginx", "-g", "daemon off;"]

以上就是如何使用 Dockerfile 为不同的编程语言和框架创建 Docker 镜像的实践。希望这篇博客对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何从传统单体架构转向微服务
当今,把单体架构的应用拆成微型服务是很时髦的。让我想起了2000年世纪初的那些日子,那时SOA正在流行,大多数公司,供应商和系统集成商,正忙着挥动SOA魔杖,希望它能将他们的遗留应用程序转变为更加灵活和敏捷的SOA应用程序。一个供应商甚至说,“使用SOA,您不需要编写一行代码“。不幸的是,事实却根本不是这样。虽然他们的大肆宣传,努力去做,结果却不美好。虽然服务的概念还不错,但是SOA具有强类型的服务定义,并且在HTTP上使用SOAP非常麻烦。这些缺点似于谚语中所说的“当你有一个新的闪亮的锤子时,一切看起来都像钉子”,这就是SOA的末日。
程序你好
2018/05/24
2.1K0
如何从传统单体架构转向微服务
(译)Medium 的微服务架构
微服务架构的目标是帮助工程团队安全快速地完成高质量的产品交付。良好解耦的服务能够在最小化对其它系统的影响的条件下进行快速迭代。
崔秀龙
2019/07/23
4940
(译)Medium 的微服务架构
第12章 Spring Boot与微服务第12章 Spring Boot与微服务12.1 微服务架构12.2 Spring Cloud构建微服务架构
随着RESTful web服务和JSON数据交换格式流行,简单快速建立一个可连接的服务已经越来越方便了。随着持续交付概念推广以及Docker容器普及,微服务将这两种理念和技术结合起来,形成新的微服务+API + 平台的开发模式,以及容器化微服务的持续交付概念。
一个会写诗的程序员
2018/08/20
6180
第12章 Spring Boot与微服务第12章 Spring Boot与微服务12.1 微服务架构12.2 Spring Cloud构建微服务架构
微服务设计指南
微服务是当今软件工程师的一个热门话题。让我们了解如何使用微服务架构风格构建真正模块化、业务敏捷的IT系统。
yuanyi928
2018/12/07
1.2K0
微服务设计指南
微服务架构体系——它适合您的软件开发吗?
“Microservice architecture provides a range of technical benefits that contribute to the development velocity and product quality in software projects, while also contributing to the overall business agility”– Mark Emeis, Senior director of software technologies, CA Technologies
程序你好
2018/09/29
7620
微服务架构体系——它适合您的软件开发吗?
可组合架构与微服务:哪个更优?
两种软件开发架构都有各自的优缺点。下面是如何决定可组合架构还是微服务架构哪种更适合你的方法。
云云众生s
2024/03/28
1810
微服务的几种设计模式
定义:微服务架构是将软件系统分解为可独立部署的自治单元,这些单元通过轻量级、与语言无关的方式进行通信,并共同实现业务目标
素履coder
2022/02/17
9460
微服务的几种设计模式
解析微服务架构(一):什么是微服务
解析微服务架构系列文章将分几篇描述微服务的定义、特点、应用场景、企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型。 为什么需要微服务架构 “微服务”架构是近期软件应用领域非常热门的概念。让我们先来看看传统IT架构面临的一些问题: 使用传统的整体式架构(Monolithic Architecture)应用开发系统,如CRM、ERP等大型应用,随着新需求的不断增加,企业更新和修复大型整体式应用变得越来越困难; 随着移动互联网的发展,企业被迫将其应用迁移至现代
逸鹏
2018/04/11
1.2K0
解析微服务架构(一):什么是微服务
【微服务架构】一文读懂单片到微服务架构的模式和最佳实践
在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百万个请求。 Event-Driven Architecture 本课程将是软件架构设计的旅程,逐步将架构单片演变为事件驱动的微服务。 我们将从设计处理少量请求的电子商务整体架构开始软件架构的基础知识。 Journey of Design Architectures 之后逐步演
架构师研究会
2022/03/30
9900
微服务架构设计中的设计模式、原则及最佳实践
本文既有理论知识,又有实用信息:我们将学习每一种具体的模式,为什么以及应该在什么地方使用;然后,我们将看下应用了这些模式的参考架构;接下来,我们将综合运用新学到的模式设计我们的架构;最后,我们将确定选用什么技术实现架构。
用户2781897
2021/11/10
5510
什么是微服务
在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
前朝楚水
2018/07/26
1K0
简历驱动开发?微服务中的几种失败路径
在去年 11 月的 QCon Plus 上,我介绍了微服务可能走入歧途的一些路径。我是 IBM 的一名顾问,我的一部分工作是帮助业务迈向云原生。本文提到的这些问题都是从我的经验总结出来的 -- 不幸的是,它们在实践中是非常常见的。
深度学习与Python
2022/03/23
3880
简历驱动开发?微服务中的几种失败路径
实践微服务六年,我获得了这些心得体会
我是一名微服务架构的忠心拥趸,虽然有时也会对其感到不爽。使用微服务时,我时常能感受到“小中见大”、“稳中有快”等理念,另一方面也会警惕“厨子太多烧坏了汤”。
xcbeyond
2020/10/21
8160
实践微服务六年,我获得了这些心得体会
Medium 微服务策略
微服务架构的目标是帮助技术团队更快、更安全、更高质量的推动产品,服务解耦可以让团队快速迭代,对系统的影响最小。
dys
2018/12/17
1K1
跟着小程来学微服务--微服务思想
一直对微服务非常感兴趣,因为公司的架构改造正好有机会能够接触微服务,买来一些书,请教了很多微服务大牛同时自己也做了很多总结,写成了80页ppt,算是我对微服务的一个认识吧,微服务本身不同的人有不同的理解,而我就从我自己的角度来谈谈微服务是什么。
小程故事多
2018/08/22
4570
跟着小程来学微服务--微服务思想
【微服务架构】什么是微服务? — 全面了解微服务架构
What is Microservices — Edureka 您有没有想过,什么是微服务以及扩展行业如何与它们集成,同时构建应用程序以满足客户的期望? 要了解什么是微服务,您必须了解如何将单体应用程序分解为独立打包和部署的小型微型应用程序。本文将让您清楚了解开发人员如何使用微服务根据需要扩展其应用程序。 在本文中,您将了解以下内容: 为什么是微服务? 什么是微服务? 微服务架构的特点 微服务架构的优势 设计微服务的最佳实践 使用微服务的公司 为什么是微服务? 现在,在我告诉你微服务之前,让我们看看在
架构师研究会
2022/04/24
2.6K0
【微服务架构】什么是微服务? — 全面了解微服务架构
什么是微服务?
微服务体系结构是在体系结构级别应用单一责任原则的自然结果。与传统的单片体系结构相比,这带来了许多好处,例如不同组件的独立可部署性、语言、平台和技术独立性、不同的可伸缩性轴以及增加的体系结构灵活性。
霍格沃兹测试开发Muller老师
2022/12/01
5370
一文读懂微服务
在本文中,我将讨论什么是微服务,它们为何如此重要。我们将从微服务历史以及它们与单体架构的比较开始。然后,我们将讨论微服务架构的一些原理,其潜在的缺点,以及如何与容器和Kubernetes等现代工具结合使用。
DevOps持续交付
2021/03/16
6060
一文读懂微服务
微服务架构及其最重要的10个设计模式
微服务架构,独享数据库、事件驱动、CQRS、Saga、BFF、API 网关、Strangler、断路器、外部化配置、消费端驱动的契约测试
深度学习与Python
2021/01/06
1.3K0
什么是微服务架构
什么是微服务? 微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。 微服务的概念源于2014年3月Martin Fowler所写的章“Microservices”http://martinfowler.com/articles/microservices.html 单体架构(Monol
程序员鹏磊
2018/02/09
1.4K0
什么是微服务架构
推荐阅读
相关推荐
如何从传统单体架构转向微服务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档