闲来没事苟着,顺手读读之前买的已经落灰的书《Docker实战》。
1、daemon(守护进程),运行中的 docker 由守护进程(服务端)和客户端组成(通过unix域间套接字通信),比如说,执行:docker ps -a 命令,是客户端将命令传送给守护进程,由守护进程发送对应的响应给前端,前端解析并显示。可以通过如下操作查看docker守护进程和客户端的通信过程:1
2
3
4sudo socat -v UNIX-LISTEN:/tmp/dockerapi.sock UNIX-CONNECT:/var/run/docker.sock
# 其中 socat 是 netcat(nc) 命令的升级版,-v 参数有助于人阅读 address1 address2 可以是 tcp、udp或 socket等
docker -H unix:///tmp/dockerapi.sock ps -a
# -H 参数指定 docker daemon socket(s) to connect to.
两者直接通过 HTTP 通信,客户端解析返回的 json 并显示,运行结果如下:
2、以服务方式在后台运行一个 docker 容器(docker最主要的功能之一),使用 docker run -p *** 命令。不然的话,需要使用类似 nohup docker run *** & 的方式来实现此功能。
3、docker 中的端口映射—将容器的某端口暴露给宿主机的某端口,便于外界访问容器中的功能:1
docker run -p 宿主机端口:容器端口 --name 容器名 使用的镜像名
4、给Docker打标签1
2docker tag IMAGE_ID(镜像id) REPOSITY:TAG(仓库:标签)
docker commit CONTAINER [REPOSITY:TAG]
5、Docker挂载外部卷1
docker run -v 宿主机目录:容器内目录 -it ubuntu /bin/bash
注意一点:镜像中即使存在需要映射的目录,容器的目录也会被建立映射,这意味着容器里映射的目录的原内容将会消失。当然,也可以通过网络映射其他机器上的卷。在容器里运行如下命令即可:1
2
3sshfs user@host_ip:remote_path local_path
卸载
fusermount -u local_path
6、想要在 Dockerfile 构建中从一个指定的点开始失效 Docker 构建缓存,可以:在某条Dockerfile命令后面加个注释,这样,该条命令及其后的指定的缓存就失效了。原理在于 Docker 将非空的更改均当做一行新的命令来对待。
7、bash 里的 “< (命令)” 语法被称为进程替换,它允许把一个命令的输出结果作为一个文件,传给其他命令。
8、解绑容器的同时不停掉它,解决:按下 ctrl + p 然后再按 ctrl + q。
原因:在使用 docker 时,会发现,打开一个交互式 shell,然后因为它是容器的主进程,所以一旦退出会话,容器便会被终止(可以使用 docker attach 再连接到容器)。
9、想要从镜像的分层历史中移除私密信息,解决:基于该镜像创建一个容器,将它导出再导入并打上标签。1
docker export (容器ID) | docker import - (标签)
docker import 会输出一个 文件系统的内容的一个TAR文件, “-”参数指明从标准输入读取 TAR 文件内容。
10、Dockerfile 指令Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。VOLUME: 作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。ONBUILD : 该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。ENTRYPOINT : 用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
11、Dockerfile 的逆向:1
2
3
4
5
6
7
8docker history reverseme | \
awk '{print $1}' | \
grep -v IMAGE | \
tac | \
sed "s/\(.*\)/docker inspect \1 | \
jq -r \'.[0].ContainerConfig.Cmd[2] | tostring\'/" | \
sh | \
sed 's/^#(nop) //'
12、export 和 import 与 save 和 load 的对比
如果要保留镜像的历史,可以使用 load 而不是 import, 这样其历史将在另一边的 Docker 守护进程上得到保留。
13、Docker compose 的使用,可节省大量的命令行操作。
14、使用 Blockade 及 Comcast 对容器网络状况进行控制。
15、多宿主机Docker的部署和编排
- 使用
Helios手动管理多宿主机Docker,涉及Zookeeper技术(一个分布式数据库,用来存储数据,用于Helios主机 和Helios代理之间的通信)。 docker+Swarm- 想要跨宿主机管理
Docker服务,使用Kubernetes。 Mesos+Docker- 使用
Marathon细粒度管理Mesos
16、OpenShift, 应用程序平台即服务(aPaaS)。使用Docker 作为容器技术,并用 Kubernetes 和 etcd 进行编排。一种安全管理的方式,去除用户直接运行docker的能力,同时又保持使用Docker的好处。
17、使用 cAdvisor 监控容器的性能。
18、限制容器 cpu 和 内存 的使用,使用 docker run -c -m 等参数。
19、在 bash 中,$? 给出最后一条执行命令的退出码。
20、strace 是一个工具,它允许嗅探一个进程对 Linux API 所做的调用。