官方网址
相比较虚拟机,Docker 需要更少的系统资源, 比较适用于大批量的重复构建实例。
举个可能不太恰当的例子, Docker Image 有点类似 VM 里面说的Image。 Image 的文件形式是 tarball, 可以被Docker Load 起来并且运行。
Docker Hub
探索官方 Image 仓库
有很多软件供应商,提供官方的Docker Image 下载, 他们都可以在Docker Hub里面找到。 作为开发者, 可以直接从这些官方的Image上进行后续的开发。这些仓库有个很好的功能, 他们列出了软件/系统的主要版本,开发者可以方便的找到自己需要的版本。
Ubuntu 官方Image
MySQL 官方Image
Tomcat 官方Image
除了官方Image,在实际使用的时候, 其实更多的是使用私有Image。 私有Image需要自己构建。Docker Image 是一种层级的结构, 上一层的Image 可以从下一层构建。 作为开发者, 私有Image一般是本地机器上的。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB
ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB
ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB
...
一个简单的Docker File 例子
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee
RUN apt-get -y update
RUN apt-get -y install ruby ruby-dev
RUN gem install sinatra
# 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"]
参考1: Docker File指令
参考2: Best practices for writing Dockerfiles
利用 Docker build , 累构建Image, docker build 会自动从本地目录下,搜索Dockerfile。
docker build -t example.docker.image
另外还可以使用 docker commit 命令, 来把当前对docker 做的改动保存起来。
sudo docker commit 4a9045xxxxxx jamturxx/apache2
Docker build output
$ sudo docker build -t="ouruser/sinatra:v2" .
Uploading context 2.56 kB
Uploading context
Step 0 : FROM ubuntu:14.04
---> 99ec81b80c55
Step 1 : MAINTAINER Kate Smith
---> 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
Build Catching
再次build docker image, docker 会检查每一步build 完成以后的签名, 如果没有发生变化, 则不会重新build 该步骤, 直接使用 cache。 如果不希望使用catch 可以使用 –no-cache 参数,强制重新构建。
Step 1 : FROM ubuntu:12.04
---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta
---> Using cache
---> 4354ccf9dcd8
Step 3 : RUN apt-get update
---> Using cache
---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
---> Using cache
---> 103f1a261d44
利用 docker commit 来build image
一般不建议利用 docker commit 来构建 image, 因为没有Docker file 作为一个文档, 可重复性比较差。 但是, commit 有一个优点, 由于当前运行的image 是用docker run 启动的, 而docker run 的功能比 docker build 多很多, 所以有些功能只有在run 的时候才能开启, 尤其是网络功能。
例如:
Docker apt-get update fails
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
以Daemon 的方式运行 Docker, “-d”
自动端口映射 “-P”
$ sudo docker run -d -P -t example.docker.image
制定端口映射 “-p”
docker run -d -p 80:80 my_image
Docker run reference
在看文档的时候, 会遇到Container 的概念。 一般可以把它理解成运行起来以后的 Image实例。
一些常用命令
Use the Docker command Line
1. Containers vs. virtual machines: How to tell which is the right choice for your enterprise
2. 《Docker —— 從入門到實踐》正體中文版