摘要:当在中需要引用相对路径时,就是以该上下文作为当前指令执行的目录。指令会新建一层并在其上执行指令,指令完成之后再该镜像。所以指令中的内容应当尽可能合并,并且记得清除冗余的内容如缓存等。从而实现我们在镜像时可以根据配置修改启动指令的参数。
前言
本文为学习整理和参考文章,不具有教程的功能。其次,后面将会陆续更新各种应用的容器化部署的实践,如MySQL容器化,Jenkins容器化,以供读者参考。
镜像获取docker pull [options] [Docker Registry地址]<仓库名>:<标签> -a, --all-tags: 下载该镜像的所有版本
Docker Registry地址默认为Docker Hub,一般格式为IP:端口号
仓库名为两段式 <用户名>:<软件名> 默认用户名为library
标签不填则默认为latest
docker images [options] [Repository[:tag]] 默认情况会展示所有最终镜像,如果加上了镜像名,则会展示该镜像的所有信息 -a, --all: 展示所有镜像,包括中间层 -f, --filter filter: 根据某种条件对镜像进行筛选 --format string: 使用go的模板语法 -q, --quiet: 只返回镜像的ID docker images -f since=mongo:3.2 #查看mongo3.2版本之后建立的镜像,如果是要在之前,则使用before docker images --format "{{.ID}}:{{.Repository}}" #输出结构为ID:Repository虚悬镜像
虚悬镜像是指既没有仓库名,也没有标签的镜像。这种镜像的产生常常由于当前的仓库名和标签被更新版本占用,导致当前境像失效。
docker images -f danling=true #列出所有虚悬镜像 docker rmi $(docker images -q -f dangling=true) #利用复合指令删除虚悬镜像commit镜像
commit会将容器的存储层保存下来成为新的镜像
docker commit [options] <容器ID或容器名> [<仓库名>[:<标签>]] -a, --author string: 容器所有者 -c, --change list: 在容器上执行Dockerfile指令 -m, --message string: 提交信息 -p, --pause: 提交过程中停止容器的运行,默认为true docker history IMAGE #显示镜像的历史记录 docker diff CONTAINER #查看容器的改动
尽量不要使用commit指令构建镜像
Dockerfile 构建镜像利用Dockerfile构建镜像。
docker build [options] PATH | URL | - -f, --file string: Dockerfile的路径 --rm: 成功构建后删除中间镜像 -t, --tag: 以name:tag的形式为镜像命名 docker build -t nginx:v3 . #执行当前目录下的Dockerfile并构建镜像,新的镜像名为nginx:v3 docker build https://...... #直接从github构建,会自动clone这个项目,切换到指定分支(默认为master),并进入指定目录进行构建
最后的路径是指镜像构建的上下文,docker在build的时候会把该上下文中的而所有内容全部打包上传给docker引擎。当在Dockerfile中需要引用相对路径时,就是以该上下文作为当前指令执行的目录。可以编写.dockerignore文件来剔除无需打包的文件。
在默认情况下,如果不指定Dockerfile的位置,就会从构建的上下文寻找Dockerfile来执行
指定基础镜像,Dockerfile的第一行必须制定基础镜像
RUN执行命令。RUN指令会新建一层并在其上执行指令,指令完成之后再commit该镜像。所以RUN指令中的内容应当尽可能合并,并且记得清除冗余的内容如缓存等。
RUN <指令> RUN ["可执行文件", "参数1", "参数2"] RUN mkdir newDir && touch newFileCOPY
将构建上下文中源路径中的内容复制到目标路径之下。可以使用通配符。如果目标目录不存在,容器会帮助创建。复制过程不改变文件属性。
COPY 源路径 目标路径 COPY ["源路径",...,"目标路径"] COPY hom* /mydir/CMD
默认的容器的主进程的启动命令,在运行时可以指定新的命令来替代镜像设置中的默认命令。比如ubuntu的默认指令是/bin/bash。如果使用第一种形式,则会以sh -c的形式执行,这样就能够得到环境变量。容器中的应用都应该前台执行。
CMD <命令> CMD ["可执行文件", "参数一", "参数二", ...] CMD ["参数一", "参数二"...] CMD ["nginx", "-g", "daemon off;"] docker run -it ubuntu #直接进入bash,因为默认指令为/bin/bash docker run -it ubuntu /etc/os-release #默认指令变成/etc/os-releaseENTRYPOINT
指定容器启动程序及参数,当指定了ENTRYPOINT之后,CMD的含义就变成了ENTRYPOINT的参数。从而实现我们在build镜像时可以根据配置修改启动指令的参数。在docker run运行时可以用--entrypoint覆盖
ENTRYPOINT "CMD" ENTRYPOINT ["可执行文件", "参数一", "参数二"...]ENV
设置环境变量
ENV KEY VALUE ENV KEY1=VALUE2 KEY2=VALUE2ARG
同ENV,设置环境变量并为其提供默认值,不同的是在容器运行时,这些值将不存在。在运行时可以用--build-arg <参数名>:<值>覆盖
ARG <参数名>[=默认值]VOLUMN
指定匿名卷,防止用户忘记挂载,运行时用-v HOST_DIR/CONTAINER_DIR进行覆盖
VOLUMN PATHEXPOSE
声明运行时容器提供的服务端口,运行时应用并不会因为这个声明而打开这个端口。docker run -P时会对声明的端口随机映射
EXPOSE 端口一 端口二WORKDIR
指定容器之后各层的工作目录。因为本层的cd并不会顺带到下一层。
WORKDIR PATHUSER
改变之后层执行RUN,ENTRYPOINT等指令的身份
RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN ["redis-server"]ONBUILD
ONBUILD 其它指令
用于构建基础镜像,被引用是才会真正执行。可以提取出重复的部分,方便维护
删除docker rmi [options]进入容器[ ....] #删除镜像 docker rm [options] [ ...] #删除容器
docker attach CONTAINER_NAME查看数据卷信息
docker inspect CONTAINER_NAME
匿名的数据卷默认位于/var/lib/docker/volumes之下
查看容器docker logs [-f] container查看端口映射配置
docker port container container_port容器链接
--link container_name:alias
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27489.html
摘要:此命令下载测试镜像并在容器中运行它。国内很多云服务商都提供了加速器服务,例如阿里云加速器注册用户并且申请加速器,会获得如这样的地址。获取镜像阿里云镜像库上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像并运行。 showImg(https://segmentfault.com/img/remote/1460000012924583); 这篇文章是我学习 Docker 的记录...
摘要:实际上,认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域段,域和域之间使用分割符分割。 看到一篇Docker 技巧:删除 Docker 容器和镜像其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明: docker rmi $(docker images | awk $1 == && $2 == {print $3...
摘要:用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。运行构建命令构建命令用于使用创建镜像。 本文旨在用通俗的语言讲述枯燥的知识 前面讲到镜像的构建时,讲述的是用commit的方式构建镜像,而Dockerfile是另一种构建镜像的方式。 Dockerfile构建镜像是以基础镜像为基础的,Dockerfile是一个文本文件,内容是用户编写的一些docker指令,每一条...
摘要:型网络这是容器的默认网络类型,网桥模式意味着容器间可以互相通信,而对外的通信需要借助宿主机,这一形式通常表现为端口号的映射。 以下记录 Docker 中的常用操作、指令,使得大家能够快速地使用 Docker。 为什使用 Docker? 为什么要使用 Docker?就个人而言,Docker 能提供的最大便利在于这种技术面对程序环境迁移时所表现的卓越性。 这种性能使得我们不必在分享代码或项...
摘要:最后,我们用和适当的独特后缀来标注数据流。将数据流分离到两个不同的目的地在这里,我们解析自动定量日志,管理我们的缓冲区,查询和区块大小。 也许你对Fluentd的统一日志记录层已经有所耳闻。可能你对日志是流不是文件这个概念也已经很熟悉,所以现在就让我们用这个方法来思考日志层。事实上,最后导致决定性的一点就是fluentd是如何被配置的。全部都是关于我们如何处理stream的不同元素的:...
阅读 2878·2019-08-30 15:55
阅读 1948·2019-08-30 14:02
阅读 1184·2019-08-29 15:23
阅读 978·2019-08-29 11:27
阅读 427·2019-08-26 11:43
阅读 3160·2019-08-26 10:32
阅读 1211·2019-08-23 14:41
阅读 3275·2019-08-23 14:41