创建你自己的镜像

whalesay镜像可以稍作改善。如果你不是必须要想一些说的就太棒了。你现在必须要输入一些话来让whalesay来说话。

docker run docker/whalesay cowsay boo-boo

在这一节中,你将通过构建一个能“自己说话”而只需要更少的命令就能运行的新版本来改善whalesay的镜像。

第一步:写一个Dockerfile

在这一步中,你可以使用你喜欢的文本编辑器来写一个简短的Dockerfile。Dockerfile描述了“烘培”到镜像中的软件。然而它又不只是成分表,它能告诉软件使用什么环境或运行什么命令。你的配方必须变得非常简短:

  1. 回到终端窗口。
  2. 通过输入 mkdir mydockerbuild 并按下回车新建一个文件夹
    $ mkdir mydockerbuild
    
    这个文件夹在你的构件中扮演着“上下文”的角色。上下文只是意味着它包含了所有你构建镜像需要的东西。
  3. 切换到你新文件夹。
    $ cd mydockerbuild
    
    现在这个文件夹是空的。
  4. 在你现在的文件夹中新建一个叫做Dockerfile的文件。
    你可以使用任何的文本编辑器比如vi或nano。
  5. 打开你的Dockerfile文件。
  6. 往文件中添加一个包含以下文本的新行:
    FROM docker/whalesay:latest
    
    FROM 关键词告Docker你的镜像是基于哪一个镜像构建的。Whalesay够有趣并且它已经包含cowsay程序,所以我们从那里开始。
  7. 现在往你的镜像中添加fortunes程序。
    RUN apt-get -y update && apt-get install -y fortunes
    
    fortunes程序有一个命令可以打印出有智慧的话让我们的鲸来讲。所以,第一步是先安装它。这一行把软件安装到了镜像中。
  8. 一旦镜像拥有了它需要的软件,你就可以指示软件在镜像载入的时候运行。
    CMD /usr/games/fortune -a | cowsay
    
    这一行告诉fortune程序传递一句俏皮的引述给cowsay程序。
  9. 检查你的工作,你的文件应该看起来像这样:
    FROM docker/whalesay:latest
    RUN apt-get -y update && apt-get install -y fortunes
    CMD /usr/games/fortune -a | cowsay
    
  10. 保存并关闭你的Dockerfile.
    这时,你在你的Dockerfile中写下了所有的软件成分和行为描述。你已经准备好构建一个新的镜像了。

第二步:用你的Dockerfile构建一个镜像

  1. 现在,在你的终端输入docker build -t docker-whale .(不要忽略了最后面有一个“.”)
    $ docker build -t docker-whale .
    Sending build context to Docker daemon 158.8 MB
    ...snip...
    Removing intermediate container a8e6faa88df3
    Successfully built 7d9495d03763
    
    这个命令用了几秒钟运行并输出它的结果。在你对新的镜像做任何操作之前,先花一点时间了解一下Dockerfile构建的流程。

第三步:了解构建的流程

docker build -t docker-whale .这条命令使用当前文件夹下的Dockerfile文件,并在本地构建了docker-whale镜像。这条命令花了大概一分钟并且它的输出看起来确实又长又复杂。在这一节,你会了解每一条消息意味着什么。

首先,Docker会检查以确认所有构建所需的东西都已经就绪。

Sending build context to Docker daemon 158.8 MB

然后,Docker载入whalesay镜像,如果你一直跟着教程做的话你的电脑本地应该已经有了这个镜像。所以,Docker不需要下载它。

Step 0 : FROM docker/whalesay:latest
 ---> fb434121fc77

Docker进入下一步也就是更新apt-get包管理器。这会输出很多行,没有必要把它们全都再次列出来。

Step 1 : RUN apt-get -y update && apt-get install -y fortunes
 ---> Running in 27d224dfa5b2
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Hit http://archive.ubuntu.com trusty Release.gpg
....snip...
Get:15 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [14.8 kB]
Get:16 http://archive.ubuntu.com trusty-security/universe amd64 Packages [134 kB]
Reading package lists...
---> eb06e47a01d2

然后,Docker安装新的fortunes软件。

Removing intermediate container e2a84b5f390f
Step 2 : RUN apt-get install -y fortunes
 ---> Running in 23aa52c1897c
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  fortune-mod fortunes-min librecode0
Suggested packages:
  x11-utils bsdmainutils
The following NEW packages will be installed:
  fortune-mod fortunes fortunes-min librecode0
0 upgraded, 4 newly installed, 0 to remove and 3 not upgraded.
Need to get 1961 kB of archives.
After this operation, 4817 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main librecode0 amd64 3.6-21 [771 kB]
...snip......
Setting up fortunes (1:1.99.1-7) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
 ---> c81071adeeb5
Removing intermediate container 23aa52c1897c

最后,Docker结束构建并输出结果。

Step 3 : CMD /usr/games/fortune -a | cowsay
 ---> Running in a8e6faa88df3
 ---> 7d9495d03763
Removing intermediate container a8e6faa88df3
Successfully built 7d9495d03763

第四步:运行你的新docker-whale

在这一步中,你会验证新的镜像已经在你的电脑上了,然后运行新的镜像。

  1. 如果你不在命令行窗口的话,把你的光标移动到命令行窗口上。
  2. 输入docker images并按下回车。
    你或许还记得,这个命令会列出你电脑上已经安装了的镜像。
    $ docker images
    REPOSITORY           TAG          IMAGE ID          CREATED             VIRTUAL SIZE
    docker-whale         latest       7d9495d03763      4 minutes ago       273.7 MB
    docker/whalesay      latest       fb434121fc77      4 hours ago         247 MB
    hello-world          latest       91c95931e552      5 weeks ago         910 B
    
  3. 输入docker run docker-whale并按下回车运行新的镜像。
    $ docker run docker-whale
    _________________________________________
    / "He was a modest, good-humored boy. It  \
    \ was Oxford that made him insufferable." /
    -----------------------------------------
           \
            \
             \     
                           ##        .            
                     ## ## ##       ==            
                  ## ## ## ##      ===            
              /""""""""""""""""___/ ===        
         ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
              \______ o          __/            
               \    \        __/             
                 \____\______/
    
    就像你看到的这样,你已经让鲸鱼更加聪明。它自己也会说话并且命令更短!你或许也注意到了Docker并不需要下载任何东西。那是因为镜像已经在本地构建了并可直接获取。

下一步是什么

在这一中,你学习了通过写你自己的Dockerfile构建一个新的镜像。你在容器中运行你的新镜像。在下一节中,你会开始分享你的镜像的第一步:创建一个Docker Hub账号。