您的位置:首页 > 运维架构 > Docker

docker学习(2) - 使用镜像

2019-08-12 21:56 204 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/POORPIG186/article/details/99344537

使用镜像

  • 使用
[code]获取镜像:
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
默认地址为:Docker Hub

列出镜像:
docker images

虚悬镜像:
docker images -f dangling=true

删除虚悬镜像:
docker rmi $(docker images -q -f dangling=true)

镜像过滤:
docker images -f|--filter since|before=mongo:3.2
docker images --format "{{.ID}}: {{.Repository}}"
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
  • 定制镜像:Dockerfile

Dockerfile是一个文本文件,里面为一条条指令,每一条指令建立一层,描述镜像如何构建。所以为了镜像的不臃肿,体积更小,把多个脚本写为一个脚本。

 

FROM指令:

一个Dockerfile中FROM是必备指令,并且必须是第一个。FROM含义为选择一个基础镜像,如果不想选择一个镜像,可以用下面命令,表示以一个空镜像为基础镜像,接下来所写的指令作为镜像的第一层开始存在。

[code]FROM scratch

 

RUN 执行命令

RUN 指令是用来执行命令行命令的。

RUN指令有两种格式:

[code]shell 格式: RUN <命令>,
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exec 格式: RUN ["可执行文件", "参数1", "参数2"]

 

COPY 复制文件

[code]两种格式:
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]

<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工 作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存 在会在复制文件前先行创建缺失目录。

使用 COPY 指令,源文件的各种元数据都会保留。比如 读、写、执行权限、文件变更时间等。

 

ADD 更高级的复制文件

add的源路径可以是url,可以是压缩文件。如果是url会自动下载文件,并设置权限为600。如果是压缩文件,会自动解压到目标路径。这个命令完全可以使用run命令替代。意义不大。

在 Docker 官方的最佳实践文档中要求,尽可能的使用COPY ,因为 COPY 的语 义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。

 

CMD 容器启动命令

依然有shell格式和exec格式,一般用exec格式。shell格式会自动转化为sh -c格式执行,exec格式会解析成json数组。

[code]CMD echo $HOME
在实际执行中,会将其变更为:
CMD [ "sh", "-c", "echo $HOME" ]

docker里前后台执行问题:

docker不是虚拟机。容器中的应用都应该在前台运行。容器没有后台运行概念。

ENTRYPOINT 入口点

同cmd,但cmd后不能跟参数,entrypoint后能跟参数。 entrypoint能够执行脚本:ENTRYPOINT ["docker-entrypoint.sh"]

[code]Dockerfile里命令一如下:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "https://ip.cn" ]

接着执行命令二:
docker build -t myip . (注意逗号)

再执行命令三:
docker run myip

最后一行命令不能给curl命令传参数,但如果命令一中cmd换成ENTRYPOINT,然后在命令三后添加参数可以执行了就

 

ENV 设置环境变量

[code]env param 1000
run echo $param

 

ARG 构建参数

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是, ARG 所设置的 构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。

 

VOLUME 定义匿名卷

docker运行时不要往容器存储层写数据。需要写数据的可以定义一个匿名卷,如:volume /data,在运行时不指定挂载,容器也可以正常运行,不会向容器存储层写入大量数据。运行时可覆盖:-v mydata:/data。

 

EXPOSE 声明端口

EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> : -p ,是 映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访 问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行 端口映射。

 

WORKDIR 指定工作目录

WORKDIR 指定工作目录,格式为 WORKDIR <工作目录路径> 。

 

USER 指定当前用户

格式: USER <用户名>

USER 指令和 相似,都是改变环境状态并影响以后的层。 WORKDIR是改变工作目录,USER 则是改变之后层的执行 RUN , CMD 以及ENTRYPOINT 这类命令的身份。当然,和 WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。

 

HEALTHCHECK 健康检查

和 CMD , ENTRYPOINT 一样, HEALTHCHECK 只可以出现一次,如果写了多个, 只有最后一个生效。

 

ONBUILD 为他人做嫁衣裳

格式: ONBUILD <其它指令> 。

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等, 而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去 构建下一级镜像的时候才会被执行。

 

定制完成后,可在Dockerfile所在的文件夹执行:docker build -t [name] .命令生成镜像(注意命令最后的点)

  • 删除镜像
  • docker rmi [选项] <镜像1> [<镜像2> ...]

  • 删除虚悬镜像:docker rmi $(docker images -q -f dangling=true)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: