docker engine
包含client和daemon,client(如docker
命令)通过restful接口与daemon通讯
daemon管理着3种资源: - image,只读,分层,是程序运行的“源文件” - registry,保存image的地方 - container,在隔离用户空间运行的程序
注:docker machine用来设置运行着engine主机,以后不用了,用docker Mac代替
docker image
union mount
把许多filesystem一层层mount到一起。container在启动装载了image的所有层后,在最上面会再mount一层可读写filesystem,我们要container执行的进程将在这一层执行。
读写层初始是空的,当我们修改文件时,文件会从下面的只读层拷贝到读写层。初始的只读文件依然存在,但被上面的读写层拷贝所隐藏。这就是所谓的copy on write
。
docker images
image列表
docker rmi <image>
删除image
通过Dockfile构建image
Dockfile
执行每条命令都相当于:给image添加一层,docker commit
提交新image,从新image运行新container
docker build -t <image-name>
根据Dockfile
构建image
docker volume
volume是绕过了union mount
机制的指定目录,使数据保存功能可以独立于容器。
docker run -v <host-dir>:<container-dir>[:<rw-mode>]
用-v
选项指定volume对应着主机的哪个目录
还有一种用法叫docker volume container,docker run -v <container-dir>[:<rw-mode>] --name=<volume-container-name>
,不用知道也无法知道数据存在主机的哪个目录,其他容器通过docker run --volumes-from=<volume-container-name>
使用该volume。即使所有使用该volume的容器都删除了,volume依然存在。
疑:说无法知道数据存在主机的哪个目录,因为用docker inspect <volume-container>
查到的对应目录在主机上竟不存在?
docker networking
把多个容器加入同一网络就可通信,默认网络是网桥模式。当容器创建时,会在容器端和主机端创建一对虚拟接口,相当于管道的两端,一端是容器的网络接口,一端插入主机的默认网桥。
同一网络中的容器通过容器名和端口号通信。因为docker会自动修改所有容器的/etc/hosts
文件,把容器名映射到容器的虚拟内网ip。或者也可在运行docker run -h <host-name> ...
时指定主机名。
docker network create <network-name>
创建网络,然后docker run --net=<network-name> ...
运行容器或docker network connect <network-name> <container>
把已有容器加入网络
docker network inspece <network-name>
查看网络元信息
docker orchestration
orchestration(编排)指管理多个容器,编排工具有docker-compose
、swarm
等
docker-compose
在docker-compose.yml
中配置应用的组件(如images, volumes, links等),然后docker-compose up
运行。或着docker-compose up -d
来daemon化,然后docker-compose ps
查看容器,docker-compose logs
查看日志。
swarm
把多个docker主机合成一个对外的虚拟主机
常用docker命令
docker run
docker run -i -t ubuntu /bin/bash
打开终端,-i
interactive,-t
tty
docker run -d ubuntu /bin/sh -c "..."
daemon方式运行,用docker stop <container>
停止,docker start <container>
启动,docker attach <container>
再登录
docker run --name=<container-name> ...
给容器命名
docker run -p 8080:80 …
主机端口8080 -> 容器端口80,docker run -d -p 80 ...
主机[32768,61000]随机端口 -> 容器端口80,用docker port <container> <container-port>
查看对应的主机端口
docker run -P ...
把容器用到的端口映射到主机的相同端口
docker run --rm ...
运行完就删除的一次性容器
docker ps
docker ps
(容器列表:正运行的),docker ps -a
(正运行或未运行的),docker ps -l
(上次运行的)
docker inspect
docker inspect <container>
查看容器元信息
docker logs
docker logs <container>
查看容器运行输出,docker logs -f <container>
类似于tail -f
命令
docker top
docker top <container>
类似于top
命令
参考
- 后端的轮子(四)— 容器
- 《The Docker Book》by James Turnbull i.e.《第一本Docker书》