在Docker中,创建镜像有4中标准方法
- docker的手工命令,
docker commit
一个容易创建 - Dockerfile,这次的主题
- Dockerfile及配置管理工具,与Dockerfile相同,但是将构建的控制权交给配置管理工具
- 在空白的镜像导入tar文件
Dockerfile常用命令
FROM
- 定义基础镜像
MAINTAINER
- 声明维护人员(可以偷懒不写)
RUN
- 跑CMD命令
WORKDIR
- 定义下面命令的工作目录
EXPOSE
- 声明暴露端口,
CMD
- 启动镜像时运行的命令
ENTRYPOINT
- 入口点,和CMD
很像,具体见下面解析
COPY
- 将本地文件复制到镜像中
ADD
- 类似COPY
,但是会自动将tar
文件解压,也可以跟url
,会下载url
的内容,但如果url
的内容是压缩文件它是不会自动解压的
VOLUME
- 声明卷
ENV
- 设置环境变量
简单实例 - todo APP
FROM node # 定义基础镜像
MAINTAINER yourselfmain@mail.com # 声明维护人员(可以偷懒不写)
RUN git clone -q https://github.com/docker-in-practice/todo.git # 相当于在命令行跑命令,没啥区别
WORKDIR todo # 定义命令的工作目录
RUN npm install > /dev/null
EXPOSE 8000 # 暴露8000端口,用来给使用者做提示的,运行该镜像是要暴露8000端口,映射到宿主机上
CMD ["npm", "start"] # 启动镜像的命令
构建todo镜像并使用
docker build -t todo .
docker run -p 8000:8000 todo
在浏览器上访问localhost:8000
ENTRYPOINT
实例 - 清理log的工具
FROM ubuntu:14.04
ADD clean_log /usr/bin/clean_log # 将clean_log脚本拷贝到镜像中
RUN chmod +x /usr/bin/clean_log
ENTRYPOINT ["/usr/bin/clean_log"] # 相当于在shell运行clean_log脚本
CMD ["7"] # 默认传参数“7” 给clean_log,可以在启动镜像的时候将其替换
其中clean_log
脚本如下
#!/bin/bash
echo "Cleaning logs over $1 days old"
find /log_dir -ctime "$1" -name '*log' -exec rm {} \;
构建镜像并使用
docker build -t clean_log .
docker run --rm -v /tmp/log_dir:/log_dir clean_log 365
命令解析:
--rm
会在容器停止后删除
-v /tmp/log_dir:/log_dir
将宿主机的tmp/log_dir
映射到容器里的/log_dir
中,这样清理日志容器来删除容器里的/log_dir
下的目录时相当于清理宿主机的/tmp/log_dir
365
指删除一年的日志,即替换里默认的7天
官方资料
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/