我们从镜像仓库下载的,都是别人事先做好的。如果我们需要一个定制的镜像,就必须得自己动手。自己创建一个镜像有2种方式:
a、基于一个现有的镜像来修改
b、基于Dockerfile来创建

 

1、基于一个现有的镜像进行修改
a.修改已有镜像
先使用docker pull training/sinatra下载镜像

b.启动镜像

[root@rocketmq-nameserver4 ~]# docker run -i -t training/sinatra /bin/bash

c. 在镜像中添加json和gem两个应用

root@7cbcbcc5e574:/# gem install json

Docker 创建镜像_centos

添加完成后,使用exit退出容器,我们在容器中添加了新的应用,容器被改变。

d、我们使用docker commit命令来提交更新后的副本

[root@rocketmq-nameserver4 ~]# docker commit -m 'add json gem' -a 'Docker Container' 7cbcbcc5e574 my/sinatra:v2
sha256:8ba1d6a3ce4e6bb17f32e6421b6ccc14c05640099a2c6f07014b88f7c7812178 -->运行命令,返回镜像ID
参数说明:
-m:提交的描述信息
-a:指定镜像作者
7cbcbcc5e574:容器ID,在容器执行时可以在命令行开头查看。比如:root@7cbcbcc5e574中@之后的内容。此外还可以通过docker images来查看
my/sinatra:v2:指定要创建的目标镜像名

 

e.使用我们自己创建的镜像my/sinatra:v2来启动容器
Docker 创建镜像_json_02
我们可以看到,一个容器就是一个微型的LINUX系统

2、本地文件系统创建镜像
使用Dockerfile来创建镜像,使用docker commit虽然很容易扩展镜像,但不便于团队分享,我们可以使用docker build来创建一个新的镜像,为此首先要创建一个Dockerfile文件,这个文件中包含如何创建镜像的指令。

a.首先新建一个目录和Dockerfile

[root@rocketmq-nameserver4 centos]# cd /home/xm6f/dev
[root@rocketmq-nameserver4 centos]# mkdir centos 
[root@rocketmq-nameserver4 centos]# cd centos/
[root@rocketmq-nameserver4 centos]# touch Dockerfile #注意Dockerfile首字母是大写

Docker 创建镜像_python_03

b.Dockerfile中输入指令,每条指令都创建镜像的一层。
Dockerfile中内容如下:

------------------------------------------------------
##注解
FROM centos
##FROM centos:6.7 
MAINTAINER ruthless 41125784@qq.com
RUN yum -qqy install python
------------------------------------------------------

它与shell脚本类似,是一个批处理的过程,但是它具有自己的命令和语法。Dockerfile的命令都是大写的,比如:FROM、RUN等。

FROM:告诉Docker使用哪个镜像作为基础
MAINTAINER:维护者的信息
RUN开头的指令会在创建中运行,例如安装一些软件包,这里使用yum 安装python;注意使用yum 需要制定参数 -qqy,不然呢可能会报错的。

Docker 创建镜像_5e_04

然后使用docker build构建镜像:

$ docker build -t='my/centos_width_python:v1.0.1' . ##注意此处有个".",表示从当前目录查找Dockerfile

Docker 创建镜像_5e_05
其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据
Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令
并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有
的中间步骤所产生的容器都被删除和清理了。

需要注意的是一个镜像是不能操作127层的,否则会报错!

c、查看刚创建的镜像
Docker 创建镜像_5e_06

当然Dockerfile中还可以输入其他的命令,例如可以使用ADD命令复制本地文件到镜像中;用EXPOSE命令对外开放端口;用CMD命令描述容器启动后运行的程序。

d.现在可以使用创建好的镜像来启动容器

[root@rocketmq-nameserver4 centos]# docker run -i -t my/centos_width_python:v1.0.1 /bin/bash

现在觉的镜像的标签不好,可以使用docker tag 命来来修改镜像的标签。
Docker 创建镜像_docker_07
通过docker images命令发现,my/python就是修改标签过后的镜像。