0X00 安装并开启 docker

在绝大多数 Linux 发行版中都有 docker 的源,所以可以很轻松的装上。不过要使用 docker,必须启动 docker 的守护进程,在 CentOS7 中使用systemctl命令。

[root@iZ28jaak5nnZ ~]# yum install -y
[root@iZ28jaak5nnZ ~]# systemctl start docker

0X01 第一个 docker

从 Docker hub 拉取一个镜像下来,并运行。

[root@iZ28jaak5nnZ ~]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ... 
latest: Pulling from docker.io/library/ubuntu
b3e1c725a85f: Pull complete 
4daad8bdde31: Pull complete 
63fe8c0068a8: Pull complete 
4a70713c436f: Pull complete 
bd842a2105a8: Pull complete 
Digest: sha256:7a64bc9c8843b0a8c8b8a7e4715b7615e4e1b0d8ca3c7e7a76ec8250899c397a
Status: Downloaded newer image for docker.io/ubuntu:latest
  • dcker 是命令,这不用说了
  • run 是参数,标识创建并运行
  • -i 指定的是使用标准输入 STDIN
  • -t 指定的是使用一个虚拟 tty 终端
  • ubuntu 指的是在 docker hub 中唯一的名字
  • /bin/bash 指定的是执行一个命令

通过这种方式创建的容器是没有名字的,使用 UUID 标识,当然也可以使用下面的命令来指定容器的名字。

docker run -i -t --name my_first_docker ubuntu /bin/bash

首先 Docker 会检查本地是否存在 ubuntu 镜像,如果没有的话会从官方维护的 Docker Hub Registry
查看是否有该镜像。docker 一旦找到该镜像就会将其下载保存到本地。然后 docker 在本地文件系统中 使用这个
镜像创建一个容器,该容器拥有自己的网络、IP 和一个用来喝宿主机进行通信的 桥接 网络接口。最后告诉了 docker
在新容器中要运行什么命令。

0X02 运行在后台

在 Linux 中要运行一个服务,肯定是不可以将服务进程放在前台的,比如我们使用systemctl start httpd命令打开 apache httpd 服务的时候,是启启动了 httpd 的守护进程。所以说守护进程就是一种运行在后台的提供服务的进程。所以我们这里如果要让 docker 容器运行在后台的话,也是可以将其设置成守护模式。

[root@iZ28jaak5nnZ ~]# docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello wrld; sleep 1; done"

在这里我创建了一个名为daemon_dave的容器,并执行了一小段 shell 脚本,来不断地输出hello world。这里的-d参数就是将其设置成守护 (daemon) 模式。
然后我们可以使用下面两个命令来控制这个容器的开关

[root@iZ28jaak5nnZ ~]# docker start my_first_docker
[root@iZ28jaak5nnZ ~]# docker stop my_first_docker

0X03 回到 docker

刚才我们开启的容器因为在后台,所以我们并不能和它交互,有一种方式可以转到可交互模式,称之为附着。这样如果容器中正在运行着交互程序的话,就可以进入到容器中开始交互了

[root@iZ28jaak5nnZ ~]# docker attach my_first_docker

0X04 查看日志

不过大多数情况下容器中运行的都是一些服务性质的东西,所以我们大可不必进入到容器里,只需要查看一下日志即可。

# 普通日志
[root@iZ28jaak5nnZ ~]# docker logs daemon_dave
# 滚动的日志
[root@iZ28jaak5nnZ ~]# docker logs -f daemon_dave
# 带有时间戳的日志
[root@iZ28jaak5nnZ ~]# docker logs -ft daeon_dave

如果刚才的my_first_docker没有关闭的话,可以使用docker logs -f my_first_docker来查看容器的输出情况

0X05 docker 监控

# 将日志记录到日志驱动 syslog
[root@iZ28jaak5nnZ ~]# docker run --log-driver="syslog" --name daemon_dwayne -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看某些容器的状态
[root@iZ28jaak5nnZ ~]# docker status daemon_dave daemon_kate....
# 查看容器的相信信息
[root@iZ28jaak5nnZ ~]# docker inspect daemon_dave
# 提取单条信息
[root@iZ28jaak5nnZ ~]# docker inspect --format='{{ .Created}}' my_first_docker
2017-01-09T15:18:30.781266521Z

--log-driver 参数是日志驱动,将日志驱动设置到 syslog。设置了日志驱动的容器不能使用上面介绍的docker logs查看日志。
status 和 inspect 后面都可以接一个或多个容器名。status 输出的是简略信息而 inspect 输出的是详细信息,并以 json 格式输出,可以使用 - f 参数来提取信息。

0X06 自动重启

docker 中的容器,如果挂掉是可以自动重启的,不像是传统的服务,挂掉就直接当机了。

# 不管退出代码是多少,总是在异常的时候重启
[root@iZ28jaak5nnZ ~]# docker run --restart=always --name daemon_dave_hehe -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 当退出代码非0的时候重启,最多重启5次
[root@iZ28jaak5nnZ ~]# docker run --restart=on-failure:5 --name daemon_dave_hehe -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-restart 参数就是用来设置自动重启的,这里的always就是总是重启,而on-failure:5就是当状态码非0时重启,最多5次

0X07 删除 docker

# 这条命令可以删除所有的docker容器
[root@iZ28jaak5nnZ ~]# docker rm `sudo docker ps -a -q` 
# 可以指定名字或者UUID删除特定容器
[root@iZ28jaak5nnZ ~]# docker rm my_first_docker