使用镜像
- 使用
查找仓库中的镜像
docker search [name]
查看仓库中的镜像详情:
hub.docker.com
获取镜像:
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
默认地址为:Docker Hub
列出镜像:
docker images
查看镜像信息:
docker inspect [name]
虚悬镜像:
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含义为选择一个基础镜像,如果不想选择一个镜像,可以用下面命令,表示以一个空镜像为基础镜像,接下来所写的指令作为镜像的第一层开始存在。
FROM scratch
RUN 执行命令
RUN 指令是用来执行命令行命令的。
RUN指令有两种格式:
shell 格式: RUN <命令>,
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式: RUN ["可执行文件", "参数1", "参数2"]
COPY 复制文件
两种格式:
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数组。
CMD echo $HOME
在实际执行中,会将其变更为:
CMD [ "sh", "-c", "echo $HOME" ]
docker里前后台执行问题:
docker不是虚拟机。容器中的应用都应该在前台运行。容器没有后台运行概念。
ENTRYPOINT 入口点
同cmd,但cmd后不能跟参数,entrypoint后能跟参数。 entrypoint能够执行脚本:ENTRYPOINT ["docker-entrypoint.sh"]
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 设置环境变量
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)
docker save & docker load
迁移镜像。
docker save [镜像name] | gzip > [文件name].tar.gz
docker load -i [文件name].tar.gz