美文网首页
02 docker 学习之 image管理

02 docker 学习之 image管理

作者: muahao | 来源:发表于2016-08-16 20:27 被阅读363次

    02 docker 学习之 image管理

    a third-party dockviz tool

    Image layers site

    [14:04:35] ahaomu:machines $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              latest              07c86167cdc4        4 days ago          188 MB
    hello-world         latest              690ed74de00f        4 months ago        960 B
    training/webapp     latest              6fae60ef3446        9 months ago        348.8 MB
    
    

    上面你会看到一个TAG 变量,其实一个repository会有很多版本的image,比如ubuntu可能有很多版本的啊,Ubuntu 10.04, 12.04, 12.10, 13.04, 13.10 and 14.04.
    如果你想启动一个带有TAG的image,应该执行如下命令:

    docker run -t -i ubuntu:14.04 /bin/bash
    

    如果你想启动 ubuntuL12.04,你应该执行:

    docker run -t -i ubuntu:12.04 /bin/bash
    

    如果你不指定TAG的变量,使用ubuntu,docker默认启动latest版本的ubuntu

    获得新的image

    其实你可以先从docker hub上下载一个image,然后你docker run启动一个container就不用等待了

    下载image

    docker pull centos
    docker run -t -i centos /bin/bash
    [root@7b7202b7960d /]#
    

    如果你想在docker hub上搜一个image的命令行方式,你发现你搜到了好多 sinatra的image,现在你明白你见过两种iamge repositories了

    • 像ubuntu,Official Repositories ,这个Docker repositories 由docker官方提供维护和build,此类也称之为base image和root images
    • 像ryotarai/hello-sinatra,docker 社区里的成员提供
    docker search sinatra
    NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    erikap/ruby-sinatra                    Docker for hosting Sinatra apps                 5                    [OK]
    tdiary/rpaproxy-sinatra                                                                1                    [OK]
    lucymhdavies/sinatra-boilerplate       Docker image with my boilerplate for Sinat...   1                    [OK]
    zyio/sinatra                           Tiny-ish Sinatra Dockerfile                     1                    [OK]
    semtech/mu-sinatra-template            Template for running Sinatra microservices      1                    [OK]
    sashaegorov/docker-alpine-sinatra      Alpine Sinatra is project for running a Si...   0                    [OK]
    kerona/sinatra                                                                         0                    [OK]
    zoomix/sinatra-galleria                                                                0                    [OK]
    larmar/sinatra-puppet                                                                  0                    [OK]
    synctree/sinatra-echo                                                                  0                    [OK]
    shangaijun/sinatra                                                                     0                    [OK]
    windurst/sinatra                                                                       0                    [OK]
    hacker314159/ruby-sinatra                                                              0                    [OK]
    andyshinn/sinatra-echo                                                                 0                    [OK]
    yoheimuta/docker-sinatra                                                               0                    [OK]
    ryotarai/hello-sinatra                                                                 0                    [OK]
    llamashoes/docker-sinatra                                                              0                    [OK]
    garland/sinatra-hello                                                                  0                    [OK]
    davidyoondrums/sinatra-skeleton                                                        0                    [OK]
    luisbebop/docker-sinatra-hello-world                                                   0                    [OK]
    torico/sinatra-async                   port 3001. for AWS                              0                    [OK]
    welldoer/sinatra                       Sinatra webapp                                  0                    [OK]
    zhenkyle/sinatra                       Build my own automated build `sinatra` exa...   0                    [OK]
    gwjjeff/sinatra                                                                        0                    [OK]
    shaoheshan/sinatra                                                                     0                    [OK]
    

    如何下载docker image?

    docker pull training/sinatra
    

    根据image启动container

    docker run -t -i training/sinatra /bin/bash
    

    如何自己定制一个docker 镜像?

    • You can update a container created from an image and commit the results to an image.
    • You can use a Dockerfile to specify instructions to create an image.

    方式1

    通过image创建一个container,然后修改container之后,然后提交上去

    1. 修改container

    2. 创造一个新的docker image,你需要指定原来修改后的container的ID,其实你每次打开一个container都是不一样的,最后一个参数是编写一个docker image的名称

    方式2

    使用docker commit去创建一个docker image的方式有点小笨,你可以使用新的命令docker build去创建一个新的docker image,但是,首先,你需要有一个Dockerfile,

    $ docker build -t ahao.mah/sinatra:v2 .
    -t 指定了这个新建出来的image属于ahao.mah,repository的名字是sinatra,然后给其一个tag,v2,最后一个 “点”,是Dockerfile的路径
    

    step1 :
    首先docker会上传你的build content

    step 2:
    然后,你会看到 Dockerfile文件中的指令一个一个的执行,你会发现每一个指令都创建了1个container,然后指令在container里执行后,类似docker commit一样上传。

    step 3:
    最后返回一个 image ID

    [17:44:01] ahaomu:sinatra $ docker build -t ahao.mah/sinatra:v2 .
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM ubuntu:14.04
    14.04: Pulling from library/ubuntu
    5a132a7e7af1: Already exists
    fd2731e4c50c: Already exists
    28a2f68d1120: Already exists
    a3ed95caeb02: Already exists
    Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
    Status: Downloaded newer image for ubuntu:14.04
     ---> 07c86167cdc4
    Step 2 : MAINTAINER Kate Smith <ksmith@example.com>
     ---> Running in 2cbbb997a6e6
     ---> 166f18b7e66c
    Removing intermediate container 2cbbb997a6e6
    Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev
     ---> Running in 681c35d72410
    .
    .
     ---> e0234b8ec084
    Removing intermediate container 7b3fb0fd8da2
    Successfully built e0234b8ec084
    

    使用新建的image去创建一个container

    [18:15:34] ahaomu:sinatra $ docker run -t -i ahao.mah/sinatra:v2 /bin/bash
    root@385c4b3596d5:/#
    root@385c4b3596d5:/# exit
    

    给已有的image打新的tag

    [18:16:28] ahaomu:sinatra $ docker tag e0234b8ec084 ahao.mah/sinatra:devel

    Image Digests

    什么是image digests?

    当你docker pull 或者docker push的时候,都会返回一个digest

    如何上传一个image到自己的repository?

    1. 首先我知道我的repository是ahao/ahao.mah
    2. 其次,我开始创建一个新的image,然后,push到ahao/ahao.mah这个repository里
    3. docker push ahao/ahao.mah

    上传到自己的hub上失败

    [14:23:11] ahaomu:docker $ docker push ahao/ahao.mah
    [14:24:16] ahaomu:docker $ docker login
    [14:25:32] ahaomu:docker $ curl -v https://index.docker.io:443
    
    

    原因:
    将dns修改成8.8.8.8

    登录成功

    关于container和image的思考:

    1. 使用docker run 根据一个image启动一个container后,在这个container里创建一个文件,然后退出这个container,再重新使用刚才那个image,启动一个container,发现刚才创建的文件不存在!

    2. 使用docker run根据一个image A启动一个container A,在这个container A里创建一个文件touch ahao.mah.20160308,然后根据这个container A和image A创建一个新的image B,执行 docker commit -m "add ahao.mah.20160308" -a "ahao.mah" e2a5bc22ad2d centos,新创建的image里就永远包含了 ahao.mah.20160308这个文件。

    理解

    一个image可以创建多个container;

    docker run是创建一个container的命令,-d参数可以使得这个container 进程后台运行,docker ps可以看到当前有多少个container在运行

    关于image和tag,repository的思考

    docker tag 0b12de55ac0e centos:devel

    使用docker tag命令,给一个image打一个TAG,就会多出一个repository,一个repository对一个TAG,一个image可以对应多个repository.

    其实repository和image对应关系要一致。

    从host上删除一个image
    下图看来上去,貌似不是在删除一个image,而是在删除一个repository!但是,两个repository都是来自一个image,区别只是tag不一样罢了!

    相关文章

      网友评论

          本文标题:02 docker 学习之 image管理

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