02 docker 学习之 image管理
[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之后,然后提交上去
修改container
创造一个新的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?
- 首先我知道我的repository是ahao/ahao.mah
- 其次,我开始创建一个新的image,然后,push到ahao/ahao.mah这个repository里
- 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的思考:
使用docker run 根据一个image启动一个container后,在这个container里创建一个文件,然后退出这个container,再重新使用刚才那个image,启动一个container,发现刚才创建的文件不存在!
使用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不一样罢了!