Docker话说已经活了好几年了,业界开始逐步从热议到逐步落地使用,之前硕士搞过一年的LXC,虽然Docker这个技术新瓶装旧酒,但是由于加入了特有的hub机制,使其易于传播,易用性比LXC更具优势。
今天抽空使用了一下docker,准备将自己的 VPS 容器化,方便以后在不同主机中迁移。
Docker由三部分组成:一个运行docker命令的client, 一个包含images并以容器(container)形式运行image的主机,一个docker的images仓库。client与docker host上面的docker daemon通信。当然docker client和host可以运行于一台机器(我们做实验的时候是一台),默认的docker仓库是Docker Hub。
docker使用流程就是client pull 从hub上把image拉到docker host,然后通过run命令指挥image到host上面弄一个container来跑这个image。
或者就是client 通过build命令在host上面创建一个自己的image,然后通过push命令把image推到仓库。然后别人就可以使用自己构建的镜像。
刚开始使用对image容易搞混乱,按照我的理解:image就是一个文件系统镜像,用户无法直接修改这个镜像,类似于一种二进制文件形式(其实是一种特殊的文件系统)里面运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
我们使用docker run就可以将这个image运行起来,运行起来的image就是container。运行起来的container我们可以对其进行各种修改,每产生一个修改,就产生一个commition ID。后一个构建依赖前一个构建,因此和git版本管理很像!
image和container之间的关系类似程序与进程之间的关系!
Docker命令实例
- docker pull的格式是:
docker pull[选项] [Docker Registry地址] <仓库名>:<标签名>
2.docker images命令下载的images:
$docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu ml 14.04 b969ab9f929b 1 weeksago 210 MB
3.最最重要的就是docker run
$docker run -p 8080:80 -p 111:22 -i -t -name [docker-name] -d COMMAND
其中的-p指的是端口映射,-d 设置该容器以daemon模式运行,具体实例:
$ sudo docker run -i -t ubuntu:14.04 /bin/bash
docker run – 运行一个容器
-t – 分配一个(伪)tty (link is external)
-i – 交互模式 (so we can interact with it)
ubuntu:14.04 – 使用 ubuntu 基础镜像 14.04
/bin/bash – 运行命令 bash shell
4. docker start 其实就是docker run的缩写,创建好container之后就不用再输入很长的命令,而是由一个docker start代替。
$docker start [docker-name]
5. docker ps 可以显示出运行的所有容器
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e3a913872698 ubuntu:14.04 "bash" 11seconds ago Up 10 seconds wizardly_elion db1c25753e97 ubuntu:14.04 "bash" 21seconds ago Up 21 seconds adoring_shannon
这几个命令在使用中使用频率最高。
Dockerfile是构建image的文件,类似于脚本命令。
# ubuntu 14.04 with vim and gcc FROM ubuntu:14.04 MAINTAINER lzz<[email protected]> RUN apt-get update && apt-getinstall –y vim gcc
其中FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。如果FROM语句没有指定镜像标签,则默认使用latest标签。
MAINTAINER <name> 指定创建镜像的用户
RUN 有两种使用方式
RUN “executable”, “param1”, “param2”
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。
exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:
RUN [ “echo”, “$HOME” ]
这种方式是不会达到输出 HOME 变量的,正确的方式应该是这样的
RUN [ “sh”, “-c”, “echo”, “$HOME” ]
RUN产生的缓存在下一次构建的时候是不会失效的,会被重用,可以使用–no-cache选项,即docker build –no-cache,如此便不会缓存。