使用

搜索可用docker镜像

使用docker最简单的方式莫过于从现有的容器镜像开始。Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io。你可以通过浏览这个网页来查找你想要使用的镜像,或者使用命令行的工具来检索。

命令行的格式为:docker search 镜像名字

$ docker search tutorial
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
georgeyord/reactjs-tutorial          This is the backend of the React comment b...   3                    [OK]
odk211/spree-tutorial                                                                1                    [OK]
mhausenblas/kairosdb-tutorial        GitHub fetcher for KairosDB tutorial            1                    [OK]
mjansche/tts-tutorial                Software for a Text-to-Speech tutorial          1                    [OK]
delta2323/jnns2015-tutorial                                                          0                    [OK]
cazcade/weave-multicast-tutorial                                                     0                    [OK]
yellottyellott/docker-tutorial       Doing the silly docker tutorial.                0                    [OK]
sfilipov/rails-tutorial                                                              0                    [OK]
davty/pluralsight-docker-tutorial    tutorial                                        0                    [OK]
jasminenoack/docker-tutorial         website                                         0                    [OK]
sonatar/rails-tutorial               Ruby On Rails Tutorial On Docker                0                    [OK]
fabioberger/dockerize-tutorial                                                       0                    [OK]
factoryteam/docker-nodejs-tutorial   Node.js Hello World                             0                    [OK]
tobegit3hub/tutorial-beego                                                           0                    [OK]
ohadgk/atwoz-tutorial                Autobuild                                       0                    [OK]
fabiosforza/docker-tutorial          First Docker uses                               0                    [OK]
msfuko/nodejs-tutorial                                                               0                    [OK]
fiware/tutorials.tourguide-app       FIWARE Tour Guide App sample application        0                    [OK]
delta2323/jnns2015-tutorial-gpu                                                      0                    [OK]
ianneub/rails-tutorial                                                               0                    [OK]
ebutech/jupyter-cpa-tutorial         Jupyter with Node.js kernel + docker-compo...   0                    [OK]
neilellis/weave-multicast-tutorial                                                   0                    [OK]
camphor/python-tutorial              camphor-/python-tutorial                        0                    [OK]
biopython/biopython-tutorial         Biopython with Tutorial running on top of ...   0                    [OK]
paulcos11/docker-tutorial            docker tutorial                                 0                    [OK]

下载容器镜像

下载镜像的命令非常简单,使用docker pull命令即可。在docker的镜像索引网站上面,镜像都是按照用户名/镜像名的方式来存储的。有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方的验证,值得信任,可以直接用镜像名来检索到。

执行pull命令的时候要写完整的名字,比如"learn/tutorial":

$ docker pull learn/tutorial
Using default tag: latest
latest: Pulling from learn/tutorial
271134aeb542: Pull complete 
Digest: sha256:2933b82e7c2a72ad8ea89d58af5d1472e35dacd5b7233577483f58ff8f9338bd
Status: Downloaded newer image for learn/tutorial:latest

在docker容器中运行hello world!

docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

docker run命令有两个参数,一个是镜像名,一个是要在镜像中运行的命令。

$ docker run learn/tutorial echo "hello word"
hello word

在容器中安装新的程序

下一步我们要做的事情是在容器里面安装一个简单的程序(ping)。我们之前下载的tutorial镜像是基于ubuntu的,所以你可以使用ubuntu的apt-get命令来安装ping程序:apt-get install -y ping

备注:apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。

在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。

$ docker run learn/tutorial apt-get install -y ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 1s (45.9 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...

保存对容器的修改

当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

首先获取容器的ID,可通过命令docker ps -l(列出最近创建的容器):

$ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
3fd4b9767461        learn/tutorial      "apt-get install -y p"   3 minutes ago       Exited (0) 3 minutes ago                       adoring_turing

通过docker commit命令,生成新的镜像:

docker commit 3fd4b9767461 learn/ping
sha256:c40a264eabf6c1aefabdbae13f9507877b71e34386e0f27b55e08d1ce790d447

运行新的镜像

ok,到现在为止,你已经建立了一个完整的、自成体系的docker环境,并且安装了ping命令在里面。它可以在任何支持docker环境的系统中运行啦!让我们来体验一下吧!

$ docker run learn/ping ping www.baidu.com
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_req=1 ttl=55 time=2.73 ms
64 bytes from 115.239.210.27: icmp_req=2 ttl=55 time=4.88 ms
64 bytes from 115.239.210.27: icmp_req=3 ttl=55 time=5.24 ms
64 bytes from 115.239.210.27: icmp_req=4 ttl=55 time=4.43 ms

检查运行中的镜像

现在你已经运行了一个docker容器,让我们来看下正在运行的容器。

使用docker ps命令可以查看所有正在运行中的容器列表,使用docker inspect命令我们可以查看更详细的关于某一个容器的信息。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
2826c7eea135        learn/ping          "ping www.baidu.com"   2 minutes ago       Up 2 minutes                            pensive_jepsen

$ docker inspect 2826c7eea135
[
    {
        "Id": "2826c7eea1356547e95052346df1f31217c06e0ea9a5e72fdc5935650f2d744f",
        "Created": "2016-05-06T01:35:25.744063944Z",
        "Path": "ping",
        "Args": [
            "www.baidu.com"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,