http://book.douban.com/subject/26285268/
Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。
Docker 核心组件有这些:
- Docker 客户端和服务器;
- Docker 镜像;
- registry ;
- Docker 容器;
Docker 的安装
- Docker 安装要求
- CPU 64位 ( x86_64或者amd64 );
- 运行 Linux3.8 或更高内核;
- 内核必须支持一种适合的存储驱动 ( storage driver ) ,例如,Device Manager 、AUFS、vfs、btrfs,默认存储驱动通常是 Device Mapper;
- 安装方法略。
Docker 的基础命令
安装完成后,先查看 Docker 程序是否存在、正常。使用命令:
该命令返回所有容器和镜像的数量、 Docker 使用的执行驱动和存储驱动。
运行第一个容器
docker run -i -t ubuntu /bin/bash
docker run 命令加上参数 -t -i , -i 标志保证容器中的 STDIN 是开启的,尽管还没有附着到容器中。持久的标准输入是交互式 shell的“半边天”,
-t 标志则是另外半边天,它告诉 Docker 为要创建的容器分配一个伪 tty 终端。这样,新创建的容器才能提供一个交互式 shell 。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,这2个参数是最基本的。( docker helo run 和 man docker-run 可以查看全部 docker run 的标志 )
ubuntu 是指定用什么镜像来创建容器。这里是用的基础 ubuntu 镜像。在此命令执行后, Docker 首先会在本地搜寻是否存在 ubuntu 镜像,如果本地没有该镜像,那么 Docker 就会连接到官方的 Docker Hub Regisrty 查看 Docker Hub 中是否存在该镜象,一旦找到就下载到本地,所以第一次运行会比较花多一些时间。
随后 Docker 在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP 地址,以及一个用来和宿主机进行通信的桥接网络接口。最后的 /bin/bash 是告诉 Docker 要在这个新容器中运行什么命令,这里我们启动一个 Bash shell 。
执行了 docker run -t -i ubuntu /bin/bash 后,我们就进到容器内了,并且执行一些命令:
exit 命令,退出并结束容器,回到宿主机 shell 下。
执行 docker ps -a 查看当前系统中的容器列表和状态。
默认情况 docker ps 不加 -a 参数只能看到当前正在运行的容器。 -a 可以列出所有容器。 -l 列出最后一次运行的容器,包括正在运行的和已经停止了的。
容器可以经由3种方式指代,短 UUID 、长 UUID 、还有名称 ( docker ps -a 里面的names列 ) ;
容器命名
Docker 会为我们创建的容器自动随机命名。如果要手动指定一个名称可以使用 –name:
docker run –name my_first_container -i -t ubuntu /bin/bash
容器名只能包含大小写字母、数字、下划线、圆点、横线。 [a-zA-Z0-9_.-]
给容器命名是一个好习惯,相较于 UUID ,命名后的容器更易分辨。
容器名必须是唯一的,无法创建2个相同名字的容器。如果有命名冲突可以使用 docker rm CONTAINERNAME 来删除容器。
重新启动已经停止的容器
docker start CONTAINERNAME
docker start UUID
也可以用 docker restart CONTAINERNAME 重启一个容器。
附着到容器上
当我们想要附着到一个已经运行的容器上,而又没有在 run 的时候打开交互 shell 的时候,可以使用
docker attach CONTAINERNAME/UUID
创建守护式容器
除了上面的交互式的容器,还有一种守护式容器,非常适合运行应用程序和服务。大多数时候我们运行容器都是守护式的。
docker run –name haha -d ubuntu /bin/bash -c “until false; do echo hello world; sleep 1 ; done”
此处加上了 -d 参数,因此Docker会将该容器 ( haha ) 放到后台运行。
此时在宿主机执行 docker ps 就可以看到该容器正在运行。
那此时容器内部在干什么呢?
我们在创建容器的时候添加了 /bin/bash -c “until false; do echo hello world; sleep 1 ; done ” 这个until循环,那么容器内部就会一直执行该循环,直到容器停止。
此时使用
docker logs CONTAINERNAME 可以获取当前容器的日志。但只返回最后几条,想要持续获取返回日志:
docker logs -f CONTAINERNAME
还可以使用 docker logs –tail 10 CONTAINERNAME 显示最后10行日志。
docker logs –tail 0 -f CONTAINERNAME 来跟踪容器的最新日志而不用读取整个日志文件。
docker logs -ft 为每条日志加上时间戳。
查看容器内的进程
docker top CONTAINERNAME
在容器内部运行进程
在 Docker 1.3 之后,我们可以通过 docker exec 在容器内部额外启动新进程。容器内可以运行两种进程:后台任务和交互式任务。
运行一个不用交互的后台任务:
docker exec -d CONTAINERNAME touch /etc/file1
这里同样加上 -d 表明这是一个后台进程。
要查看新 touch 的这个文件就需要容器内部shell打印一个显示了,那么需要一个交互命令:
docker exec -t -i CONTAINERNAME /bin/ls /etc/file1
或者直接打开一个 bash shell
docker exec -i -t CONTAINERNAME /bin/bash
然后就进入到容器内部,打开新的bash会话了。(感觉这个比直接在外面执行 docker attach CONTAINERNAME好)
停止守护式容器
docker stop CONTAINERNAME 这样停止其实比较慢,也可以使用:
docker kill CONTAINERNAME 直接向容器进程直接发送SIGKILL信号。
自动重启容器
如果由于某种错误导致容器停止运行,我们可以通过 –restart 让 Docker 自动重启。 –restart 会检查容器的退出代码,并据此决定是否需要重启容器。
dockerrun –restart=always –name xixi -d ubuntu /bin/bash -c “while true; do echo hello world ; sleep 1 ; done”
在上面这个例子中, –restart 被设置为 always ,无论容器的退出代码是什么, Docker 都会自动重启该容器。除了 always ,也可以把值设置为 on-failure ,这样只有当容器的退出代码为非 0 的时候才会自动重启,另外 on-failure 还可以接受一个可选的重启次数参数:
docker run –restart=on-failure:5 –name huhu -d ubuntu /bin/bash -c “while true; do echo hello world ; sleep 1 ; done”
深入容器
除了通过 docker ps 获取容器信息,还可以使用 docker inspect 来获取更多容器信息。
docker inspect 会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。 docker inspect 还可以加上 -f 或者 –format 来查看选定结果:
docker inspect –format='{{ .State.Running }}’ haha
docker inspect –format='{{ .NetworkSettings.IPAddress }}’ haha
-f 或者 –format 其实支持完整的 Go 语言模板。
除了查看容器,还可以通过浏览 /var/lib/docker 目录来深入了解 Docker 的工作原理。该目录存放着 Docker 镜像、容器、以及容器配置。所有的容器都保存在 /var/lib/docker/containers 目录下。
删除容器
docker rm CONTAINERNAME
运行中的容器无法删除,需要先停止(stop或者kill)
批量删除多个容器:
docker rm `docker ps -a -q`