【Docker】如何更简单的做一个dockerfile文件?

一,介绍

    Dockerfile 是用来定义 Docker 镜像构建过程的文本文件。它包含了一系列的指令和参数,告诉 Docker 如何组装一个镜像。

一个基本的 Dockerfile 通常包含以下几个部分:

1.基础镜像指令(FROM):
  • 指定基于哪个已有的镜像构建新镜像。每个 Dockerfile 必须以 FROM 指令开始。
  • 示例:FROM ubuntu:20.04
2.工作目录设置(WORKDIR,可选):
  • 设置容器内部的工作目录。
  • 示例:WORKDIR /app
3.复制文件(COPY 或 ADD,可选):
  • 将文件或目录从构建上下文复制到镜像中的指定路径。
  • 示例:COPY . .
  • ADD 可以把压缩包解压,把解压后的目录拷贝到镜像
4.运行命令(RUN,可选):
  • 在镜像构建过程中执行的命令,可以安装软件包、更新系统等。
  • 示例:RUN apt-get update && apt-get install -y nginx
5.容器启动时执行命令(CMD 或 ENTRYPOINT,可选):
  • 容器启动后执行的默认命令,可以被 Dockerfile 中的 CMD 或 ENTRYPOINT 指令指定。
  • 示例:CMD [“nginx”, “-g”, “daemon off;”]
6.暴露端口(EXPOSE,可选):
  • 声明容器运行时的服务将监听的端口。
  • 示例:EXPOSE 80

采用如下模板,构建dockerfile文件:

FROM docker.io/library/rockylinux:8.9
WORKDIR /root/
RUN yum install wget -y
RUN yum install nginx -y
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]  

# 指定容器启动时执行的命令
#"/usr/sbin/nginx" 是 Nginx 可执行文件的路径。
#"-g", "daemon off;" 是 Nginx 的参数,用于以前台(非守护进程)模式运行。

注意:ENTRYPOINT 命令中,一般多使用双引号!!!**

运行dockerfile文件:

# 注意最后的小点
docker build -t mynginx:v1 -f dockerfile  .
# -t mynginx 指定了镜像的名称为 mynginx。
# . 表示 dockerfile 文件的路径,当前目录下应有一个名为 dockerfile 的文件。

二,实战

(1) tomcat 服务基于dockerfile做成镜像

FROM centos
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
COPY jdk-8u45-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.0.26.tar.gz /usr/local/
RUN cd /usr/local && yum install -y  jdk-8u45-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.0.26 /usr/local/tomcat8
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
EXPOSE 8080

dockerfile同级目录需要的文件:
Centos-vault-8.5.2111.repo
apache-tomcat-8.0.26.tar.gz
jdk-8u45-linux-x64.rpm

(2) go代码基于dockerfile做成镜像

1,准备环境:

yum install -y go

2,准备代码:

# vi main.go

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func statusOKHandler(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{"status": "success~welcome to study"})
}

func versionHandler(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{"version": "v1.1版本"})
}

func main() {
	router := gin.New()
	router.Use(gin.Recovery())
	router.GET("/", statusOKHandler)
	router.GET("/version", versionHandler)
	router.Run(":8080")
}

3,Go mod初始化项目

#设置代理 test为代码所在目录名
go mod init 【test】

go env -w GOPROXY=https://goproxy.cn,direct

go mod tidy

#构建源码
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go

4,构建dockerfile文件

FROM alpine
WORKDIR /data/app/
ADD k8s-demo /data/app/
CMD ["/bin/sh","-c","./k8s-demo"]

5,构建镜像 && 运行容器

docker build -t="mdy/go:v1" .

docker run -d --name go -p 8080 mdy/go:v1

效果:
访问:http://192.168.40.180:32787/version
返回:{“version”:“v1.1版本”}

访问:http://192.168.40.180:32787/
返回:{“status”:“success~welcome to study”}

dockerfile同级目录需要的文件:
main.go
其他为构建生成(k8s-demo)

(3) python代码基于dockerfile做成镜像

文件准备:
python3.7.tar文件:

# 导入python3.7镜像
docker load -i python3.7.tar

main.py 文件:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from Python!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

requirements.txt 文件:

Flask

构建dockerfile文件

FROM python:3.7
RUN mkdir /app/
WORKDIR /app/
ADD . /app/
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python","/app/main,py"]

dockerfile同级目录需要的文件:
main.py
requirements.txt
python3.7.tar (此文件为 docker save -o ,压缩镜像生成,不可通过tar解压)

(测试所需的文件资料,在资源下载即可!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直奔跑在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值