共计 2134 个字符,预计需要花费 6 分钟才能阅读完成。
项目背景
搭建一个基于 springcloud 的分布式博客系统, 已经实现了基于 eureka 的配置中心和注册中心,为了减少本地的内存压力,使用 docker 将配置中心注册中心放到服务器上
初学者初探
- dockerfile 中的 WORKDIR 的用处
docker build -t imageName path,这里 path 指的是上下文路径,如 ADD COPY 等命令都需要一个源路径和目标路径,那么源路径和目标路径的定位是相对于那个路径呢?源路径就是相对于 path,它只能访问 path 下的目录,在 path 外的目标是不能被访问到,目标路径相对的就是这个 WORKDIR,表示当前容器在运行是访问的根路径,比如 RUN java -jar target.jar 的时候,这个 target 在容器中的某个目录下,通过 WORKDIR 定位到这个目录,就能能通过 RUN 来执行到这个 target.jar,而不需要在 RUN 中指定额外的相对或者绝对路径定位这个 jar 文件
- 制作一个含有 jdk 环境的 Dockefile
制作这么一个 Dockerfile 也不难,指定 FROM centos, 通过 add 将 jar 解压到容器目录里面,最后通过 ENTRYPOINT 指定 java -jar && tail -f > /etc/null 执行 springboot 的 jar 包并保证进程不退出。但 jdk 的环境变量配置需要注意,有三种写法,一种通过 RUN SED -i “$a” /etc/profile 将 jdk 的环境变量写进 profile, 第二种通过 RUN echo “JAVA_HOME” >> /etc/profile,第三种直接通过 dockerfile 提供的 ENV JAVA_HOME 来设置 jdk 的环境变量。前面两种都是通过在 /etc/profile 中写环境变量来完成,但是指定 RUN source /etc/profile 是行不通的,你需要进入容器中 source /etc/profile 才能让 /etc/profile 的环境变量生效。第三种是最简单的设置方法,设置了在容器容器时直接生效。
- RUN 命令中的 && 命令连接
RUN command 一个 RUN 会产生一个中间的容器,那么一套相关的命令可以通过 RUM command && command 来进行连接,换行可以指定,如果不指定直接换行连接 command 会出现一些语法错误,这样有什么好处呢?更加直观?命令功能分块集中?你觉得好就对了何必教科书般的说出个之所以然来,RUM cd /usr/local && npm install 这条命令如果分开写成两个 RUN 会如何?导致 install 访问不到 /usr/local 的文件,它因为是重新开始一个容器,访问的路径时 WORKDIR 指定的根目录
- CMD 的 ENTRYPOINT 的区别
dockerfile 中的一些指令都是可以通过 docker run 来覆盖的,比如 -v 挂载可以覆盖 VOLUME -p 可以覆盖 EXPOSE 指定的端口, - w 可以覆盖 WORKDIR,-v 可以覆盖 ENV 环境变量,这里的 docker run imageId command 中的 command 可以覆盖 CMD,所以容器的启动后执行的命令还是写在 ENTRYPOINT 比较好,避免被覆盖掉。
- docker run 中的 -it 是什么意思,- d 是什么意思,后面跟个 command 为 /bin/bash 又是什么意思
i 表示交互,t 表示伪终端,- d 是后台运行,/bin/bash 是容器启动时执行 /bin/bash 命令在容器中打开一个进程进入 /bin/bash。解释了但是没有实践又怎么知道是怎么个回事。那么如果不指定 -d,会使容器在前台执行进程,将控制台打印这些执行信息,如果指定了 - d 那么容器进程在后台执行,不会打印执行信息,也不用想办法退出当前容器执行的进程。一般运行 docker run 以后直接在控制台打印这个容器的 id 信息,但是我又想进入容器怎么办?docker exec 吗,我执行进去看看不想写这个命令,这时候可以通过 docker run -it /bin/bash 执行完就能进入到这个容器里面查看一些信息,这应该就是所谓的交互
- dockerfile 通过 docker build 通过 docker images 可以找到这个镜像,删除 dockerfile 上下文会生效吗
之前试了一下,也不知道是不是服务器内存不够,执行 docker run 没生效,还需要待实践
- 挂载目录的理解
挂载目录可以在 dockerfile 中通过 volume 指定,这只能指定容器的挂载目录,宿主机的挂载目录自动生成,可以通过 docker inspect imageId 查看,也可以通过 docker run -v path:path 指定,那么我在宿主机的挂载目录中更改一些信息,它会立马响应到容器对应挂载的目录里面
- dockerfile 制作启动 springboot 项目的镜像,如何更新 jar 包
最初认为只要挂载好宿主机的存放 jar 的目录到指定的容器目录中,通过 docker restart 重新执行 dockerfile 中的 ENTRYPOINT java -jar target.jar 命令来执行这个容器的挂载目录更新的 target.jar,这样就能完成 jar 的更新,发现行不通每次发布新的 jar 都需要通过 docker build 重新构建镜像,具体还需要实际操作总结