有两种方法可以创建我们自己的image
(1)、我们可以利用已有的image运行一个容器,进行update操作;然后通过docker commit操作生成一个新的image。
(2)、自己创建一个dockerfile文件,在dockerfile中定义instructions(指令)来创建image
1、基于已有的image创建自己需要的iamge
例如,从已有的training/sinatra创建一个安装了json的image
(1)从training/sinatra这个image运行一个容器
sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
(2)在运行中的容器安装json
root@0b2616b0e5a8:/# gem install json
(3)使用docker commit命令copy这个容器到一个新的image
在第二步中,安装完json后,使用exit退出容器的运行,
$ sudo docker commit -m "Added json gem" -a "Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m表示一个commit message,-a 表示author的信息,指定创建的new iamge来自于container id 0b2616b0e5a8,此外还为新建的image定义一个组合名称ouruser/sinatra:v2。
使用docker images可以看到新建的images
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
2、使用dockerfile创建自定义image
一些建议:(1)你有自定义的image创建的container应尽量是短暂的,所谓的短暂是指,你在运行容器时能实现自己目的的步骤应尽可能的少;
(2)使用.dockerignore文件
(3)避免安装不必要的packages,比如在数据库image中安装文本编辑器
(4)一个容器运行一个进程,如果该容器运行的程序依赖其他服务,使用容器link系统来连接两个容器
(5)在dockerfile的可读性和最少的layers之间保持平衡
(6)使用cache构建
在docker build命令中使用--no-cache=true参数可以禁用cache,docker使用cache遵循以下的规则:
(1)、首先以一个cache中存在的base image作为基准,下一个步骤就是比较instruction与所有的来自base image的child image,查看是否匹配,如果没有匹配的,则缓存是无效的。
(2)、对于RUN apt-get命令,最好以下面形式:RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0*
(1)、我们可以利用已有的image运行一个容器,进行update操作;然后通过docker commit操作生成一个新的image。
(2)、自己创建一个dockerfile文件,在dockerfile中定义instructions(指令)来创建image
1、基于已有的image创建自己需要的iamge
例如,从已有的training/sinatra创建一个安装了json的image
(1)从training/sinatra这个image运行一个容器
sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
(2)在运行中的容器安装json
root@0b2616b0e5a8:/# gem install json
(3)使用docker commit命令copy这个容器到一个新的image
在第二步中,安装完json后,使用exit退出容器的运行,
$ sudo docker commit -m "Added json gem" -a "Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m表示一个commit message,-a 表示author的信息,指定创建的new iamge来自于container id 0b2616b0e5a8,此外还为新建的image定义一个组合名称ouruser/sinatra:v2。
使用docker images可以看到新建的images
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
2、使用dockerfile创建自定义image
一些建议:(1)你有自定义的image创建的container应尽量是短暂的,所谓的短暂是指,你在运行容器时能实现自己目的的步骤应尽可能的少;
(2)使用.dockerignore文件
(3)避免安装不必要的packages,比如在数据库image中安装文本编辑器
(4)一个容器运行一个进程,如果该容器运行的程序依赖其他服务,使用容器link系统来连接两个容器
(5)在dockerfile的可读性和最少的layers之间保持平衡
(6)使用cache构建
在docker build命令中使用--no-cache=true参数可以禁用cache,docker使用cache遵循以下的规则:
(1)、首先以一个cache中存在的base image作为基准,下一个步骤就是比较instruction与所有的来自base image的child image,查看是否匹配,如果没有匹配的,则缓存是无效的。
(2)、对于RUN apt-get命令,最好以下面形式:RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0*