了解镜像和容器
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镜像
- 打开浏览器并浏览Docker Hub
Docker Hub包含来自个人和或者是组织的镜像。 - 在搜索栏中输入
shalesay
- 点击结果中的
docker/whalesay
镜像。
浏览器展示了whalesay
镜像的仓库。每一个仓库包含了关于一个镜像的信息。他应该包含例如该镜像包含什么类别的软件并且如何使用他。你可能注意到了whalesay
镜像是基于Linux的发行版称为’Ubuntu’。在下一步中,你将会在你的计算机中运行whalesay
镜像。
步骤二:运行whalesay镜像
确定Docker正在运行:
- 打开命令行终端。
- 输入
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中去获取。
- 依然在命令行终端中,输入
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中镜像的源码修改了的镜像。当然,你也可以自己删除镜像。后面我们将会学习这些东西。我们先把镜像放在那因为后面我们将会使用他。
- 花一点时间来耍一下
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上运行的镜像。
- 创建一个新的目录。如果你正在使用windows,使用
md
而不是mkdir
。
mkdir mydockerbuild
这个目录将会包含一些构建镜像的所有事情。现在他是空的。
- 进入你的新目录。无论你是在Linux,macOS或者是Windows上,同样使用
cd
命令。
cd mydockerbuild
- 在当前目录中,编辑一个新的文本文件命名为
Dockerfile
,在Linux或Mac中使用nano
或vi
,在Windows中使用notepad
。
Linux或Mac:
nano Dockerfile
Windows:
C:\> notepad Dockerfile
- 将下面的命令复制到文件中添加一个
FROM
陈述。
FROM docker/whalesay:latest
FROM
关键词告诉Docker你的镜像是基于哪一个镜像的。Whalesay是非常聪明的,并且已经有cowsay
程序了。我们将会从这里开始.
- 添加
RUN
陈述,该命令将会安装fortunes
程序到镜像中。
RUN apt-get -y update && apt-get install -y fortunes
whalesay
镜像是基于Ubuntu的,他使用apt-get
来安装包。这两个命令会刷新可用的包列表,然后安装fortunes
程序到镜像中。fortunes
程序会输出箴言用于我们的whale去输出。
- 添加
CMD
陈述,他会告诉镜像在环境设置完成之后,要运行的最后的命令。该命令运行fortune -a
然后将他的输出发送到cowsay
命令中。
CMD /usr/games/fortune -a | cowsay
- 检查你的工作。你的文件看上去像是这样的:
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
- 保存文件然后关闭文本编辑器。这个时候,你的软件菜单就已经在
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
的镜像。该命令花费一些时间,并且他的输出看上去很长,很复杂。在这一小节中,我们将会学习每一个信息代表着什么。
- Docker会检查来确保他需要的任何任何东西都满足。这将会生成下面的信息。
Sending build context to Docker daemon 2.048 kB
- Docker会检查在本地是否存在
whalesay
镜像,是否需要从Docker hub中拉取下来。在这个示例中,因为在之前我们已经拉取下来了,所以这个镜像在本地已经存在了.这个对象在Dockerfile中的FROM
语句,并且生成下面的信息:
Step 1 : FROM docker/whalesay:latest
---> 6b362a9f73eb
在每一步最后,一个ID被输出了.这个是被这一步创建的这一层的ID.在Dockerfile中的每一行对应在镜像中的每一层.你的ID将会是不同的.
- 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
命令之后,一个新的层被创建了,然后中间的容器被移除了.
- 一个新的中间容器被创建了,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
- 在终端窗口或命令提示符中,输入
docker images
,列举出你本地的镜像.
Step 3 : CMD /usr/games/fortune -a | cowsay
---> Running in a8e6faa88df3
---> 7d9495d03763
Removing intermediate container a8e6faa88df3
Successfully built 7d9495d03763
- 通过输入
docker run docker-whale
来运行新镜像.
bobo@hongbo:~$ sudo docker run docker-whale
_______________________________
/ Delay is preferable to error. \
| |
\ -- Thomas Jefferson /
-------------------------------
\
\
\
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
whale现在有些机智了.他输出了自己的想法,并且少输入命令便可运行.同时,你也注意到了Docker并没有下载任何东西,因为他是在本地构建的镜像.
- 为了娱乐,在运行他一次.
下载你的whale已经有了他自己的想法,但是如果你不喜欢他说的话,重新运行它一次就行了.
记后
后面我们将会创建我们自己的Docker hub账号,并将我们构建的whale上传到hub中.