博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解镜像和容器,并运行whalesay镜像
阅读量:6158 次
发布时间:2019-06-21

本文共 11094 字,大约阅读时间需要 36 分钟。

了解镜像和容器


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中.

转载于:https://www.cnblogs.com/bobo1223/p/7287458.html

你可能感兴趣的文章
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>
Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
查看>>
Olap学习笔记
查看>>
Codeforces Round #431 (Div. 1)
查看>>
如何进行数组去重
查看>>
将标题空格替换为 '_' , 并自动复制到剪切板上
查看>>
List Collections sort
查看>>
Mysql -- You can't specify target table 'address' for update in FROM clause
查看>>
使用局部标准差实现图像的局部对比度增强算法。
查看>>
2017-2018-1 20165313 《信息安全系统设计基础》第八周学习总结
查看>>
《代码敲不队》第四次作业:项目需求调研与分析
查看>>
菜鸡互啄队—— 团队合作
查看>>
HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法...
查看>>
SparseArray
查看>>
第二章
查看>>
android背景选择器selector用法汇总
查看>>
[转]Paul Adams:为社交设计
查看>>
showdialog弹出窗口刷新问题
查看>>
java
查看>>