Docker是一个应用容器化的平台,容器化对应用提供了一致性的运行环境,同时为应用的弹性扩容,维护,分发以及开发都提供了方便。
Docker的结构
结构上Docker类似于VM,有着资源隔离和分配的优势。
但是也有一些差异,关键的一个不同点在于没有Guest OS,所有APP使用Host OS的内核,不同的APP以不同的独立的进程运行在Host OS的用户态。
Hello World
安装Docker后,即可直接执行Hello World
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker Engine CLI client contacted the Docker Engine daemon.
2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker Engine daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/
运行Hello World的命令由3部分构成
一个镜像(Image)是一个完全整的APP,包括其需要的所有资源,本身无状态,且永远不会改变。当一个镜像被Docker使用运行时,则生成了一个容器(Container),也就是说容器是镜像的一个运行时实例。
当Hello World的镜像被执行时,Docker做了以下几个步骤:
- 检查本地是否有hello-world镜像
- 如果本地不存在,则从远程(Docker Hub)下载到本地
- 所有需要的组件都在本地可用时,加载镜像到容器执行
类似Maven之类的构建工具,Docker本地会维护一份镜像缓存,当本地不存在时,Docker会到Docker Hub上获取镜像。Docker Hub是一个Docker镜像仓库平台,hello-world即为Docker Hub 上一个公共的镜像,该镜像简单的打印一些信息后退出。
Dockerfile
Dockerfile是一个Docker镜像的描述清单,描述了镜像中被烧入了哪些软件,以及这些软件如何执行。
Dockerfile作用上类似Maven的POM,也是一个普通的文本文件,以docker/whalesay为基础,安装fortunes,并让fortunes的输出自动作为docker/whale的输入的一个Dockerfile为:
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
docker/whalesay是一个公共的镜像,该镜像接受一个输入
$ docker run docker/whalesay cowsay boo-boo
< boo-boo >
......
fortunes 是类Unix上一个随机输出一些短语的程序。
通过安装fortunes,把forunes的输出自动作为docker/whalesay的输入,从而新的基于docker/whalesay创建的镜像可以自动输出短语,而不用人为指定。
创建一个镜像
假设在Dockerfile所在目录为“.”,执行命令
docker build -t docker-whale .
创建一个新的镜像docker-whale。
运行新生成的镜像
$ docker run docker-whale
_________________________________________
/ "He was a modest, good-humored boy. It \
\ was Oxford that made him insufferable." /
......