我們從鏡像倉庫下載的,都是別人事先做好的。如果我們需要一個定制的鏡像,就必須得自己動手。自己創建一個鏡像有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

添加完成后,使用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來啟動容器
我們可以看到,一個容器就是一個微型的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首字母是大寫

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 build構建鏡像:
$ docker build -t='my/centos_width_python:v1.0.1' . ##注意此處有個".",表示從當前目錄查找Dockerfile

其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。 “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。
可以看到 build 進程在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據
Dockerfile 來進行。 然后,Dockfile 中的指令被一條一條的執行。每一步都創建了一個新的容器,在容器中執行指令
並提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執行完畢之后,返回了最終的鏡像 id。所有
的中間步驟所產生的容器都被刪除和清理了。
需要注意的是一個鏡像是不能操作127層的,否則會報錯!
c、查看剛創建的鏡像
當然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 images命令發現,my/python就是修改標簽過后的鏡像。
