0%

Docker创建镜像

修改已有镜像

  1. 使用下载的镜像启动容器

    1
    2
    $ sudo docker run -t -i training/sinatra /bin/bash
    root@0b2616b0e5a8:$
  2. 在容器中添加 json 和 gem 两个应用

    1
    root@0b2616b0e5a8:$ gem install json
  3. 提交更新后的副本

    1
    2
    $ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
    4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

    其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

  4. 使用 docker images 来查看新创建的镜像。

    1
    2
    3
    4
    5
    $ sudo docker images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
    ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
    ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
  5. 可以使用新的镜像来启动容器

    1
    2
    $ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
    root@78e82f680994:$

利用Dockerfile来创建镜像

  1. 新建一个目录和一个 Dockerfile

    1
    2
    3
    $ mkdir sinatra
    $ cd sinatra
    $ touch Dockerfile
  2. Dockerfile 中每一条指令都创建镜像的一层,例如:

    1
    2
    3
    4
    5
    6
    # This is a comment
    FROM ubuntu:14.04
    MAINTAINER Docker Newbee <newbee@docker.com>
    RUN apt-get -qq update
    RUN apt-get -qqy install ruby ruby-dev
    RUN gem install sinatra

    Dockerfile 基本的语法是

    • 使用#来注释
    • FROM 指令告诉 Docker 使用哪个镜像作为基础
    • 接着是维护者的信息
    • RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件
  3. 编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $ sudo docker build -t="ouruser/sinatra:v2" .
    Uploading context 2.56 kB
    Uploading context
    Step 0 : FROM ubuntu:14.04
    ---> 99ec81b80c55
    Step 1 : MAINTAINER Newbee <newbee@docker.com>
    ---> Running in 7c5664a8a0c1
    ---> 2fa8ca4e2a13
    Removing intermediate container 7c5664a8a0c1
    Step 2 : RUN apt-get -qq update
    ---> Running in b07cc3fb4256
    ---> 50d21070ec0c
    Removing intermediate container b07cc3fb4256
    Step 3 : RUN apt-get -qqy install ruby ruby-dev
    ---> Running in a5b038dd127e
    Selecting previously unselected package libasan0:amd64.
    (Reading database ... 11518 files and directories currently installed.)
    Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...
    Setting up ruby (1:1.9.3.4) ...
    Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ...
    Processing triggers for libc-bin (2.19-0ubuntu6) ...
    ---> 2acb20f17878
    Removing intermediate container a5b038dd127e
    Step 4 : RUN gem install sinatra
    ---> Running in 5e9d0065c1f7
    . . .
    Successfully installed rack-protection-1.5.3
    Successfully installed sinatra-1.4.5
    4 gems installed
    ---> 324104cde6ad
    Removing intermediate container 5e9d0065c1f7
    Successfully built 324104cde6ad
     其中 `-t` 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
    
     注意一个镜像不能超过 127 层