欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/3/13 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 docker学习(八)深入浅出理解 dockerFille 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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 isolatedENV 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 A9C5DF4D22E99998D9875A5110C01C5A2F6059E7ENV TOMCAT_MAJOR 10 ENV TOMCAT_VERSION 10.1.0-M17 ENV TOMCAT_SHA512 e56506984201f07c161eaa6757d5e35e834319a071bf8dadef58500d9983194f29c59ba4e42fe8d09c4629525aa11f81ce9b24bfeb31c675f6a0bf505d9b8c7dRUN 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_applicationsmv 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 dependenciesapt-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/77find ./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/35chmod -R +rX .; \chmod 777 logs temp work; \\ # smoke testcatalina.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 80CMD echo $MYPATH CMD echo "success ----- ok " CMD /bin/bash 输出结果: (出现这个 表现完美运行)Successfully built 184f4fa586c7Successfully 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

    构建镜像
    运行

    总结

    以上是生活随笔为你收集整理的docker学习(八)深入浅出理解 dockerFille的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。