Dockerfile
通过一系列的命令和参数,构建自定义镜像。一般步骤如下:
一. 常用命令说明
基础命令 | 具体命令 | 描述 | 例子 |
---|---|---|---|
FROM | FROM[基础镜像:版本号] | 基于指定的基础镜像构建自定义镜像 | FROM eclipse-temurin:17-jdk-alpine |
RUN | RUN | 构建容器需要运行的命令,在执行 docker build的时候运行 ,支持shell 和 exec两种格式 | |
CMD | **shell格式:**CMD <shell 命令> **EXEC格式:**CMD ["<可执行文件或命令>","<param1>","<param2>",...] 参数格式: CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 | 构建容器需要运行的命令, 在docker run 时运行,只有最后一个才会生效,支持shell 、exec、参数列表三种格式 | |
ENTRYPOINT | ENTRYPOINT ["<executeable>","<param1>","<param2>",...] | 构建容器需要运行的命令, 在docker run 时运行,只有最后一个才会生效,不会被docker run覆盖,一般和CMD的参数格式配合使用,组合结果会变成<ENTRYPOINT>“<CMD>” | |
EXPOSE | EXPOSE <端口1> [<端口2>...] | 暴露端口,相当于docker run -p XXX:[端口1] ,主要是声明一下容器需要哪些端口,易于后续维护 | |
WORKDIR | WORKDIR <工作目录路径> | 指定工作目录,镜像的工作目录就是该指定的目录 | |
ENV | ENV <key1>=<value1> <key2>=<value2>... | 相当于定义了个变量,后续的指令可以直接通过这个变量名 | |
ADD | ADD [--chown=<user>:<group>] <源路径1>... <目标路径> | 从源目录 中复制文件或者目录到容器里目标路径 ,强制将tar的压缩文件解压,不能处理非压缩文件 | |
COPY | COPY [--chown=<user>:<group>] <源路径1>... <目标路径> | 从源目录 中复制文件或者目录到容器里目标路径 | |
VOLUME | VOLUME ["<路径1>", "<路径2>"...] | 将容器指定路径的目录与主机挂载,缺点是无法在直接指定对应的路径要挂载的主机目录,而是会自动生成。看起来不如docker run -v |
二. 实践
上述过于枯燥,都是一些基本概念,让我们通过实践进一步加深理解。
1. 基于Dockerfile制作微服务镜像
1.1 准备一个微服务的jar包
这里就不提供了
1.2 编写Dockerfile
Dockerfile和该jar包应该在同一目录下
Dockerfile
#openJDK 基础镜像
FROM eclipse-temurin:17-jdk-alpine
# 作者
MAINTAINER yamu
# 设置工作目录
WORKDIR ./app
# 复制构建好的 JAR 文件到容器
COPY gulimall-gateway-0.0.1-SNAPSHOT.jar app.jar
# 暴露服务端口
EXPOSE 8600
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
1.3 构建镜像
docker build -t myGateway:1.0 .
1.4 运行镜像
docker run -p 8600:8600 --net mydata_default mygateway:1.0
运行成功
2. 基于Dokcerfile构建vim + ifconfig + jdk8 的Centos7
2.1 获取Centos7基本镜像
docker pull centos:7
运行容器
docker run -itd 命令将创建一个在后台运行的容器,同时保持标准输入开放,并分配一个伪终端。这种模式通常用于需要长时间运行的服务容器,同时也需要保留与容器交互的能力
docker run -itd --name centos7 -p 8600:80 --privileged=true centos:7 /usr/sbin/init
进入容器
docker exec -it centos7 /bin/bash
可以看到,当前centos7这个镜像是不具备有这些命令的
2.2 编写Dockerfile
如果没下载JDK镜像的先去小柒博客 | 开源软件镜像站下载,这里下载的版本是jdk-8u221-linux-x64.tar.gz
Dockerfile
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 安装vim
RUN yum -y install vim
# 安装ifconfig
RUN yum -y install net-tools
# 安装jdk17和lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 由于下载的是.gz的jdk压缩包,通过ADD可以直接解压到镜像工作目录
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD /bin/bash
2.3 构建镜像
docker build -t mycentos7:1.0 .
如果出现了如下报错,应该是centos的yum的源的问题,需要在Dockerfile中加入对阿里云yum镜像源的配置
修改后的Dokcerfile
FROM centos:7
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置阿里云yum镜像源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
RUN yum makecache
# 安装vim
RUN yum -y install vim
# 安装ifconfig
RUN yum -y install net-tools
# 安装jdk17和lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 由于下载的是.gz的jdk压缩包,通过ADD可以直接解压到镜像工作目录
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD /bin/bash
2.4 运行镜像和测试
docker run -itd --name mycentos7 -p 8600:80 --privileged=true mycentos7:1.0
docker exec -it mycentos7 /bin/bash