获取镜像
|
|
docker run
: 就是运行容器的命令
-it
:这是两个参数, -i
交互式操作, -t
终端
—rm
:这个参数是说容器退出后随之将其删除
ubuntu:14.04
:这是指用 ubuntu:14.04 镜像为基础来启动容器
bash
:放在镜像名后的是命令
cat /etc/os-release
:这是 Linux 常用的查看当前系统版本的命令
exit
:退出了这个容器
列出镜像
|
|
commit
|
|
慎用 docker commit
- 若清理不当会导致镜像臃肿
- 操作为黑箱操作,生成的是黑箱镜像
- 每次commit都在当前层操作,可能导致镜像臃肿
- 一般在学习和被入侵后保存现场时用
- 定制镜像用Dockerfile
Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
基本指令
|
|
构建镜像
|
|
Dockerfile指令
COPY 复制文件
COPY package.json /usr/src/app/
- 从上下文目录中复制,可以是通配符
目标路径
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,不存在会自动生成- 源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
ADD 更高级的复制文件
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
- 若源文件为压缩文件,将会自动解压缩这个压缩文件到
目标路径
去 - 所有的文件复制均使用
COPY
指令,仅在需要自动解压缩的场合使用ADD
CMD 容器启动命令
CMD echo $HOME
相当于CMD [ "sh", "-c", "echo $HOME" ]
- 容器中的应用都应该以前台执行,容器内没有后台服务的概念
CMD ["nginx", "-g", "daemon off;"]
以前台形式运行nginx
ENTRYPOINT 入口点
ENTRYPOINT
的目的和CMD
一样,都是在指定容器启动程序及参数- 当指定了
ENTRYPOINT
后,CMD
不再是直接的运行其命令,而是将CMD
的内容作为参数传给ENTRYPOINT
指令,实际执行时<ENTRYPOINT> "<CMD>"
- 通过
docker run
的参数—entrypoint
可以指定别的入口点 - 可以让镜像变成像命令一样使用,
docker run
可以直接加上参数运行 - 应用运行前的准备工作,启动容器就是启动主进程,但有些时候,启动主进程前,需要一些准备工作
ENV 设置环境变量
通过环境变量,我们可以让一份 Dockerfile 制作更多的镜像,只需使用不同的环境变量即可。
|
|
可以使用$VERSION
这种形式来获取环境变量值
ARG 构建参数
|
|
- 效果同
ENV
但是只在构建时有效 docker history
可以看到所有值docker build
中可以用--build-arg <参数名>=<值>
来覆盖
VOLUME 定义匿名卷
VOLUME /data
或者VOLUME ["/data","/test"]
- 挂在卷用以保存动态数据
- 运行时可以覆盖这个挂载设置
docker run -d -v mydata:/data xxxx
EXPOSE 声明端口
EXPOSE 8080
或者EXPOSE ["80","8080"]
- 仅仅是声明运行时容器提供服务端口,并不会自动在宿主进行端口映射
docker run -P
时,会自动随机映射EXPOSE
的端口
WORKDIR 指定工作目录
WORKDIR /app
- 指定工作目录(或者称为当前目录),改变环境状态并影响以后的层
- 该目录需要已经存在,
WORKDIR
并不会建立目录 - 如果需要改变以后各层的工作目录的位置,那么应该使用
WORKDIR
指令
USER 指定当前用户
USER redis
- 指定当前用户,改变环境状态并影响以后的层
- 用户必须是事先建立好的,否则无法切换
HEALTHCHECK 健康检查
Docker 1.12 后引入
HEALTHCHECK 支持下列选项:
--interval=<间隔>
:两次健康检查的间隔,默认为 30 秒;--timeout=<时长>
:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;--retries=<次数>
:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;
|
|
ONBUILD 为他人做嫁衣裳
ONBUILD <其它指令>
- 只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
其他方式
从rootfs压缩包导入
格式:docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]
|
|
docker save
和docker load
|
|
删除本地镜像
格式:docker rmi [选项] <镜像1> [<镜像2> ...]