docker指令学习记录

前言

本文为学习整理和参考文章,不具有教程的功能。其次,后面将会陆续更新各种应用的容器化部署的实践,如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来执行

FROM

指定基础镜像,Dockerfile的第一行必须制定基础镜像

RUN

执行命令。RUN指令会新建一层并在其上执行指令,指令完成之后再commit该镜像。所以RUN指令中的内容应当尽可能合并,并且记得清除冗余的内容如缓存等。

RUN <指令>
RUN ["可执行文件", "参数1", "参数2"]
RUN mkdir newDir \
   && touch newFile

COPY

将构建上下文中源路径中的内容复制到目标路径之下。可以使用通配符。如果目标目录不存在,容器会帮助创建。复制过程不改变文件属性。

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-release

ENTRYPOINT

指定容器启动程序及参数,当指定了ENTRYPOINT之后,CMD的含义就变成了ENTRYPOINT的参数。从而实现我们在build镜像时可以根据配置修改启动指令的参数。在docker run运行时可以用--entrypoint覆盖

ENTRYPOINT "CMD"
ENTRYPOINT ["可执行文件", "参数一", "参数二"...]

ENV

设置环境变量

ENV KEY VALUE
ENV KEY1=VALUE2 KEY2=VALUE2

ARG

同ENV,设置环境变量并为其提供默认值,不同的是在容器运行时,这些值将不存在。在运行时可以用--build-arg <参数名>:<值>覆盖

ARG <参数名>[=默认值]

VOLUMN

指定匿名卷,防止用户忘记挂载,运行时用-v HOST_DIR/CONTAINER_DIR进行覆盖

VOLUMN PATH

EXPOSE

声明运行时容器提供的服务端口,运行时应用并不会因为这个声明而打开这个端口。docker run -P时会对声明的端口随机映射

EXPOSE 端口一 端口二

WORKDIR

指定容器之后各层的工作目录。因为本层的cd并不会顺带到下一层。

WORKDIR PATH

USER

改变之后层执行RUN,ENTRYPOINT等指令的身份

RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN ["redis-server"]

ONBUILD

ONBUILD 其它指令

用于构建基础镜像,被引用是才会真正执行。可以提取出重复的部分,方便维护

删除

docker rmi [options] <image1> [<image2>....] #删除镜像
docker rm [options] <container1> [<container2>...] #删除容器

进入容器

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 集成spring boot + mysql + docker实战

    网上找过很多文章,关于通过docker构建mysql容器并将应用容器和docker容器关联起来的文章不多。本文将给出具体的范例。此处为项目的源码

    眯眯眼的猫头鹰
  • leetcode433. Minimum Genetic Mutation

    假设现在有两个基因序列,并且用一个字符串数组bank来表示一个基因序列银行。已知每一步可以将当前基因序列中的一位进行改变,变成另一个已知的基因序列。问最少需要多...

    眯眯眼的猫头鹰
  • leetcode 343. Integer Break

    这里应用了一个数学的思路。假设我们有一个数字n,该数组可以随机分解为t和n-t。当分解为n/2时可以获得最大的乘积。因此t取n/2时可以得到最好的结果。但是这里...

    眯眯眼的猫头鹰
  • docker基础知识整理

    列出UP的容器;docker ps -a列出所有容器。包括Exited等状态的容器;

    我的小碗汤
  • 面试官:你简历中写用过docker,能说说容器和镜像的区别吗?

    这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别。

    好好学java
  • 10张图带你深入理解Docker容器和镜像

    本文用图文并茂的方式介绍了容器、镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker。

    AI乔治
  • Docker 入门到实战教程(三)镜像和容器

    Docker完美融合Linux,所以Docker命令行的风格和Linux还是比较接近的,相对来说比较容易上手,首先,我们先说镜像相关的命令:

    小东啊
  • 面试官:你简历中写用过 Docker,能说说容器和镜像的区别吗?

    这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别。

    搜云库
  • Docker,一个傲娇的男人

    额,尴尬!好吧,容我默默开始介绍自己!我的名字叫Docker,我在2013年的时候,就来到了这个世上!然而那会并没有多少人知道我,对此我哭的很伤心。甚至无数...

    乔戈里
  • 容器化技术docker架构体系

    参考:https://www.runoob.com/docker/docker-architecture.html

    码农王同学

扫码关注云+社区

领取腾讯云代金券