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