docker commit
- docker commit命令是创建新镜像最直观的方法,其中包含三个步骤:
- 运行容器
- 修改容器
- 将容器保存为新的镜像
实验举例
- 在ubuntubase镜像中安装vim程序
- 运行容器:
docker run -it ubuntu
#-it:以交互模式进入容器
- 安装vim
#设置阿里云镜像:
mv /etc/apt/sources.list /etc/apt/sources.list.bak
cat >> /etc/apt/sources.list <<- EOF
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
EOF
#安装vim:
apt-get update
apt-get install vim
- 保存为新镜像
查看运行容器 docker ps
- tender_murdock是docker为容器随机分配的名字
- 创建新镜像:
docker commit tender_murdock ubuntu-aliyun-vim
- 总结:并不建议用户通过这种方式来构件镜像
- 这是一种手工创建镜像的方式,容易出错,效率低可重复性弱
- 使用者并不知道镜像是如何创建出来的,无法对镜像进行审计,存在安全隐患
docker commit是能够帮助我们更深入的理解镜像构建过程和镜像的分层结构。
Dockerfile
- 创建镜像的过程:
- 从base镜像中运行一个容器。
- 执行一条指令,对容器做修改。
- 执行类似docker commit的操作,生成一个新的镜像层。
- Docker在基于刚刚提交的镜像运行一个新的容器。
- 重复2-4步骤,直到Dockerfile中所有的指令执行完毕。
实验举例
- 创建Dockerfile:
touch Dockerfile
vim Dockerfile
FROM ubuntu
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-security main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install vim -y
- 创建镜像
docker build -t ubuntu-aliyun-vim-dockerfile .
- 创建成功查看镜像:
- 查看镜像构建历史:
镜像的缓存特性
- Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像已经存在,就直接使用无需重新创建。
- 在原有的Dockerfile里面添加COPY testfile /(testfile自行创建)
docker build -t ubuntu-aliyun-vim-dockerfile-2 .
- ubuntu-aliyun-vim-dockerfile-2的创建就是直接在ubuntu-aliyun-vim-dockerfile上添加新的一层镜像层(COPY testfile /)
- 如果在构建景象中不使用缓存,则可以在后面加上–no-cache的参数。
- 如果调换COPY testfile / 的顺序,缓存就会失效。创建镜像的时间就会增长。因为镜像分层的结构特性。
Dockerfile基本指令
-
FROM → 指定base镜像
-
MAINTAINER → 设置镜像作者,可以是任意字符串
-
COPY → 将文件从build context复制文件到镜像
两种形式:1 COPY src dest 2 COPY[“src”,”dest”] -
ADD → 与COPY基本相同(不同的是如果src为归档文件,文件则会被自动解压到dest)
-
ENV → 设置环境变量,环境变量可以被后面的指令使用
-
EXPOSE → 指定容器中的进程会监听某个端口,Docker可以将端口暴露出来
-
VOLUME → 将文件或目录声明为volume
-
WORKDIR → 为后面的RUN,CMD,ENTRYPOINT,ADD或COPY指令设置镜像中的当前工作目录
-
RUN → 在容器中运行指定的命令
-
CMD → 容器启动时运行指定的命令
-
ENTRYPOINT → 设置容器启动时运行命令
一个简单的Dockerfile综合例子
#Description:My Dockerfile
FROM busybox
MAINTAINER 1072112053@qq.com
WORKDIR /testdir
RUN touch tmpfile1
COPY ["tmpfile2","."]
ADD ["nginx-1.12.2.tar.gz","."]
ENV WELCOME "You are in my container,welcome!"