docker使用注意点汇总 持续更新
创建镜像
docker 的cmd entrypoint run的区别
- 在 shell 格式的命令中,命令会被交给 shell 解释器执行,因此环境变量会被解析和展开。
- 而在 exec 格式的命令中,命令会直接由 Docker 执行,不经过 shell 解释器,因此环境变量不会被自动解析和展开。
- 在 Dockerfile 中,无论是 shell 格式还是 exec 格式的命令,都是由 /bin/sh -c 命令来执行的,这个命令会启动一个 shell 解释器,并将命令作为字符串传递给它进行解释和执行。
因此,无论使用哪种格式的命令,都会经过 shell 解释器的处理,环境变量也会被相应地解析和展开.
打包镜像过程
新建一个目录,放上Dockerfile文件,然后执行如下命令
docker build -t 120.79.35.122:8089/xxl-job-admin:1.0 .
docker build -f Dockerfile_BE -t harbor.ctyuncdn.cn/bigdata/doris-fe:2.0.2 .
注意最后面的 点. 默认执行此文件夹下的Dockerfile文件
注意上面的命令, Dockerfile文件用-f指定 上下文在最后指定
docker build 构建上下文
必须理解这个概念,否则会出现很多问题
发现COPY 宿主机的目录 怎么都找不到文件,才明白守护进程上下文的问题,守护进程可以是本机也可以是远程
Docker 的构建上下文定义了构建过程中可用的文件和目录。如果你需要从宿主机的 /data 目录中复制文件,确保这个目录在构建上下文中是可见的。
构建上下文是递归处理的 PATH 包含任何子目录
docker build .
因此本地目录中的所有文件都会被发送到 Docker 守护程序
PATH 指定在哪里可以找到 Docker 守护程序上构建的“上下文”的文件
请记住,守护进程可以在远程机器上运行,并且不会在客户端(运行 docker build 的地方)解析 Dockerfile
这意味着 PATH 中的所有文件都会被发送,而不仅仅是 Dockerfile 中列出的 ADD 文件
当看到 Sending build context 消息时,docker 客户端的意思是将上下文从本地机器传输到 Docker 守护进程。
打包镜像举例
新建一个Dockerfile文件 注意文件名不要写错,没有扩展名
如下是xxl-job的打镜像文件
FROM java:8u111-alpine
MAINTAINER meng.liu
VOLUME /var
ADD xxl-job-admin-2.4.0-SNAPSHOT.jar /var/app/xxl-job-admin-2.4.0-SNAPSHOT.jar
ENV TZ="Asia/Shanghai" HOME="/var/app/"
WORKDIR ${HOME}
EXPOSE 8090
java ${JAVA_OPTS} -server \
-Djava.security.egd=file:/dev/./urandom \
-jar xxl-job-admin-2.4.0-SNAPSHOT.jar
注意 ** ENV TZ=“Asia/Shanghai” 一定要加上** 可以避免很多问题 比如在flink-cdc中 可以避免出现找不到timezone的情况
如果容器已经启动 用echo “Asia/Shanghai” > /etc/timezone 来
镜像的导出与导入
导出
镜像导出
docker save -o nginx-save.tar ae513a47849c
docker save -o nginx.tar nginx:latest
docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag.
容器导出
docker export -o nginx-test.tar nginx-test
其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
镜像导出包含了完整的文件系统、配置和元数据,可以准确地恢复镜像。
容器导出只包含文件系统的快照,不包含容器的元数据和配置信息,因此不能完整地恢复容器。
(使用 docker save 命令将镜像导出为文件时,该命令会将镜像的所有层和元数据保存到一个文件中。但是,CMD 和 ENTRYPOINT 等信息是作为镜像的元数据的一部分保存的,而不是作为镜像层的一部分。因此,在导出镜像时,这些信息可能不会被保存到导出的文件中)
docker commit方式导出镜像 不推荐
当你使用 docker commit 命令将一个运行中的容器 commit 成镜像时,该命令会将容器的当前状态(包括其文件系统、环境变量、端口映射等)保存为一个新的镜像。在这个过程中,容器的 CMD 和 ENTRYPOINT 等信息也会被保存到新的镜像中。
docker commit 命令会将容器的整个状态保存为镜像,包括容器的运行历史、缓存数据等。因此,建议只在必要时使用 docker commit 命令,而在大多数情况下,使用 docker build 命令来构建镜像。
导入
镜像
docker load -i nginx.tar
或
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
容器
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
常用批处理命令
删除所有停止的容器:
docker system prune -f
删除所有容器 (没有f参数运行中的不会删除)
docker rm $(docker ps -a -q)
删除所有镜像
docker rmi -f $(docker images -q)
按条件删除镜像
没有打标签
docker rmi docker images -q | awk '/^<none>/ { print $3 }'
镜像名包含关键字
docker rmi --force docker images | grep doss-api | awk '{print $3}' //其中doss-api为关键字
docker volume
一般都是使用-v方式使用,不会显示使用volume,使用volume主要是在清除容器信息时,哪怕新容器也会出问题,一般是volume没有清除
使用 docker volume prune 清除没有使用的volume
使用 docker volume ls 查看已存在的volume 不过信息都是不太可读.
本文概述了Docker的镜像创建、命令格式区别、构建上下文理解、环境变量处理、镜像导出导入方法,以及dockerprune和volume的使用注意事项。

被折叠的 条评论
为什么被折叠?



