Docker笔记

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 containerdocker 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-composeswarm

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命令

参考