由于本人不是运维,并且没有深入学习过docker,特意在此将每次可能会在生产开发中遇到的docker问题记录。
这个文章会一直更新,主要是用于记录在工作中会遇到的docker使用的情况和命令。
精简镜像使用 Shell
大多数精简镜像(如 Alpine)默认使用 /bin/sh
,直接运行容器时不指定 Shell
# 不指定 Shell,使用镜像默认的入口命令
docker run -it --rm your-image
# 或显式使用 /bin/sh
docker run -it --rm your-image /bin/sh
在Docker容器无法使用宿主机上的Host
Docker容器运行的时候有 host 、 bridge 、 none 三种网络可供配置。默认是 bridge ,即桥接网络,以桥接模式连接到宿主机; host 是宿主网络,即与宿主机共用网络; none 则表示无网络,容器将无法联网。
# --network host 指定docker容器运行时的网络模式
docker run --network host -d imagename:tag
制作的Docker镜像太大
我们经常将jar包放到java的环境镜像中后打包制作出一个新的镜像,然后发现该镜像的大小往往都是几百M起。
在网上百度后,可以看到很多的回复,一时间不知道怎么选择。
在这里我会给出一个大家最经常遇到的情况,其余需求还请自行百度。
我们通常的情况下,制作的镜像太大,主要是依赖的镜像本身就很大,比如我用的java8的镜像。这个镜像有600M,所以基于这个镜像制作出来的镜像大小基本都在700M左右。所以,我们应该选择一个合适自己的镜像。(主要就是因为这些镜像中,提供了更多的功能所以导致该镜像大小很大,比如:crul这些命令和更多的附加功能)
具体的镜像仓库可以在 https://hub-stage.docker.com/ 上面进行查找。比如我选择的这个openjdk8的镜像只有40M,实际pull下来后有100M。
经过对比会发现他们的大小有明显的区别
直接启动该镜像可能会提示需要输入Command
针对第三点的问题,直接进行镜像制作就可以解决。下面提供一个脚本。
#!/bin/bash
#这是一个自定义的打包脚本
#镜像名称
image_name="test-alpine:v${1}"
#打包后的镜像名称
out_image_name="test-alpine.tar"
#打包后输出的路径
out_image_filepath="./out_images"
echo "执行build:$image_name"
docker build --platform linux/amd64 -f ./test_file/Dockerfile -t $image_name .
docker save -o $out_image_filepath/$out_image_name $image_name $image_name
# 这是一个Dockerfile
FROM java:openjdk-8u111-jre-alpine
WORKDIR /opt
ADD ./path/name.jar /opt/name.jar
EXPOSE 9011
ENTRYPOINT ["java","-jar","name.jar"]
可以看到制作好的镜像已经成功启动,并且该镜像大小只有193M。
Docker时区问题
在制作的Docker镜像中可能会遇到时区问题,这个需要在Dockerfile
中添加配置,保证制作的Docker时区正确。
# 这是一个Dockerfile
FROM java:openjdk-8u111-jre-alpine
WORKDIR /opt
ADD ./path/name.jar /opt/name.jar
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 9011
ENTRYPOINT ["java","-jar","name.jar"]
使用EasyExcel或者其他出现因为字体报错的情况
我在开发中遇到了,使用 openjdk 制作镜像后,使用EasyExcel到处报错,比如空指针倒是指向的是 sun.awt
这个包下的字体或者别的因为字体缺少导致的错误。我们可以重新制作一个 openjdk 镜像让 应用程序镜像依赖这个镜像进行构建。
# 一个Dockerfile 重新制作一个新的镜像
FROM java:openjdk-8u111-jre-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk update \
&& apk --no-cache add fontconfig ttf-dejavu \
&& rm -rf /var/cache/apk/*
用上面的 `Dockerfile` 制作一个新的镜像。