dockerFile是什么
一条条指令参数构成的文件
是构建镜像的新方法
dockerFile(原材料):面向开发 -》 docker(交付品)镜像为交付标准-》 docker容器(运行态)设计部署和运维 三者不可或缺
如何使用dockerFile
- 编写dockerFile文件
- docker build命令构建镜像
- docker run 镜像实例
保留字
- ADD (copy+解压unzip~):将宿主机目录下的文件拷贝进镜像,而且自己会处理URL和tar压缩包
- COPY :拷贝文件和目录到镜像中 源文件-》目标地址
- CMD:指定容器启动后执行的命令 ,只有最后一个CMD能生效 ,而且CMD 的命令还会被dockerFile替换
-
CMD:docker run时运行
-
RUN :docker build 时运行
- ENTRYPOINT : 不会被docker run后面的命令覆盖 这些参数送给ENTRYPOINT 指令指定的程序 可以和CMD 一起使用
-
一般是变参 才会使用CMD ,这里的CMD 等于给 ENTREYPOINT传递参数
-
指定了ENTRYPOINT 后 ,CMD的含义发生了变化 ,不再是直接运行其命令,
-
而是将cmd 的内容作为参数传递给ENTRYPOINT 。
-
他两个组合会编程<ENTRYPOINT > <CMD>
------------------------------- 案例 --------------------------------------------------------
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
//from :继承的基础镜像 ,基于哪个镜像
FROM eclipse-temurin:17-jdk-jammy
//运行时环境 :用于配置环境变量 ENV key value (键值对),在后面的任何run指令都可以使用 。
//相当于java 中 String CATALINA_HOME /usr/local/tomcat ;
// $CATALINA_HOME (引用CATALINA_HOME)= /usr/local/tomcat
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
//run 容器构建(build)时需要执行的命令 ,有两种格式 1.shell 在命令行执行shell等于在终端执行shell
// 2.exec:
// ["可执行文件,参数1,参数2"]->["./test.php","dec ","offline"]
// :RUN ./test.php dec offline
//此处相当于 在tomcat的容器内执行mkdir -p "$CATALINA_HOME"
RUN mkdir -p "$CATALINA_HOME"
//- WORKDIR: 容器内的落脚点 ,WORKDIR指定一个目录后 , 你在容器内pwd 一下 就是那个目录
WORKDIR $CATALINA_HOME
# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
# see https://www.apache.org/dist/tomcat/tomcat-10/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)
ENV GPG_KEYS A9C5DF4D22E99998D9875A5110C01C5A2F6059E7
ENV TOMCAT_MAJOR 10
ENV TOMCAT_VERSION 10.1.0-M17
ENV TOMCAT_SHA512 e56506984201f07c161eaa6757d5e35e834319a071bf8dadef58500d9983194f29c59ba4e42fe8d09c4629525aa11f81ce9b24bfeb31c675f6a0bf505d9b8c7d
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
gnupg \
; \
\
ddist() { \
local f="$1"; shift; \
local distFile="$1"; shift; \
local mvnFile="${1:-}"; \
local success=; \
local distUrl=; \
for distUrl in \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
"https://www.apache.org/dyn/closer.cgi?action=download&filename=$distFile" \
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
"https://downloads.apache.org/$distFile" \
"https://www-us.apache.org/dist/$distFile" \
"https://www.apache.org/dist/$distFile" \
"https://archive.apache.org/dist/$distFile" \
# if all else fails, let's try Maven (https://www.mail-archive.com/users@tomcat.apache.org/msg134940.html; https://mvnrepository.com/artifact/org.apache.tomcat/tomcat; https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/)
${mvnFile:+"https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/$mvnFile"} \
; do \
if curl -fL -o "$f" "$distUrl" && [ -s "$f" ]; then \
success=1; \
break; \
fi; \
done; \
[ -n "$success" ]; \
}; \
\
ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz"; \
echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \
ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz.asc"; \
export GNUPGHOME="$(mktemp -d)"; \
for key in $GPG_KEYS; do \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
done; \
gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \
tar -xf tomcat.tar.gz --strip-components=1; \
rm bin/*.bat; \
rm tomcat.tar.gz*; \
command -v gpgconf && gpgconf --kill all || :; \
rm -rf "$GNUPGHOME"; \
\
# https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications
mv webapps webapps.dist; \
mkdir webapps; \
# we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB)
\
nativeBuildDir="$(mktemp -d)"; \
tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \
apt-get install -y --no-install-recommends \
dpkg-dev \
gcc \
libapr1-dev \
libssl-dev \
make \
; \
( \
export CATALINA_HOME="$PWD"; \
cd "$nativeBuildDir/native"; \
gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
aprConfig="$(command -v apr-1-config)"; \
./configure \
--build="$gnuArch" \
--libdir="$TOMCAT_NATIVE_LIBDIR" \
--prefix="$CATALINA_HOME" \
--with-apr="$aprConfig" \
--with-java-home="$JAVA_HOME" \
; \
nproc="$(nproc)"; \
make -j "$nproc"; \
make install; \
); \
rm -rf "$nativeBuildDir"; \
rm bin/tomcat-native.tar.gz; \
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \
| awk '/=>/ { print $(NF-1) }' \
| xargs -rt readlink -e \
| sort -u \
| xargs -rt dpkg-query --search \
| cut -d: -f1 \
| sort -u \
| tee "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt" \
| xargs -r apt-mark manual \
; \
\
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /var/lib/apt/lists/*; \
\
# sh removes env vars it doesn't support (ones with periods)
# https://github.com/docker-library/tomcat/issues/77
find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \
\
# fix permissions (especially for running as non-root)
# https://github.com/docker-library/tomcat/issues/35
chmod -R +rX .; \
chmod 777 logs temp work; \
\
# smoke test
catalina.sh version
# verify Tomcat Native is working properly
RUN set -eux; \
nativeLines="$(catalina.sh configtest 2>&1)"; \
nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \
nativeLines="$(echo "$nativeLines" | sort -u)"; \
if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
echo >&2 "$nativeLines"; \
exit 1; \
fi
//对外暴露的端口
EXPOSE 8080
//当你执行 docker run -it --rm tomcat:9.0 ,后面会自动追加 CMD ["catalina.sh", "run"]
//最终: docker run -it --rm tomcat:9.0 CMD ["catalina.sh", "run"]
CMD ["catalina.sh", "run"]
------------------------------- 案例 --------------------------------------------------------
编写DockerFile文件
# 这个镜像基于上面
FROM centos
#作者是谁
MAINTAINER *******
#设置一个变量
ENV MYPATH /usr/local
#设置容器启动后的落脚点:
WORKDIR $MYPATH
# 防止 Failed to download metadata for repo 'appstream'报错 更换镜像源
RUN cd /etc/yum.repos.d/
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#在容器内安装这些东西 相当于你在linux执行 yum -y install vim....
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 这里 在dockerFeil的一个文件同一级目录放了个dk-8u171-linux-x64.tar.gz
#此处的命令是 1.解压 jdk-8u171-linux-x64.tar.gz 2.将解压后的文件放在容器 /usr/local/java/ 下
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置jdk的环境变量 咯...
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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:$PATH
#对外暴露端口
EXPOSE 80
CMD echo $MYPATH
CMD echo "success ----- ok "
CMD /bin/bash
输出结果: (出现这个 表现完美运行)
Successfully built 184f4fa586c7
Successfully tagged centosjava8:1.1
dockerFile 上传微服务
- 写java代码
- 打成jar包
- 上传和dockerFile同一个文件夹
- 编写dockerFile
FROM java:8
MAINTAINER rabbitcunk
#相当于在容器内生成一个文件夹 ,这个文件夹在主机上有对应的目录(一般后边有一串乱码 保证一个容器一个/tmp 唯一性) ,你用docker inspect找到然后
#就可以同步进行更改
VOLUME /tmp
#解压 并且重命名jar文件
ADD mic-io-0.0.1-SNAPSHOT.jar a.jar
#相当于在linux 执行 java -jar a.jar
ENTRYPOINT ["java","-jar","a.jar"]
EXPOSE 8080
构建镜像
运行