与container一起工作

在Docker User Guide一节,我们启动了第一个容器。我们使用docker run启动了两个容器。

  • 我们与运行的容器前台交互。
  • 我们运行的容器在后台daemonized。
在这个过程,我们学到了若干的Docker commands:
  • docker ps -container 列表
  • docker logs -显示container的标准输出
  • docker stop -停止正在运行的containers
提示:另外一种学习docker指令的方式   interactive tutorial
docker client相当的简单。每一个操作都是一个指令,每一个指定带有一系列的标签和参数。
# Usage:  [sudo] docker [command] [flags] [arguments] ..
# Example:
$ sudo docker run -i -t ubuntu /bin/bash
让我们使用docker version指令来查看docker client和daemon的版本信息。
$ sudo docker version
当使用这个指令时,它不只是提供Docker client和daemon的版本信息,也提供GO(Docker的开发语言)版本信息。
Client version: 0.8.0
Go version (client): go1.2

Git commit (client): cc3a8c8
Server version: 0.8.0

Git commit (server): cc3a8c8
Go version (server): go1.2

Last stable version: 0.8.0
查看Docker client能做什么?

       我们可以运行docker不带任何选项,来查看可用的命令。

$ sudo docker

         将看到一系列当前可用的指令:

Commands:
     attach    Attach to a running container
     build     Build an image from a Dockerfile
     commit    Create a new image from a container's changes
. . .

 Docker命令用法

        你可以学习指定命令的用法。

        在输入docker之后带上[command],来查看命令的用法:

$ sudo docker attach
Help output . . .
         或者带上--help标签:

$ sudo docker attach --help
         这将显示帮助文本和可用的标签:

         

Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

  --no-stdin=false: Do not attach stdin
  --sig-proxy=true: Proxify all received signal to the process (non-TTY mode only)

在Docker中运行一个Web Application

        现在我们已经学习了一些docker client的只是,让我们将注意力移到更重要的东西上:运行更多的容器。到目前为止我们没有运行特定用途的容器。那我们在Docker中构建一个web应用案例。

        Web应用中我们将运行一个Python的Flask应用。让我们从docker run命令开始吧:

$ sudo docker run -d -P training/webapp python app.py
       让我们来回顾一下命令做了什么。指定两个标签:-d 和 -P 。我们之前看到过-d 是告诉Docker在后台运行容器。-P 告诉Docker将container内部的任何网络端口映射主机端口。这让我们看web应用。

        我们指定了image:training/webapp。这image是一个预建的image,包含了一个简单Python Flask的web 应用。

         最后,我们指定容器运行Python app.py。这启动了我们的web应用。

查看WEB应用container

         使用docker ps命令查看正在运行的container。    

$ sudo docker ps -l
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

        为docker ps指定一个新的标签:-l 。这个告诉docker ps命令返回最后一个container详细信息。

       注意:默认的,docker ps命令只显示正在运行的容器信息。如果你想要看到已经被停止的容器信息,使用标签-a。

       我们看到与我们第一个容器信息差不多,但是多了PORTS列。

PORTS
0.0.0.0:49155->5000/tcp
       在docker run命令中使用-P标签将我们image中的任何端口暴露给我们的主机。

       注意:我们将在学习如何构建image时,学习如何在image中暴露端口。

       在这个例子中,Docker映射端口5000(Python Flask的默认端口)在端口49155上。

       Docker绑定的Network port是可配置的。在上个例子中,-P是对于-p 5000是一个缩写,容器内的端口5000映射到一个更高的端口(范围:49153-65535)在Docker本地主机上。我们也可以指定Docker容器绑定的端口使用-p标签,例如:

$ sudo docker run -d -p 5000:5000 training/webapp python app.py
        这将绑定容器内部的5000端口与本地主机的5000端口进行映射。可以会有一个疑问:为什么在Docker容器中不适用1:1的端口映射,而映射到更高的端口?因为1:1映射中container中的端口只能和本地的host一个映射。而当我们测试两个Python应用时,两个container内部端口都是5000。如果采用1:1映射,那么我们一次只能访问一个Docker container。

         那么让我们来在浏览器上访问49155端口吧,来登录应用:


         我们的Python应用已经存在!

        注意:如果你想要使用boot2docker virtual machine在OS X,Windows或者Linux上,需要获取虚拟主机的IP而不是使用localhost。你可以在boot2docker shell中这样查看:

$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
这样,你需要浏览http://192.168.29.103:49155来查看以上例子。


Network Port Shortcut

         使用docker ps命令来返回被映射的接口,有一点麻烦,所以Docker有个快捷指令:docker port。使用docker port时,我们需要制定container的ID或者名字,需要面向公共的接口。  

$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155

          在这个例子中,我们找到与container内部端口5000映射的外部端口。


查看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 logs指令表现的跟tail -f 指令一样,查看container的标准输出。我们从日志上可以看到Flask应用运行在端口5000上和访问日志条目。


寻找我们WEB应用 container的进程

          另外,从container的日志中,我们可以检查到在container中运行的进程,使用docker top命令。

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

         这里,我们看到python app.py指令是这个容器中的唯一进程。


检查WEB应用container

          最后,我们可以使用一个低级别的dive进入Docker container,通过命令docker inspect。它返回一个有用的配置信息的JSON hash和Docker container的状态信息。

$ 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应用container

          我们已经见到WEB应用在运行了。现在让我们使用docker stop命令来禁止名为nostalgic_morse的容器。  

$ sudo docker stop nostalgic_morse
nostalgic_morse

         我们可以使用docker ps指令来检查,container是否已经被停止。

$ sudo docker ps -l
重启WEB应用服务器

           Oops!就我们停到container之后,接到有新的开发需求,需要将container重启。这是我们有两种选择:我们可以创建一个新的container或者重启原来的。我们看一下如何重启先前的container:  

$ sudo docker start nostalgic_morse
nostalgic_morse

             现在,我们赶紧运行docker ps -l 看container是否已经重启,浏览器登陆container的URL看应用是否有回应。

             注意:docker restart也会可用的命令,对用停止或者启动中的容器。


移除WEB应用container

         你的同时告你,他们已经完工了,不再需要这个容器了。那么,让我们使用命令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
          发生了什么?我们不能移除正在运行的container。这是一个保护,防止意外的移除你可能需要的正在运行的container。让我们先停止这个容器首先:

$ sudo docker stop nostalgic_morse
nostalgic_morse
$ sudo docker rm nostalgic_morse
nostalgic_morse
           现在,我们的容器已经停止和删除。

猜你喜欢

转载自blog.csdn.net/ronggangzhao/article/details/43964421
今日推荐