理解镜像和容器,并运行whalesay镜像

了解镜像和容器


Docker引擎提供了使能镜像和容器的核心Docker技术。在安装过程的最后一步,你运行了docker run hello-world命令。你运行的命令包含三个部分.


docker run hello-world
  • docker:告诉的操作系统你正在运行docker程序
  • run:创建并运行一个Docker容器的子命令
  • hello-world:告诉Docker将哪一个镜像加载到容器中

镜像是在运行时使用的一个文件系统和相关参数。她并没有状态并且永不改变。一个容器是一个镜像正在运行的实例。当你运行命令的时候,Docker引擎:

  • 检查你是否有hello-world软件镜像
  • 从Docker Hub中下载镜像
  • 将镜像加载到容器中运行

基于他的构建方式,一个镜像可能运行一个简单的,单一的命令然后退出,hello-world就是这样的。

然而一个Docker镜像可以做的更多。一个镜像可以运行像数据库一样复杂的软件程序,等待你添加数据,存储数据便于后续使用,然后等待下一个用户。

但是谁构建的hello-world软件镜像呢?Docker构建的,但是任何人都可以。Docker引擎运行我们创建并且通过Docker镜像分享软件。使用Docker引擎,你不用担心在一个Docker镜像中你的计算机能否运行这款软件-Docker容器肯定能够运行这个软件。

寻找并运行whalesay镜像


世界各地的人都可以创建Docker镜像。你可以通过浏览Docker Hub来找到这些镜像。在下面一节中,你将会搜索并且找到这些镜像。

步骤一:定位whalesay镜像

  1. 打开浏览器并浏览Docker Hub
    Docker Hub包含来自个人和或者是组织的镜像。
  2. 在搜索栏中输入shalesay
  3. 点击结果中的docker/whalesay镜像。
    浏览器展示了whalesay镜像的仓库。每一个仓库包含了关于一个镜像的信息。他应该包含例如该镜像包含什么类别的软件并且如何使用他。你可能注意到了whalesay镜像是基于Linux的发行版称为’Ubuntu’。在下一步中,你将会在你的计算机中运行whalesay镜像。

步骤二:运行whalesay镜像

确定Docker正在运行:

  1. 打开命令行终端。
  2. 输入docker run docker/whalesay cowsay boo命令然后按下回车按钮。
    这个命令将会在一个容器中运行whalesay镜像,你的终端看上去应该是这个样的:

     $ docker run docker/whalesay cowsay boo
     Unable to find image 'docker/whalesay:latest' locally
     latest: Pulling from docker/whalesay
     e9e06b06e14c: Pull complete
     a82efea989f9: Pull complete
     37bea4ee0c81: Pull complete
     07f8e8c5e660: Pull complete
     676c4a1897e6: Pull complete
     5b74edbcaa5b: Pull complete
     1722f41ddcb5: Pull complete
     99da72cfe067: Pull complete
     5d5bd9951e26: Pull complete
     fb434121fc77: Already exists
     Digest: sha256:d6ee73f978a366cf97974115abe9c4099ed59c6f75c23d03c64446bb9cd49163
     Status: Downloaded newer image for docker/whalesay:latest
     _____
     < boo >
     -----
         \
          \
           \
                         ##        .
                   ## ## ##       ==
                ## ## ## ##      ===
            /""""""""""""""""___/ ===
       ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
            \______ o          __/
             \    \        __/
               \____\______/

在你第一次运行一个软件镜像的时候,docker命令会在你的本地系统中去寻找。如果镜像不在本地,docker会从hub中去获取。

  1. 依然在命令行终端中,输入docker images命令然后按下回车。
    这个命令会列举出你本地系统中的所有的镜像。你在列表中应该会看到docker/whalesay镜像。

    bobo@hongbo:~$ sudo docker images
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    bobo1223/docker-whale   latest              7911602d9f62        2 days ago          252.8 MB
    docker-whale            latest              7911602d9f62        2 days ago          252.8 MB
    hello-world             latest              c54a2cc56cbb        6 months ago        1.848 kB
    docker/whalesay         latest              6b362a9f73eb        19 months ago       247 MB
    bobo@hongbo:~$ 

当你在一个容器中运行镜像的时候,Docker会将镜像下载到你的计算机中。这种镜像的本地复制会节约你的时间。Docker仅仅会重新下载那些在hub中镜像的源码修改了的镜像。当然,你也可以自己删除镜像。后面我们将会学习这些东西。我们先把镜像放在那因为后面我们将会使用他。

  1. 花一点时间来耍一下whalesay镜像。
    尝试使用一个单词或一句话来运行whalesay镜像。尝试一个长的或短的句子。

    bobo@hongbo:~$ sudo docker run docker/whalesay cowsay bobo
     ______ 
    < bobo >
     ------ 
        \
         \
          \     
                        ##        .            
                  ## ## ##       ==            
               ## ## ## ##      ===            
           /""""""""""""""""___/ ===        
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
           \______ o          __/            
            \    \        __/             
              \____\______/   

构建你自己的镜像


whalesay镜像可以被提升。如果你不用考虑说什么并且你不需要输入让whalesay去输出,那是最好的。


docker run docker/whalesay cowsay boo-boo

在这一小节中,我们会通过构建一个新的版本“说出他自己的话”来提升whalesay,这样在运行的时候就可以少输入一些单词了。

步骤一:编写一个Dockerfile

在这一步中,你需要使用一个文本编辑器来编写一个简单的Dockerfile。Dockerfile是一个描述构建一个镜像需要的文件,环境和命令的菜单。你的菜单将会是非常简短的。

在Linux或macOS的一个终端窗口或者是Windows的命令提示符中运行这些命令。一定要记住,即使你在使用macOS或者是Windows,你依然需要创建一个在Linux上运行的镜像。

  1. 创建一个新的目录。如果你正在使用windows,使用md而不是mkdir

mkdir mydockerbuild

这个目录将会包含一些构建镜像的所有事情。现在他是空的。

  1. 进入你的新目录。无论你是在Linux,macOS或者是Windows上,同样使用cd命令。

cd mydockerbuild
  1. 在当前目录中,编辑一个新的文本文件命名为Dockerfile,在Linux或Mac中使用nanovi,在Windows中使用notepad

Linux或Mac:


nano Dockerfile

Windows:

C:\> notepad Dockerfile
  1. 将下面的命令复制到文件中添加一个FROM陈述。

FROM docker/whalesay:latest

FROM关键词告诉Docker你的镜像是基于哪一个镜像的。Whalesay是非常聪明的,并且已经有cowsay程序了。我们将会从这里开始.

  1. 添加RUN陈述,该命令将会安装fortunes程序到镜像中。

RUN apt-get -y update && apt-get install -y fortunes

whalesay镜像是基于Ubuntu的,他使用apt-get来安装包。这两个命令会刷新可用的包列表,然后安装fortunes程序到镜像中。fortunes程序会输出箴言用于我们的whale去输出。

  1. 添加CMD陈述,他会告诉镜像在环境设置完成之后,要运行的最后的命令。该命令运行fortune -a然后将他的输出发送到cowsay命令中。

CMD /usr/games/fortune -a | cowsay
  1. 检查你的工作。你的文件看上去像是这样的:

    FROM docker/whalesay:latest
    RUN apt-get -y update && apt-get install -y fortunes
    CMD /usr/games/fortune -a | cowsay
  1. 保存文件然后关闭文本编辑器。这个时候,你的软件菜单就已经在Dockerfile文件中描述好了。我们已经准备好去构建一个新的镜像。

步骤二:从你的Dockerfile中构建一个镜像

当你位于mydockerfile目录中的时候,使用docker build命令构建镜像。-t参数会给你的镜像一个标签,所以后面你将会更加简单的运行他。不要忘记.命令,这会告诉docker build命令在当前目录中搜索名为Dockerfile的文件。该命令在Linux,macOS和Windows中运行时一样的。


    $ docker build -t docker-whale .

    Sending build context to Docker daemon 2.048 kB
    ...snip...
    Removing intermediate container cb53c9d09f3b
    Successfully built c2c3152907b5

这个命令将会使用一些时间去运行然后报告出他的结果。

步骤三: 了解构建过程

docker build -t docker-whale .在当前目录中读取Dockerfile文件,然后一条一条的运行他的指令去构建一个称为docker-whale的镜像。该命令花费一些时间,并且他的输出看上去很长,很复杂。在这一小节中,我们将会学习每一个信息代表着什么。

  1. Docker会检查来确保他需要的任何任何东西都满足。这将会生成下面的信息。

Sending build context to Docker daemon 2.048 kB
  1. Docker会检查在本地是否存在whalesay镜像,是否需要从Docker hub中拉取下来。在这个示例中,因为在之前我们已经拉取下来了,所以这个镜像在本地已经存在了.这个对象在Dockerfile中的FROM语句,并且生成下面的信息:

Step 1 : FROM docker/whalesay:latest
 ---> 6b362a9f73eb

在每一步最后,一个ID被输出了.这个是被这一步创建的这一层的ID.在Dockerfile中的每一行对应在镜像中的每一层.你的ID将会是不同的.

  1. Docker开启一个临时的容器来运行shalesay镜像.在临时容器中,Docker运行位于Dockerfile中的下一个命令,也就是RUN命令,他会安装fortune命令.这会生成很多行输出,就像你在Ubuntu中人工运行apt-get命令一样.

    Step 2 : RUN apt-get -y update && apt-get install -y fortunes
     ---> Running in 05d4eda04526
    Ign http://archive.ubuntu.com trusty InRelease
    Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
    Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]
    Hit http://archive.ubuntu.com trusty Release.gpg
    Hit http://archive.ubuntu.com trusty Release
    Get:3 http://archive.ubuntu.com trusty-updates/main Sources [480 kB]
    Get:4 http://archive.ubuntu.com trusty-updates/restricted Sources [5921 B]
    Get:5 http://archive.ubuntu.com trusty-updates/universe Sources [214 kB]
    Get:6 http://archive.ubuntu.com trusty-updates/main amd64 Packages [1160 kB]
    Get:7 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [20.4 kB]
    Get:8 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [505 kB]
    Get:9 http://archive.ubuntu.com trusty-security/main Sources [157 kB]
    Get:10 http://archive.ubuntu.com trusty-security/restricted Sources [4621 B]
    Get:11 http://archive.ubuntu.com trusty-security/universe Sources [54.5 kB]
    Get:12 http://archive.ubuntu.com trusty-security/main amd64 Packages [700 kB]
    Get:13 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [17.0 kB]
    Get:14 http://archive.ubuntu.com trusty-security/universe amd64 Packages [191 kB]
    Hit http://archive.ubuntu.com trusty/main Sources
    Hit http://archive.ubuntu.com trusty/restricted Sources
    Hit http://archive.ubuntu.com trusty/universe Sources
    Hit http://archive.ubuntu.com trusty/main amd64 Packages
    Hit http://archive.ubuntu.com trusty/restricted amd64 Packages
    Hit http://archive.ubuntu.com trusty/universe amd64 Packages
    Fetched 3640 kB in 11s (329 kB/s)
    Reading package lists...
    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 92 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]
    Get:2 http://archive.ubuntu.com/ubuntu/ trusty/universe fortune-mod amd64 1:1.99.1-7 [39.5 kB]
    Get:3 http://archive.ubuntu.com/ubuntu/ trusty/universe fortunes-min all 1:1.99.1-7 [61.8 kB]
    Get:4 http://archive.ubuntu.com/ubuntu/ trusty/universe fortunes all 1:1.99.1-7 [1089 kB]
    debconf: unable to initialize frontend: Dialog
    debconf: (TERM is not set, so the dialog frontend is not usable.)
    debconf: falling back to frontend: Readline
    debconf: unable to initialize frontend: Readline
    debconf: (This frontend requires a controlling tty.)
    debconf: falling back to frontend: Teletype
    dpkg-preconfigure: unable to re-open stdin:
    Fetched 1961 kB in 19s (101 kB/s)
    Selecting previously unselected package librecode0:amd64.
    (Reading database ... 13116 files and directories currently installed.)
    Preparing to unpack .../librecode0_3.6-21_amd64.deb ...
    Unpacking librecode0:amd64 (3.6-21) ...
    Selecting previously unselected package fortune-mod.
    Preparing to unpack .../fortune-mod_1%3a1.99.1-7_amd64.deb ...
    Unpacking fortune-mod (1:1.99.1-7) ...
    Selecting previously unselected package fortunes-min.
    Preparing to unpack .../fortunes-min_1%3a1.99.1-7_all.deb ...
    Unpacking fortunes-min (1:1.99.1-7) ...
    Selecting previously unselected package fortunes.
    Preparing to unpack .../fortunes_1%3a1.99.1-7_all.deb ...
    Unpacking fortunes (1:1.99.1-7) ...
    Setting up librecode0:amd64 (3.6-21) ...
    Setting up fortune-mod (1:1.99.1-7) ...
    Setting up fortunes-min (1:1.99.1-7) ...
    Setting up fortunes (1:1.99.1-7) ...
    Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
     ---> dfaf993d4a2e
    Removing intermediate container 05d4eda04526

当运行完RUN命令之后,一个新的层被创建了,然后中间的容器被移除了.

  1. 一个新的中间容器被创建了,Docker在Dockerfile中为CMD添加了一层,然后移除中间层.

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

现在你已经构建好了一个称为docker-whale的镜像.

步骤四: 运行你的docker-whale

  1. 在终端窗口或命令提示符中,输入docker images,列举出你本地的镜像.

    Step 3 : CMD /usr/games/fortune -a | cowsay
     ---> Running in a8e6faa88df3
     ---> 7d9495d03763
    Removing intermediate container a8e6faa88df3
    Successfully built 7d9495d03763
  1. 通过输入docker run docker-whale来运行新镜像.

    bobo@hongbo:~$ sudo docker run docker-whale
     _______________________________ 
    / Delay is preferable to error. \
    |                               |
    \ -- Thomas Jefferson           /
     ------------------------------- 
        \
         \
          \     
                        ##        .            
                  ## ## ##       ==            
               ## ## ## ##      ===            
           /""""""""""""""""___/ ===        
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
           \______ o          __/            
            \    \        __/             
              \____\______/ 

whale现在有些机智了.他输出了自己的想法,并且少输入命令便可运行.同时,你也注意到了Docker并没有下载任何东西,因为他是在本地构建的镜像.

  1. 为了娱乐,在运行他一次.

下载你的whale已经有了他自己的想法,但是如果你不喜欢他说的话,重新运行它一次就行了.

记后


后面我们将会创建我们自己的Docker hub账号,并将我们构建的whale上传到hub中.

posted @ 2017-01-10 23:04  陈洪波  阅读(245)  评论(0编辑  收藏  举报