- 在制作镜像前,先熟悉下Dockerfile中的命令
- ADD 拷贝本地文件到容器内
- COPY 拷贝本地文件到容器内
- ENV 申明镜像内的环境变量
- EXPOSE 申明镜像启动后会暴露的端口
- FROM 申明镜像的基础镜像
- LABEL 打标签,一般用来做作者签名,描述信息等
- USER 设置运行镜像时的用户名,也用于设置USER后面申明执行RUN,CMD,ENTRYPOINT命令的用户名
- VOLUME 申明镜像内的磁盘挂载点
- WORKDIR 申明镜像的工作目录
- ENTRYPOINT 申明镜像启动的脚本
- CMD 申明镜像的启动命令
- RUN 镜像打包时执行的命令
- 举例 这边借用nginx的Dockerfile来具体说明:
FROM alpine:3.11 ##基础镜像
LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
ENV NGINX_VERSION 1.18.0 ## 申明一些环境变量
ENV NJS_VERSION 0.4.2
ENV PKG_RELEASE 1
## 申明镜像内执行的脚本或命令
RUN set -x \
... ##中间省略
&& mkdir /docker-entrypoint.d
## 拷贝当前文件夹下面的docker-entrypoint.sh至容器/目录下
COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
## 申明镜像启动脚本
ENTRYPOINT ["/docker-entrypoint.sh"]
## 申明镜像启动后暴露的端口
EXPOSE 80
STOPSIGNAL SIGTERM
## 申明镜像启动命令
CMD ["nginx", "-g", "daemon off;"]
- 说明: a、上面的内容保存为Dockerfile后,执行如下命令即可打包镜像:
docker built -t nginx:latest . ## 点表示默认读取当前目录下面的Dockerfile文件,-t 打包后的镜像名
b、当然,如果不保存为Dockerfile也可以,docker build时,用-f 指定具体的文件名即可 c、ENTRYPOINT和CMD同时申明时,CMD中的命令会被当成ENTRYPOINT的参数
- 制作镜像时,为了控制镜像的大小,尽量做到:
- 减少镜像层数;比如将多个命令组合放在一个RUN内执行完成,而不是RUN满天飞,一个RUN写一条命令
- 使用比较小的基础镜像;比如基础镜像alpine:latest才几兆的大小
- 无用文件及时清理;比如下载或者安装软件完成后及时删除压缩包和安装包缓存
- 使用官方的基础镜像,保持更新
- 小妙招:
- 为了便于更新镜像补丁,通常基础镜像用latest的tag标记,同时产生一个带版本号的镜像,这样每次拉取镜像时,基础镜像如果有更新,那么以该镜像为基础镜像创建的镜像都会更新。
- 刚开始制作镜像时,直接用Dockerfile的话时间成本比较高,我们可以在容器内进行一番试验操作后,记录下相应的命令和步骤,然后再用dockerfile创建镜像。
- 利用运行的容器制作镜像
#往现有运行的容器增加或者减少东西后制作镜像
docker ps | grep my-nginx ## 查看当前运行的容器
docker exec -it my-nginx /bin/bash ## 进入容器后修改文件
docker commit my-nginx nginx:new ## my-nginx 运行的容器名,nginx:new 新的镜像名
docker images |grep nginx ## 查看是否有新的镜像