本文将介绍Dockerd自定义镜像——Dockerfile的详细情况,特别是关于docker自定义镜像的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关
本文将介绍Dockerd自定义镜像——Dockerfile的详细情况,特别是关于docker 自定义镜像的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间、Docker 不构建镜像 Dockerfiledocker build 命令文件树备注问题、Docker 入门指南 ——Dockerfile 指令的知识。
本文目录一览:- Dockerd自定义镜像——Dockerfile(docker 自定义镜像)
- Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析
- Docker | 使用dockerfile生成镜像,清理docker空间
- Docker 不构建镜像 Dockerfiledocker build 命令文件树备注问题
- Docker 入门指南 ——Dockerfile 指令
Dockerd自定义镜像——Dockerfile(docker 自定义镜像)
一、Dockerfile自定义镜像:
Dockerfile 是一个文本文件,其内包含了一条条的**指令(Instruction);
二、Dockerfile创建:
1)在一个空白目录中,建立一个文本文件,并命名为 `Dockerfile`:
2)在Dockerfile文件内写指令;
三、构建镜像:
docker build [选项] <上下文路径/URL/->
1)Docker上下文构建:docker build -t MyImage .
//最后一个.点表示当前目录,用于指定上下文(Context);
上下文:该目录会打包发给docker服务器,docker文件内的操作只能是./当前文件形式,不能是../或者/等;
2)Git repo构建:docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.14
3)tar压缩包构建:docker build http://server/context.tar.gz
三、Dockerfile指令:
1)FROM:指定基础镜像;
//scratch:FROM scratch;表示一个空白镜像;
2)RUN:
1)shell格式:RUN <命令>;
2)exec格式:RUN ["可执行文件", "参数1", "参数2"];
//Dockerfile中每一个指令都会建立一层,则需要把多行合并:
每句语句用/反斜杠结尾,第二局开始用&&符号开头;
3)COPY:复制;
COPY 源路径 目标路径
<源路径>:可以是多个,甚至可以是通配符;//COPY home* /mydir/
<目标路径>:
(1)容器内的绝对路径;
(2)工作目录的相对路径;//用WORKDIR指令设置工作路径;
//copy指令会把各种源数据保留;
4)ADD:
ADD指令和`COPY`的格式和性质基本一致。
但是在 `COPY` 基础上增加自动解压tar压缩包的功能。
5)ENV:环境变量;
1)ENV <key> <value>;
2)ENV <key1>=<value1> <key2>=<value2>…
使用变量:$key
6)EXPOSE:声明端口;
EXPOSE <端口1> [<端口2>...]
docker run -P:会自动随机映射EXPOSE的端口;
-p <宿主端口>:<容器端口>和EXPOSE不同:
-p是暴露端口给外界访问;
EXPOSE仅仅是声明容器打算使用什么端口,并不会自动在宿主进行端口映射。
7)VOLUME:指定数据卷
//数据卷的作用就是将一些动态的数据和本地文件/文件夹进行绑定,在读写时使用的是本地的文件/文件夹。
docker run -p 80:8080 -d -v /home/ROOT:/usr/local/tomcat/webapps/ROOT/ tomcat
docker run -v 绝对路径的文件夹:要挂载到的容器内的文件夹/ 镜像名
8)WORKDIR:
WORKDIR <工作目录路径>
//dockerfile中cd无效,需要指定工作目录;
9)CMD:
运行一个文件,并传入参数;
CMD ["catalina.sh", "run"]:运行catalina.sh文件并传入参数run;
10)ENTRYPOINT:
同cmd类似,但是cmd只能执行一次,entrypoint可以执行多次;
Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析
什么是Dockerfile?
Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件,可以使用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像
如果你想要定制属于自己的镜像Dockerfile是你必不可少的工具。
docker build的使用
想要构建定制化的镜像,可以使用docker build运行Dockerfile构建镜像
命令格式: docker build [参数] PATH | URL
其中:
PATH 是Dockerfile所在路径
URL 是Dockerfile所在的URL
常用参数:
-t 为镜像设置名称和tag(不适用-t参数,创建出来的镜像名称以及版本为none)
-f 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)
关于Dockerfile构建过程的浅析
在之前关于Docker镜像与容器的文章中,咸鱼对镜像的文件系统做了一个简单的解释,不熟悉的朋友可以再温习一下。
Docker | Docker技术基础梳理(四) - 深入理解镜像与容器
我们先看下可以直接使用的Dockerfile结构是什么样的:
现在简单讲讲咸鱼对Dockerfile构建过程的理解:
Dockerfile的执行顺序是自上而下进行的,当第一次使用Dockerfile构建镜像时Dockerfile中的全部命令都会执行一遍最后构建为一个完整的镜像。
在构建的过程中,每执行一条命令Docker都会执行一次commit命令,接下来的每一条命令都是在前面所有命令集成的镜像基础上再次执行的。
这样的执行有什么好处呢,假设当你执行过一次的镜像构建后想要在Dockerfile中间部分添加一行Dockerfile的命令,那么在执行新的Dockerfile命令时,Docker只会执行新增命令(包括新增命令)之后的构建命令,大大减少了性能的损耗。
Dockerfile常用命令解析
接下来就是关于Dockerfile命令的介绍更多实例可以参考官方的Dockerfile实例:https://github.com/docker-library/docs
关于Dockerfile命令的介绍也可以参考:https://docs.docker.com/engine/reference/builder/#usage
RUN
构建镜像过程中需要执行的命令,可以执行多条
同时RUN命令后可以使用两种形式输入要执行的命令 exec与shell
当使用exec方式输入执行的命令时,命令格式是json格式的,命令在当前进程执行
当使用shell方式输入执行的命令时,命令在子进程中执行(推荐使用shell方式)
CMD与ENTRYPOINT
CMD是添加启动容器是需要执行的命令,多条命令只有最后一条生效,可以在启动容器事被覆盖和修改。
CMD命令格式有三种,exec、shell、默认提供给ENTRYPOINT的命令
命令格式为shell形式,命令是以子进程的形式执行
命令格式为json形式,命令在当前进程执行(推荐使用)
命令格式为json形式,且所有json内容为参数形式,则默认提供给ENTRYPOINT
ENTRYPOINT的使用CMD与相同,但这个一定会被执行,且不会被覆盖和修改
LABEL与MAINTAINER
LABEL用于为镜像添加对应的数据
添加的数据格式为:LABEL key=value …. Key=value
MAINTAINER:用于表示镜像的作者(即将被遗弃使用)
ENV与ARG
ENV用于设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG用于设置只在构建过程中使用的环境变量,构建完成后消失
ADD与copY
ADD用于将本地文件或目录拷贝到镜像的文件系统中,且能解压特定格式文件,且能将URL作为要拷贝的文件(会先将URL的文件先下载下来再拷贝)
copY将本地文件或目录拷贝到镜像的文件系统中(推荐使用copY+RUN),因为ADD命令对于需要解压的文件支持的不是非常智能
VOLUME
添加数据卷
命令格式可以为数组格式,也可以直接接上路径,路径为容器或镜像中的路径
常用命令行格式为:
VOLUME [“/XXX”]
VOLUME /XXX
USER与workdir
USER指定以哪个用户的名义执行RUN,CMD和ENTRPOINT等命令
workdir设置工作目录
简单实例构建Kafka工作环境
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 9092:9092
environment:
KAFKA_broKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_Security_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_broKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
这里咸鱼有一个建议,如果当你需要构建某一工作环境但毫无头绪时,在Github上以“xxxt docker”为关键字搜索,希望结果能让你满意。
咸鱼学Python
专注于Python商业化爬虫、Python数据科学的咸鱼
Docker | 使用dockerfile生成镜像,清理docker空间
用dockerfile
生成镜像并挂载数据卷
编写dockerfile
文件
- 创建
dockerfile01
文件
# 基础镜像
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "-----end----"
docker build
构建镜像
docker build -f ./dockerfile01 -t xiao-centos .
- 启动镜像
docker run -it 镜像ID /bin/bash
可以看到生成镜像时自动挂载的,数据卷目录
以上dockerfile
方式属于匿名挂载数据卷
清理docker使用空间
我个人使用的是单核2G的云服务器,用了快三年了,内存、cpu严重吃紧,所以就尝试了清理docker使用空间,主要是删除未使用过的镜像、容器、数据卷、网络命令,具体如下:
官方文档链接 https://docs.docker.com/config/pruning/
- 执行如下可以查看 Docker 的磁盘使用情况(类似于 Linux 上的 df 命令)
docker system df
- 删除所有未使用过的镜像
docker image prune -a
删除所有停止的容器
docker container prune docker rm -f $(docker ps -aq)
- 仅删除超过 24 小时的停止容器
docker container prune --filter "until=24h"
数据卷永远不会自动删除,因为这样做可能会破坏数据
- 删除未使用的数据卷
docker volume prune
- 删除没有使用过的网络
docker network prune
- 删除所有未使用过的资源
docker system prune
手动删除/var/lib/docker/volumes的问题解决
当时清理docker使用空间的时候,清过头了,一下子把挂载的数据卷也给顺手清理了,真是自己给自己找事做。
错误信息
手动删除了挂载到宿主机上的所有数据卷,在启动容器挂载数据卷的时候就会报错
如下,重新运行容器,原先具名挂载数据卷juming-nginx
,报错信息如下
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
docker: Error response from daemon: open /var/lib/docker/volumes/juming-nginx/_data: no such file or directory.
尝试方法一(不建议使用):
- 删除所有容器
- 删除所有镜像
重新运行一个新的容器并挂载数据卷
# 1 docker rm -f $(docker ps -aq) # 2 docker rmi -f $(docker images -aq) # 3. docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx # 还是报错
结论:
无法解决问题,且删除所有容器、镜像存在的风险较大,不建议使用!
尝试方法二(推荐使用):
- 停止docker服务
- 重新启动docker服务
- 再次运行容器
# 1
systemctl stop docker
# 2
systemctl restart docker
# 3
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
# 没有报错,docker ps查看 成功运行
结论
没有报错,docker ps
查看,成功运行
docker volume ls
查看镜像,可以看到具名数据卷juming-nginx
已显示出来了
docker volume ls
DRIVER VOLUME NAME
local a9b39215509378332ec9dfcdc3e10857b500694ea66efd9c2b7a6a9c55a2f10a
local juming-nginx
我是 甜点cc
热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。
Docker 不构建镜像 Dockerfiledocker build 命令文件树备注问题
如何解决Docker 不构建镜像 Dockerfiledocker build 命令文件树备注问题?
我刚开始使用 docker 并且正在学习 fireship''s 教程,但是在运行 docker build
命令时遇到了问题。我期待与视频 (timestamp) 类似的输出。相反,我得到了以下内容:
Dockerfile
FROM node:12
workdir /app #maybe its this? There is no /app directory
copY package*.json ./
RUN npm install
copY . .
ENV PORT=8080
EXPOSE 8080
CMD ["npm","start"]
docker build
命令
docker build -t <my docker id>/firstapp:1.1 .
文件树
D:/
Code/
testing/
Docker/
test1/
备注
-
是的,我有一个 docker ID。
-
docker build 命令在
copY . .
处停止,而不是在CMD ["npm","start"]
处结束 -
CWD (Windows):
D:\Code\testing\Docker\test1
-
我运行了两次
docker build
命令
问题
- 为什么会这样?
- 如何修复?
解决方法
发生这种情况的原因是 fireship 运行的是 Linux(就像 Hans Kilian 指出的那样)而我运行的是 Windows。要获取您的图像 ID,请运行 docker images
命令,该命令将列出您的图像及其图像 ID。
但是,我仍然不确定为什么它没有完成所有 8 个步骤。
Docker 入门指南 ——Dockerfile 指令
COPY 复制文件
格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
源路径可以是多个,甚至可以使通配符,规则满足 Go 的 filepath.Math
规则。
例如:
COPY hom* /mydir/
目标路径可以使容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以使用 WORKDIR
指令指定)。目标目录不存在会自动创建缺失目录。
可以理解为 COPY 源文件 目标文件
,这里的源文件
一开始容易出错,这个是你针对当前文件夹下路径来说的,即使你写的是 /root/.pip/pip.conf
,其实,它执行 build 时,会寻找的路径是 get-pip/root/.pip/pip.conf
,你理解了吗?
COPY . /app
COPY ./.pip/pip.conf ~/.pip/pip.conf
和 COPY 作用类似的有一个叫 ADD 的命令,他俩有什么区别呢?简单来讲, ADD 命令可以实现,当你源文件是压缩包时,它会自动解压并复制到你指定的目标文件,而且,ADD 命令的源文件还可以是一个 URL,但正是它功能的强大也给用户带来了不确定性,所以 Docker 官方并不太推荐使用 ADD 这个命令。
参考
- 掘金 - Dockerfile:ADD VS COPY
ADD 更高级的复制
ADD
指令和 COPY
指令相比,它的源路径可以是一个 URL
,这种情况,Docker 引擎会试图去下载这个链接的文件放到目标路径下。下载后的文件权限自动设置为 600
。如果需要修改,加一层 RUN
命令进行权限调整。
另外,如果下载的是压缩包,也需要使用 RUN
指令进行解压缩。所以,不弱直接使用 RUN
指令,然后使用 wget
或者 curl
工具下载进行操作。
如果源路径是一个 tar
压缩文件,压缩格式为 gzip
,bzip2
以及 xz
情况时, ADD
指令将自动解压缩这个文件放到目录路径下。
例如:
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
Dockerfile 最佳实践文档中要求,尽可能使用 COPY
指令,因为它的语义更明确。
ENTRYPOINT
当指定了 ENTRYPOINT
后,CMD
的含义就发生了改变,不再是直接的运行其命令,而是将 CMD
的内容作为参数传给 ENTRYPOINT
指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
CMD 命令会被 镜像名之后的命令重新替换掉
参考
- yeasy-Gitbook-ENTRYPOINT
WORKDIR
用来切换工作目录所用,如果目录没有,它还会自动给你创建这个目录。要避免如下的使用方法,你会发现 app
目录下根本就不会有 world.txt
内容:
RUN cd /app
RUN echo "hello" > world.txt
参考
- yeasy-Gitbook-WORKDIR
.dockerignore
构建镜像时,Docker 需要先准备 context ,将所有需要的文件收集到进程中。默认的 context 包含 Dockerfile 目录中的所有文件,但是实际上,我们并不需要.git 目录,node_modules 目录等内容。忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少 Docker 镜像的大小。
.git/
node_modules
Reference
- Gitbook-yeasy-Dockerfile 指令详解
- Github-python/3.7/stretch/Dockerfile
- seanlook-Dockerfile 指令详解
- 纯洁的微笑 - Docker (三):Dockerfile 命令详解
- DockerHub 查看学习 Dockerfile 的好地方
编写 Dockerfile 实践
- 官宣 - Best practices for writing Dockerfiles
- freax - 编写 Dockerfile 的最佳实践
- Cizixs - 编写 Dockerfile 的最佳实践 Go 开发者
- Deepzz - 如何写 Dockerfile,Dockerfile 参考文档 Go 开发者
- fundebug - 如何编写最佳的 Dockerfile
dockerignore
- 博客园 - 仓储大叔 - docker~ 为什么没人说说.dockerignore
- CSDN-.dockerignore 文件的作用 文章也提到了 build 命令后的。的理解
我们今天的关于Dockerd自定义镜像——Dockerfile和docker 自定义镜像的分享已经告一段落,感谢您的关注,如果您想了解更多关于Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间、Docker 不构建镜像 Dockerfiledocker build 命令文件树备注问题、Docker 入门指南 ——Dockerfile 指令的相关信息,请在本站查询。
本文标签: