这篇文章是我看书的一点笔记,内容很简单,并且不会介绍任何 docker 的具体实现。本文只介绍 docker 的各种状态,并希望结合这些状态让读者能够理解而不是揣测 docker 的命令。
Review: Docker State Machine
通过 docker --help
和查文档来操纵 docker 是肯定行之有效的, 背 api 听上去也不是一个很明智的选项,但是想必对这个状态机有一定了解能够有助于你不执行一些错误的指令,比如对某个 running 中的 container rmi 或者 rm, prune container 觉得万事大吉了之类的。
本文会介绍:docker 的状态机和使用入门。
本文不会介绍:如何高效使用 docker, docker 的 best practice, dockerfile 相关的内容,docker 的原理
docker run
image -> container
docker stop/start/restart
container 状态更新
docker rm/rmi
- docker rm 针对 container 而言,如果 running 的你可能需要 --force
- https://docs.docker.com/engine/reference/commandline/rmi/ docker rmi 针对 image 而言
docker create
- 类似 build / create
无关状态机的操作
docker attach
连接到正在运行的 容器,直接 stdio
注意上面是 stdio, 其实我觉得你可能还想要下面的:
docker exec -it container_name /bin/bash
这个我觉得也很清晰
docker inspect
查看内部信息
docker ps
查看容器
docker events # 查看系统日志
docker history # 对 image 查看历史版本的命令
docker logs # 运行日志
如果你想 start 的 时候限制 docker container 的资源,可以看看下面:
Runtime options with Memory, CPUs, and GPUsdocs.docker.comsample
我们试着做一个主从备份的 redis:
docker run --name redis-master redis
docker run --name redis-slave1 --link redis-master:master redis
docker run --name redis-slave2 --link redis-master:master redis
然后 docker ps
➜ ~ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cfebd23b135a redis "docker-entrypoint.s…" 2 minutes ago Up 14 seconds 6379/tcp redis-slave2
2190da08125a redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp redis-slave1
61cfd85bc0a8 redis "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp redis-master
可以看到:
➜ ~ docker inspect -f "{{ .Mounts }}" 2190
[{volume e5a9586f14dc682c4496a062792166fc6c0a11b7189c45d8d77126ac2d76cce5 /var/lib/docker/volumes/e5a9586f14dc682c4496a062792166fc6c0a11b7189c45d8d77126ac2d76cce5/_data /data local true }]
这个时候需要手动打到 redis-slave1 上去查看,如果你查看 /etc/hosts :
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 master 61cfd85bc0a8 redis-master
172.17.0.3 2190da08125a
这个时候,如果没有挂载 Volume 的话,我们大概是需要手动去复制到这个地方。