美文网首页
docker镜像与容器

docker镜像与容器

作者: 我是上帝可爱多 | 来源:发表于2017-07-30 22:08 被阅读40次

    1 docker与传统虚拟机技术

    传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。


    2 docker镜像

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    • 查看镜像
      docker images 发现啥都没有,因为还没拉取镜像,拉取指令docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
    $ docker pull debian
    
    Using default tag: latest
    latest: Pulling from library/debian
    fdd5d7827f33: Pull complete
    a3ed95caeb02: Pull complete
    Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa
    Status: Downloaded newer image for debian:latest
    
    Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
    仓库名:如之前所说,这里的仓库名是两段式名称,既 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
    

    我们看一下解释:Docker images can consist of multiple layers. In the example above, the image consists of two layers; fdd5d7827f33 and a3ed95caeb02.英文好的同学应该看得懂,就是说debian这个镜像包含2层。

    $ docker pull debian:jessie // 默认拉取的tag是latest,这回我们换一个
    
    jessie: Pulling from library/debian
    fdd5d7827f33: Already exists
    a3ed95caeb02: Already exists
    Digest: sha256:a9c958be96d7d40df920e7041608f2f017af81800ca5ad23e327bc402626b58e
    Status: Downloaded newer image for debian:jessie
    

    我们来看一下解释:Layers can be reused by images. For example, the debian:jessie image shares both layers with debian:latest. 这是说镜像层可以共用。再来查看一下images

    $ docker images
    
    REPOSITORY   TAG      IMAGE ID        CREATED      SIZE
    debian       jessie   f50f9524513f    5 days ago   125.1 MB
    debian       latest   f50f9524513f    5 days ago   125.1 MB
    

    发现了吧,imageid都是一样,tag不同而已。
    我们来看一下这个命令:

    $ docker pull myregistry.local:5000/testing/test-image
    

    表示从myregistry.local:5000这个域名端口拉取 testing/test-image镜像。我们以后会说到这个的实现方式,实际上就是自己新开一个docker镜像仓库而已。

    拉取完镜像后要干嘛呢?
    有了镜像后,我们就可以以这个镜像为基础启动一个容器来运行。以上面的 ubuntu:14.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

    $ docker run --name test -it --rm ubuntu:14.04 bash
    root@e7009c6ce357:/# cat /etc/os-release
    NAME="Ubuntu"
    VERSION="14.04.5 LTS, Trusty Tahr"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 14.04.5 LTS"
    VERSION_ID="14.04"
    HOME_URL="http://www.ubuntu.com/"
    SUPPORT_URL="http://help.ubuntu.com/"
    BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
    root@e7009c6ce357:/# exit
    exit
    

    docker run 就是运行容器的命令,具体格式我们会在后面的章节讲解,我们这里简要的说明一下上面用到的参数。

    • --name 这个镜像运行时的容器名称。
    • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
    • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
    • ubuntu:14.04:这是指用 ubuntu:14.04 镜像为基础来启动容器。
    • bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
      最后我们通过 exit退出了这个容器。
    $ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
    IMAGE ID            REPOSITORY          TAG
    5f515359c7f8        redis               latest
    05a60462f8ba        nginx               latest
    

    学会上述方法列出镜像

    3 docker容器

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    (1) 启动容器
    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
    例如,下面的命令输出一个 “Hello World”,之后终止容器。

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

    可以利用 docker start 命令,直接将一个已经终止的容器启动运行。

    (2) 后台(background)运行

    更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。

    下面举两个例子来说明一下。

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

    容器会把输出的结果(STDOUT)打印到宿主机上面
    如果使用了 -d 参数运行容器。

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

    (3) 查看容器

    $ docker ps
    
    CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS               NAMES
    4c01db0b339c        ubuntu:12.04                 bash                   17 seconds ago       Up 16 seconds       3300-3310/tcp       webapp
    d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    33 minutes ago       Up 33 minutes       6379/tcp            redis,webapp/db
    

    上述是查看运行中的容器,docker ps a查看所有的

    $ docker ps --filter ancestor=ubuntu
    82a598284012        ubuntu              "top"               3 minutes ago        Up 3 minutes                            sleepy_bose
    bab2a34ba363        ubuntu              "top"               3 minutes ago        Up 3 minutes                            focused_yonath
    

    查找所有用ubuntu镜像运行的容器。

    (4) 进入容器 attach

    $ sudo docker run -idt ubuntu
    243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
    $ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
    $sudo docker attach nostalgic_hypatia
    root@243c32535da7:/#
    

    相关文章

      网友评论

          本文标题:docker镜像与容器

          本文链接:https://www.haomeiwen.com/subject/surklxtx.html