docker学习(八)深入浅出理解 dockerFille

dockerFile是什么

一条条指令参数构成的文件
是构建镜像的新方法
dockerFile(原材料):面向开发 -》 docker(交付品)镜像为交付标准-》 docker容器(运行态)设计部署和运维 三者不可或缺
在这里插入图片描述
在这里插入图片描述

如何使用dockerFile

  1. 编写dockerFile文件
  2. docker build命令构建镜像
  3. 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 上传微服务

  1. 写java代码
  2. 打成jar包
  3. 上传和dockerFile同一个文件夹
  4. 编写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

构建镜像
运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值