一,介绍
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解压)