镜像
获取镜像
使用docker pull
命令获取镜像。
例如获取 Ubuntu 的操作系统镜像:$ sudo docker pull ubuntu:12.04
即可,实际上相当于$ sudo docker pull registry.hub.docker.com/ubuntu:12.04
。
由于有时官方的注册服务器下载较慢,可选用国内的镜像服务器:$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
完成下载后,就可以使用该镜像了。我们可以创建一个容器,在其中运行bash应用。
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#
使用docker images
能列出本地已有的镜像。
创建镜像
可以修改已下载的镜像:
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
在容器中添加json
和 gem
两个应用。然后使用 exit
来退出,此时我们的容器已经改变,使用 docker commit
命令提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
-m
是用来制定提交的说明信息,-a
制定更新的用户信息。然后是用来创建的镜像ID也就是刚才修改时候的容器ID,最后指定目标镜像的仓库名和tag信息,创建成功后就会返回镜像的ID信息。
然后我们通过docker image
查看新创建的镜像。
$ 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
然后我通过新的镜像启动容器:
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#
利用 Dockerfile
来创建镜像
虽然使用docker commit
可以扩展一个镜像,但不方便在团队中分享。所以我们用docker build
来创建新的镜像。首先,我们要创建一个 Dockerfile。
新建目录和一个 Dockerfile
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
Dockerfile 的基本语法是
- 使用#来注释
- FROM 指令告诉 Docker 使用哪个镜像作为基础
- 接着是维护者的信息
- RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
编写完成 Dockerfile 之后,我们可以使用 docker build
来生成镜像:
$ 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
---> 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 的路径。
我们分析一下 build 的进程。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。一个镜像不能超过127层
同时,我们也可以利用 ADD
来复制本地文件到镜像中,EXPOSE
来向外部开放端口,用 CMD
来描述容器启动后运行的程序。
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
然后就可以用新创建的镜像来启动一个容器了。
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@8196968dac35:/#
我们可以通过docker tag
来修改镜像的标签。
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
更多Dockerfile
的用法,可参考Dockerfile
从本地文件系统中导入镜像
使用 openvz
(容器虚拟化的先锋技术)模板创建,下载地址为openvz.org
下载完镜像之后,使用命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
上传镜像
用户通过docker push
命令,把自己创建的镜像上传到仓库。
$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)
导出和载入镜像
使用 docker save
命令,导入镜像到本地文件。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB
...
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
使用docker load
从导出的本地文件中再导入到本地镜像库中。
$ sudo docker load --input ubuntu_14.04.tar
移除本地镜像
使用 docker rmi
命令移除本地镜像,docker rm
命令是移除容器。
注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。