Docker整理之Docker运行容器相关(二)

来源:互联网 发布:三体 知乎 编辑:程序博客网 时间:2024/05/18 00:23
Docker 安装

docker 的相关安装方法这里不作介绍,具体安装参考官档

Docker 基础用法

在一个容器内运行一个应用程序需要一个命令:docker run。

    $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
    Hello world

1.run一个镜像:ubuntu 14.04

当你指定一个镜像,docker会查看这个镜像是否有一次加载到你的docker主机上,如果没有发现,docker就会在镜像仓库Docker Hub下载公共镜像。

2.docker新容器内运行命令:

    /bin/echo 'Hello world'

docker创建一个新的Ubuntu 14.04环境,然后执行/bin/echo命令。我们会在命令行看到结果:hello world

那么,我们创建容器之后会发生什么呢?这里Docker容器当你输入指令时被激活运行。这里只要"hello word"被输出,容器就会停止。

一个交互式的容器

让我们尝试再次运行docker run,这次我们指定一个新的命令来运行我们的容器。

    $ sudo docker run -t -i ubuntu:14.04 /bin/bash
    root@af8bae53bdd3:/#

在这里我们继续指定docker run命令,并运行一个新的ubuntu:14.04的镜像。但是我们也加了两个新的标示:-t和-i。-t表示在新容器内指定一个伪终端或终端,-i表示允许我们对容器内的STDIN进行交互。

在我们的容器内还指定了一个新的命令:/bin/bash。这将在容器内启动bash shell

所以现在当我们的容器启动时我们会看到,我们有一个命令提示符(进入了容器内):

    root@af8bae53bdd3:/#

让我们尝试在容器内运行一些命令:

    root@af8bae53bdd3:/# pwd
    /
    root@af8bae53bdd3:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

你可以看到我们运行pwd来显示当前目录,这时候显示的是我们的根目录。我们还列出了跟目录的列表显示了目录列表,通过目录列表我们看出来想一个典型的Linux文件系统。

当你完成你的命令的时候,你退出这个容器,你可以输入exit。

    root@af8bae53bdd3:/# exit

与我们之前的容器一样,一旦你的Bash shell退出之后,你的容器就停止了。

守护进程Hello world

现在一个容器运行一个命令当使用完退出,但是这并不是有帮助的。让我们创建一个容器,让它以守护进程的模式运行,就像docker运行应用程序那样。

我们可以这样运行docker run命令:

    $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

我们的hello word去哪了。我们运行docker但是我们指定了一个-d标识。-d标识告诉docker运行容器在后台模式运行。

我们也指定了一个相同的镜像:ubuntu:14.04

最终,我们指定命令行运行:

    /bin/sh -c "while true; do echo hello world; sleep 1; done"

这是一个荒谬的hello word进程:一个脚本会一直输出"hello word"

为什么不是我们看到的一大堆的"hello word"?而是docker返回的一个很长的字符串:

    1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

这个长的字符串叫做容器ID。它是容器的唯一标识,所以我们可以使用它。

    注意:容器ID是有点长并且非常的笨拙,稍后我们会看到一个断点的ID,某些方面来说它是容器ID的简化版。

我们可以根据容器ID查看"hello word"进程发生了什么、

我们可以使用docker ps命令来查看。docker ps命令可以查询docker运行中的容器。如果你还想看已经停止的容器,请加上-a标示。

    $ sudo docker ps
    CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
    1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

这里我们看到了后台进程容器。docker ps命令会返回一些有用的信息,这里包括一个短的容器ID:1e5535038e28。

我们还可以看到我们使用的ubuntu:14.04来构建它,这个命令已经运行,它被系统自动分配了名称insane_babbage。

    注意:docker会在容器启动的时候自动给容器命名,稍后我们可以看到我们如何给容器指定名称。

好了,现在我们知道它运行。但是我们能要求它做什么呢?做到这,我们需要在我们容器内使用docker logs命令。让我们给系统自动分配名称的容器使用这个命令。

    $ sudo docker logs insane_babbage
    hello world
    hello world
    hello world
    . . .

docker logs命令看起来想运行在容器内并且返回标准输出:这种情况下我们的命令输出hello word

让我们停止这个后台进程容器。为此让我们使用docker stop命令停止。

    $ sudo docker stop insane_babbage
    insane_babbage

docker stop命令会通知docker停止正在运行的容器。如果它成功了,它将返回刚刚停止的容器名称。

让我们通过docker ps命令来检查它是否还工作。

    $ sudo docker ps
    CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES

在我们的web应用中,我们将运行一个python应用。让我们先从docker run命令开始。

    $ sudo docker run -d -P training/webapp python app.py

新的-P标示通知Docker所需的网络端口映射从主机映射到我们的容器内(更为详细请看 网络端口映射)。
现在使用docker -s查看会看到
   PORTS
   0.0.0.0:49155->5000/tcp
docker开放了5000端口(默认Python端口)映射到主机端口49155上。

也可以指定-p标示来指定端口。举例:

    $ sudo docker run -d -p 5000:5000 training/webapp python app.py

使用docker ps命令会返回映射端口,就是有点笨手笨脚的。对此,docker提供了一种快捷方式:docker port。使用docker port可以查看指定(ID或者名字的)容器的某个确定端口映射到宿主机的端口号。

    $ sudo docker port nostalgic_morse 5000
    0.0.0.0:49155

在这种情况下,我们看到容器的5000端口映射到了宿主机的的49155端口。

网络端口映射

在使用docker部分,我们创建了一个python应用的容器。

    $ sudo docker run -d -P training/webapp python app.py

    注:容器有一个内部网络和IP地址(在使用Docker部分我们使用docker inspect命令显示容器的IP地址)。Docker可以有各种网络配置方式。你可以再这里学到更多docker网络信息。

我们使用-P标记创建一个容器,将容器的内部端口随机映射到主机的高端口49000到49900。这时我们可以使用docker ps来看到端口5000绑定主机端口49155。

    $ sudo docker ps nostalgic_morse
    CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
    bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

我们也可以使用-p标识来指定容器端口绑定到主机端口

    $ sudo docker run -d -p 5000:5000 training/webapp python app.py

我们看这为什么不是一个好的主意呢?因为它限制了我们容器的一个端口。

我们还有很多设置-p标识的方法。默认-p标识会绑定本地主机上的指定端口。并且我们可以指定绑定的网络地址。举例设置localhost

    $ sudo docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py

这将绑定容器内部5002端口到主机的localhost或者127.0.0.1的5001端口。

如果要绑定容器端口5002到宿主机动态端口,并且让localhost访问,我们可以这样做:

    $ sudo docker run -d -p 127.0.0.1::5002 training/webapp python app.py

我们也可以绑定UDP端口,我们可以在后面添加/udp,举例:

    $ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

我们可以使用docker port快捷方式来绑定我们的端口,这有助于向我们展示特定的端口。例如我们绑定localhost,如下是docker port输出:

    $ docker port nostalgic_morse 5000
    127.0.0.1:49155

    注:-p可以使用多次配置多个端口。


查看WEB应用程序日志

让我们看看我们的容器中的应用程序都发生了什么,使用我们学习到的另一个命令docker logs来查看。

    $ sudo docker logs -f nostalgic_morse
    * Running on http://0.0.0.0:5000/
    10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
    10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

这次我们添加了一个标示-f。这将使docker log命令中使用tail -f来查看容器标准输出。这里我们从应用程序日志的5000端口的访问日志条目。
查看我们WEB应用程序容器的过程

我们除了可以查看容器日志,我们还可以使用docker top来查看容器进程:

    $ sudo docker top nostalgic_morse
    PID                 USER                COMMAND
    854                 root                python app.py

这里我们可以看到python app.py在容器里唯一进程。
检查我们的WEB应用程序

最后,我们可以使用docker inspect来查看Docker的底层信息。它会返回一个JSON文件记录docker容器的配置和状态信息。

    $ sudo docker inspect nostalgic_morse

来让我们看下JSON的输出。

    [{
        "ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
        "Created": "2014-05-26T05:52:40.808952951Z",
        "Path": "python",
        "Args": [
           "app.py"
        ],
        "Config": {
           "Hostname": "bc533791f3f5",
           "Domainname": "",
           "User": "",
    . . .

我们也可以针对我们想要的信息进行过滤,例如,返回容器的IP地址,如下:

    $ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
    172.17.0.5

停止我们的容器

好吧,我们看到WEB应用程序工作。现在我们通过使用docker stop命令来停止名为 nostalgic_morse 的容器:

    $ sudo docker stop nostalgic_morse
    nostalgic_morse

现在我们使用docker ps命令来检查容器是否停止了。
重启我们的应用程序

哎呀!刚才你停止了另一个开发人员所使用的容器。这里你现在有两个选择:您可以创建一个新的容器或者重新启动旧的。让我们启动我们之前的容器:

    $ sudo docker start nostalgic_morse
    nostalgic_morse

现在运行docker ps -l来查看正在运行的容器,或者通过URL访问来查看我们的应用程序是否响应。

    注意:也可以使用docker restart命令来停止容器或然后再启动容器。

移除我们的应用程序

你的同事告诉你他们已经完成了在容器上的工作,不在需要容器了。让我们使用docker rm命令来删除它:

    $ sudo docker rm nostalgic_morse
    Error: Impossible to remove a running container, please stop it first or use -f
    2014/05/24 08:12:56 Error: failed to remove one or more containers

发生了什么?实际上,我们不能删除正在运行的容器。这避免你意外删除了可能需要的运行中的容器。让我们先停止容器,再试一次。

    $ sudo docker stop nostalgic_morse
    nostalgic_morse
    $ sudo docker rm nostalgic_morse
    nostalgic_morse

现在我们停止并删除了容器。

0 0
原创粉丝点击