02 docker 学习之 image管理

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 
 ---> 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管理)