Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
docker 登录账户密码是随机生成的,可以通过以下命令查看密码:
docker logs <container name or ID> 2>&1 | grep '^User: ' | tail -n1
docker logs -f <container name or ID>
docker ps [-a]
-a 为可选项:查看所有容器,包括已经停止的容器。
docker rm <container name or ID>
想清楚所有容器,可以使用命名组合:
docker rm $(docker ps -a -q)
其中 -q 为只列出容器 id。
docker stop <container name or ID>
docker start <container name or ID>
docker kill <container name or ID>
docker images
docker rmi <image id>
docker rmi $(docker images -q) // 删除所有镜像
docker rmi $(docker images -q -f dangling=true) // 删除所有没有标签的镜像
docker tag <image id> <tag name>
如果一个镜像 id 对应着连个不同的镜像名称可以使用 rmi 命令来删除多余的 tag:
aqcoder@ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
zggj latest 327b06d562de 21 hours ago 1.096 GB
zggj2 latest 327b06d562de 21 hours ago 1.096 GB
aqcoder@ubuntu:~$ sudo docker rmi zggj2
Untagged: zggj2:latest
aqcoder@ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
zggj latest 327b06d562de 21 hours ago 1.096 GB
运行容器的参数比较多,详见 help。这里列出常见的命令。
docker run --name test -it 80:80 -p 22:22 -d zggj /bin/bash
docker run --name test -p 80:80 -p 22:22 -d zggj
第一种为连接容器的 STDIN 相当于进入了容器的 bash。
-- name 选项为设置容器的名称。
-i 保存容器的标准输入 STDIN。
-t 分配一个伪终端。
-d 分离。
-p 端口映射,前面为本机端口,后面为容器端口。
docker pull <镜像名:tag>
docker save <image id> > /path/to/save.tar // 保存镜像到本地
docker load < /path/to/save.tar // 加载镜像
docker export -o /path/to/save.tar <container id>
docker import /path/to/save.tar
save 保存的是镜像,包括镜像的历史。 export 导出的只是荣建快照,不包含镜像历史等,相对较小。
docker build -t <image name> /path/to/Dockerfile
docker cp <container id>:/path/to/file /path/to/save // 从容器中考出
docker cp /path/to/file <conttainer id>:/path/to/save // 考至容器
为了达到数据可持久性存储、备份、共享,docker 提出了 volume 数据卷的概念。你可以把 volume 理解为一个指定的特殊的数据存储区,由于他绕过了镜像的 Union File System,所以如下命令对 volume 中的数据是无效的:
docker save
docker export
docker commit
创建 volume 有两种方式:
docker run -v /path/in/container/ <image id>
docker run -v /path/to/host:/path/to/container <image id> # 挂载方式
第一种方式会创建一个数据卷,并挂载数据卷到指定的容器中的目录。所有容器对此目录的数据操作都会复制到数据卷中。
第二种方式会挂载宿主主机的目录到容器中的目录,此时宿主主机的目录就相当于是数据卷。
你可以使用 docker cp 命令来拷贝数据卷中的数据:
docker cp <container id>:/path/to/volume /path/to/host
容器之间的数据卷可以共享:
docker run --name container1 -v /data image1
docker run --name container2 --volumes-from container1 image2
数据卷是独立于 docker 的 union file system 的,使用 -v 选项可以删除数据卷:
docker rm -v <container id>
关于数据卷的更多内容可以参考: http://www.tuicool.com/articles/uYzeAnz
Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器
所有的 Dockerfile 命令格式都是:
# this is comment
INSTRUCTION arguments
Dockerfile 的注释使用 # 开头。 虽然指令忽略大小写,但是建议使用大写。
下面列出常用命令和用法:
FROM <image>[:<tag>]
指定构建的镜像使用的基础镜像。
MAINTAINER <name>
指明镜像的维护者。
RUN 命令在构建的时候执行命令。相当于在镜像内执行命令。
RUN <command>
或:
RUN ["executable", "param1", "param2" ... ]
指定镜像内的用户,可以多次指定,对其后的命令生效,最后一个会作为容器启动时进入的用户。
USER <user name>
EXPOSE 命令可以开发容器的端口
EXPOSE <port> [<port>...]
用于设置运行容器的环境变量
ENV <key> <value>
从主机复制文件到镜像
ADD <src> <dest>
配置 RUN, CMD, ENTRYPOINT 命令设置当前工作路径
WORKDIR /path/to/workdir
CMD 命令为启动容器时需要执行的命令,如果在 RUN 命令的参数中指定了命令参数则会覆盖此命令。 一个 Dockerfile 里只能有一个 CMD,如果有多个,只有最后一个生效。
CMD ["executable","param1","param2"]
CMD ["param1","param2"] // 作为 ENTRYPOINT 的默认参数
CMD command param1 param2
设置容器的进入点。
ENTRYPOINT cmd param1 param2 ...
或
ENTRYPOINT ["cmd", "param1", "param2"...]
创建数据卷
VOLOUME /data
注意:不要把 ENTRYPOINT 和 CMD 命令搞混,你可以吧 ENTRYPOINT 理解为把容器变成了一个执行程序,启动容器是就相当于执行了 ENTRYPOINT 指定的命令这个“程序”。同时 CMD 命令可以给他提供默认参数,当然也可以不提供。
这些就是 docker 的基础使用教程。列举的都是命令,可以当手册、笔记用。 记下来我会把我迁移本博客到 docker 的整个过程记录下来,当做本文的一个实战。如果你对这些命令摸不着头脑的话不放看看我的实例。
<实例没写完,后期不上地址>