Docker学习4 - Dockerfile、基于Dockerfile制作简单的镜像、基于Dockerfile部署Springboot项目

x33g5p2x  于2022-07-26 转载在 Docker  
字(5.6k)|赞(0)|评价(0)|浏览(701)

Dockerfile

作用: 利用文本定义某个镜像需要的东西,然后构建成新的镜像,非常适合CICD。而commit需要手动进入容器,手动增强镜像功能,在手动commit形成新的镜像

官网: https://docs.docker.com/engine/reference/builder/

概述

Dockerfile小知识1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数2. 指令按照从上到下,顺序执行3. #表示注释4. 每条指令都会创建一个新的镜像层并对镜像进行提交commit

Dokerfile执行流程1. docker从基础镜像运行一个容器2. 执行一条指令并对容器作出修改3. 执行类似docker commitl的操作提交一个新的镜像层4 docker再基于刚提交的镜像运行一个新容器5. 执行dockerfile中的下一条指令直到所有指令都执行完成
定义进程需要的东西真真正正的提供服务给用户使用角色扮演Dockerfile:软件的原材料类似(药方)的概念Docker镜像:软件的交付品Docker容器::软件镜像的运行态

关键字

参考Tomcat的Dockerfile实例: https://github.com/docker-library/tomcat/blob/be77ba3410933594589a61415d302686ab9798cb/10.0/jdk8/corretto-al2/Dockerfile

FROM - 基础镜像来源

官网: https://docs.docker.com/engine/reference/builder/#from

MAINTAINER - 作者信息

官网: https://docs.docker.com/engine/reference/builder/#maintainer-deprecated

注意: 新版Dockerfile官方建议使用 LABEL 进行取代

LABEL - 镜像描述信息(如作者信息,可自定义其他字段信息)

官网: https://docs.docker.com/engine/reference/builder/#label

RUN - 容器构建时执行的命令(容器内执行的命令)

使用时期: 构建镜像时执行的命令

官网: https://docs.docker.com/engine/reference/builder/#run

pm2写法RUN命令格式shell格式:进入容器内执行Shell命令exec格式:RUN ['可执行命令文件', '输入参数1', '输入参数2'] == 等价于shell命令格式:可执行命令文件 输入参数1 输入参数2

EXPOSE - 当前容器对外暴露的端口

官网: https://docs.docker.com/engine/reference/builder/#expose

WORKDIR - 落脚点-用户exec进入容器后当前Linux所在的目录(pwd)

官网: https://docs.docker.com/engine/reference/builder/#workdir

即:进入容器后当前所在的目录

USER - 指定镜像以什么用户执行-默认root

官网: https://docs.docker.com/engine/reference/builder/#user

即:进入容器后的whoami命令的值

ENV - 环境变量设置很像Shell脚本内的变量定义以及使用 - 等价于Linux的export命令

官网: https://docs.docker.com/engine/reference/builder/#env

ADD - 将宿主机目录下的文件拷贝进镜像(自动处理URL以及解压tar压缩包)

官网: https://docs.docker.com/engine/reference/builder/#add

COPY - 类似ADD、拷贝文件、目录进入镜像中

官网: https://docs.docker.com/engine/reference/builder/#copy

//格式 == COPY src dest
COPY 源路径文件、目录  镜像路径(不用事先建好)
CMD - 用户启动容器时需要干的事情 - 仅只能执行一条
概述

使用时期: 用户使用镜像时(即run)自动执行的命令

官网: https://docs.docker.com/engine/reference/builder/#cmd

pm2写法CMD命令格式shell格式:进入容器内执行Shell命令exec格式:RUN ['可执行命令文件', '输入参数1', '输入参数2'] == 等价于shell命令格式:可执行命令文件 输入参数1 输入参数2

特别注意

如果dockerfile文件末尾有定义CMD命令,当你使用容器时千万别多手加入其他命令,如/bin/bash

制定Tocmat镜像时的Dockerfile文件末尾

//主动执行dockerfile定义的   sh  catalina.sh run 命令
docker run -d -p 8080:8080  --name=tomcat   tomcat镜像ID 

//会将 CMD ["catalina.sh", "run"] 替换成   ["/bin/bash"] == 导致tomcat没执行启动命令
//所以run起服务型容器时,建议别手多多加后续的命令
docker run --rm -it -p 8080:8080 --name=tomcat-test tomcat /bin/bash

//如果是命令型容器,如liquibase、jdk镜像,则要加命令了

ENTRYPOINT - 容器启动时的命令(跟CMD有点像,但是不会被docker run参数覆盖,传入的参数会被当成ENTRYPOINT的入参非命令传入)

官网: https://docs.docker.com/engine/reference/builder/#entrypoint

//单独使用ENTRYPOINT == 容器启动时执行  sh  executable.sh param1 param2
ENTRYPOINT ["executable.sh", "param1", "param2"]

//配合CMD使用 == 容器启动时执行 sh executable.sh param1 param2 param3
ENTRYPOINT ["executable.sh", "param1", "param2"]
CMD ["param3"]
 
//容器启动时默认执行   nginx  -c   /etc/nginx/nginx.conf
//如果run时自定义传入my.conf字符,则容器启动执行则会变成     nginx  -c   my.conf
ENTRYPOINT["nginx",  "-c"]
CMD ["/etc/nginx/nginx.conf"]

使用

特别注意1: 每次Run都会自动跳回WORKDIR目录

特别注意2: ADD从宿主机迁移文件进入镜像时,必须将宿主机的文件跟Dockerfile放在同一个目录下,不得使用其他目录的绝对路径

特别注意3: Centos8的yum镜像已经停止使用,故需换成阿里云的centos stream的yum镜像 == 阿里云yum镜像切换官网

利用官方centos8镜像,增强vim、java功能生成我自己的centos镜像

构建前的文件结构

Centos-7.repo

[base]
name=CentOS-8-stream - Base - mirrors.aliyun.com
baseurl=https://mirrors.aliyun.com/centos/8-stream/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

[extras]
name=CentOS-8-stream - Extras - mirrors.aliyun.com
baseurl=https://mirrors.aliyun.com/centos/8-stream/extras/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

[centosplus]
name=CentOS-8-stream - Plus - mirrors.aliyun.com
baseurl=https://mirrors.aliyun.com/centos/8-stream/centosplus/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

[PowerTools]
name=CentOS-8-stream - PowerTools - mirrors.aliyun.com
baseurl=https://mirrors.aliyun.com/centos/8-stream/PowerTools/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

[AppStream]
name=CentOS-8-stream - AppStream - mirrors.aliyun.com
baseurl=https://mirrors.aliyun.com/centos/8-stream/AppStream/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

Dockerfile

FROM centos:latest

# 定义镜像描述信息
LABEL "author"="LinRuChang"
LABEL version="1.0"
LABEL description="This text illustrates"

# 进入容器后的目录
WORKDIR /www/server

# 阿里镜像源
# 特别注意:每次Run都会自动跳回WORKDIR目录
RUN cd /etc/yum.repos.d/ && echo "目录:$(pwd)" &&  ( ls -l *.repo &>/dev/null  )  &&  ( [ -d centos.back ] || mkdir centos.back  )  &&  mv *.repo centos.back/ 
# 阿里云的yum镜像信息 == centos8已经停更故使用 centos stream的信息
ADD Centos-7.repo /etc/yum.repos.d/
RUN echo "/etc/yum.repos.d/的文件: $( ls -l /etc/yum.repos.d )"

# RUN wget http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all  
RUN yum makecache



# 安装wget、vim、ifconfig、clean工具
RUN yum install wget -y
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install ncurses

# 安装JAVA
ADD jdk-8u202-linux-x64.tar.gz.gz  /www/server/jdk8/
RUN [ -d /www/server/jdk8/jdk1.8.0_202 ] && echo 'jdk-8u202-linux-x64.tar.gz.gz压缩包解压成功!!!!'
ENV JAVA_HOME /www/server/jdk8/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/

EXPOSE 80

CMD echo "当前目录: $(pwd)"
CMD echo "成功====================OK"
CMD /bin/bash

自制SpringBoot项目的Docker镜像

Dockerfile

# 基于java:8的镜像制作
FROM java:8

# 作者
MAINTAINER LinRuChang

# 将jar包传到容器上
RUN mkdir -p /www/server/docker
ADD docker-springboot-test-0.0.1-SNAPSHOT.jar /www/server/docker/docker-springboot-test-0.0.1-SNAPSHOT.jar

# run时执行的命令
ENTRYPOINT cd /www/server/docker && java -jar docker-springboot-test-0.0.1-SNAPSHOT.jar 

EXPOSE 8080

# 制作镜像开始
docker build -t my-spring-boot:1.0 .

整个操作流程

相关文章

最新文章

更多