应用场景:通过一个Dockerfile,生成自定义镜像
为什么要使用Dockerfile
Dockerfile根据要求自动创建镜像
| 指令 | 说明 |
|---|---|
FROM |
指定基础镜像(比如 Python、Node.js、Ubuntu 等) |
WORKDIR |
设置工作目录(后续命令都在这个目录下执行) |
VOLUME |
告诉使用者数据卷挂载到哪个目录 |
COPY |
将本地文件复制到镜像中(不支持解压) |
ADD |
类似 COPY,但支持解压文件等高级功能(推荐优先用 COPY) |
RUN |
构建镜像时执行的命令 |
CMD |
容器启动时默认执行的命令(可以被运行时覆盖) |
ENTRYPOINT |
容器启动时执行的命令(不会轻易被覆盖) |
EXPOSE |
声明容器运行时监听的端口 |
ENV |
设置环境变量 |
ARG |
构建参数(只在构建时使用) |
server {
listen 80;
server_name bird.zhubl.xyz;
root /app/code/bird/;
location / {
index index.html;
}
location ~* \.(html|js|css)$ {
expires 1d;
}
location ~* \.(jpg|jpeg|bmp|gif|png)$ {
expires max;
}
}
vim Dockerfile
FROM nginx:1.24
LABEL author=zhu desc="custom bird image"
RUN mkdir -p /app/code/bird/
ADD bird.tar.gz /app/code/bird/
ADD default /etc/nginx/conf.d/
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
#指定基础镜像
FROM nginx:1.24
#基本信息
LABEL author=zhu desc="custom bird image"
#对镜像进行操作,执行命令
RUN mkdir -p /app/code/bird/
#添加本地文件到镜像中
ADD bird.tar.gz /app/code/bird/
ADD default /etc/nginx/conf.d/
#告诉镜像使用者映射的端口是80 443端口
EXPOSE 80 443
#入口指令(运行容器后默认运行下面的命令)
CMD ["nginx","-g","daemon off;"]
docker build -t web:bird_v3 .
. 表示Dockerfile在当前目录下
-t 表示给自定义镜像命名

docker run -d --name bird_v2 -p 80:80 -p 443:443 --restart always web:bird_v2

http://10.0.0.81:80

FROM nginx:1.24
LABEL author=zhu desc="custom bird image"
ENV CODE_DIR=/app/code/bird/
ENV CODE_NAME bird.tar.gz
WORKDIR ${CODE_DIR}
RUN mkdir -p ${CODE_DIR}
ADD ${CODE_NAME} ${CODE_DIR}
ADD default.conf /etc/nginx/conf.d/
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
docker build -t web:bird_v3 .

docker exec -it bird_v3 /bin/bash

| CMD和ENTRYPOINT区别 | 共同点 | 区别 |
|---|---|---|
| CMD | 运行容器的时候默认运行CMD或ENTRYPOINT后面的命令 | 运行容器的时候如果指定了命令,则CMD的内容就会被替换 |
| ENTRYPOINT | 运行容器的时候默认运行CMD或ENTRYPOINT后面的命令 | 运行容器的时候如果指定了命令,则entrypoint+指定的命令 |
自定义镜像
FROM test:1.1
CMD ls
运行容器
docker run -d test:1.1 sleep 99
CMD指定的ls命令就会被替换为sleep 99
sleep 99
自定义镜像
FROM test:1.1
ENTRYPOINT ls
运行容器
docker run -d test:1.1 sleep 99
ENTRYPOINT指定的ls命令添加sleep 99参数
ls sleep 99
FROM nginx:1.24
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]

FROM tomcat:9.0-jdk8
LABEL auth=zhu desc='zrlog docker image'
ENV CODE_NAME ROOT.war
WORKDIR /usr/local/tomcat/webapps/
ADD ${CODE_NAME} .
EXPOSE 8080
CMD ["catalina.sh", "run"]
# 监控业务是否正常
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:80
docker build -t web:zrlog_v1 .

docker run -d --name zrlog -p 8080:8080 --restart always web:zrlog_v1

http://10.0.0.81:8080


FROM java:8u111-jdk
LABEL author=zhu desc="exam backend"
ENV VER 3.9.0
ENV ENVIR prod
ENV CONF application-${ENVIR}.yml
ENV CODE xzs-${VER}.jar
ENV DIR /app/code/exam/backend/
RUN mkdir -p ${DIR}
WORKDIR ${DIR}
ADD ${CONF} .
ADD ${CODE} .
ADD entry.sh .
EXPOSE 8000
CMD ["./entry.sh"]
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8000
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:www.zhubl.xyz
# Desc:
##############################################################
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
docker build -t web:exam .

docker run -d --name exam -p 8000:8000 --restart always web:exam



FROM ubuntu:22.04
LABEL author=zhu desc="zrlog_ubuntu images"
ENV CODE_NAME=ROOT.war
ENV TOMCAT_NAME=apache-tomcat-9.0.106.tar.gz
ENV DIR=/app/tools/
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openjdk-11-jdk curl
RUN mkdir -p ${DIR}
ADD ${TOMCAT_NAME} ${DIR}
RUN mv ${DIR}apache-tomcat-9.0.106 ${DIR}tomcat
WORKDIR ${DIR}tomcat/
RUN rm -rf webapps/ROOT
ADD ${CODE_NAME} webapps/
EXPOSE 8080
CMD ["./bin/catalina.sh", "run"]
# 监控业务是否正常
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl http://127.0.0.1:8080

FROM ubuntu:22.04
LABEL author=zhu desc="exam_ubuntu images"
ENV VER=3.9.0
ENV ENVIR=prod
ENV CONF=application-${ENVIR}.yml
ENV CODE=xzs-${VER}.jar
ENV DIR /app/code/exam/backend/
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openjdk-11-jdk curl
RUN mkdir -p ${DIR}
WORKDIR ${DIR}
ADD ${CONF} .
ADD ${CODE} .
ADD entry.sh .
EXPOSE 8000
CMD ["./entry.sh"]
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8000
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:www.zhubl.xyz
# Desc:
##############################################################
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
docker build -t web:exam .
docker run -d --name exam -p 8000:8000 --restart always web:exam
http://10.0.0.81:8000
