业余用了好久docker,最近打算再好好学习下。
《第一本docker书》
- docker默认用户组是docker,可以不用输入sudo。
sudo docker attach <docker id>
,附着到交互式docker的会话。- 有交互式运行容器(interactive container),也有守护式容器(daemonized container)。
docker exec
命令在容器内部额外启动新进程,可以在正在运行的容器中进行维护、监控及管理任务。docker stop
命令会向Docker容器进程发送SIGTERM
信号,– -docker kill
发送SIGKILL
信号。docker inspect
获得详细容器信息。- 本地镜像都保存在Docker宿主机的/var/lib/docker目录下。docker联合文件系统,docker文件系统分析,容器保存在/var/lib/docker/containers。
- Docker Hub有两种类型仓库:用户仓库(user repository)和顶层仓库(top-level repository)。用户仓库的命名为”用户名/仓库名”。顶层仓库由Docker公司和由选定的能提供优质基础镜像的厂商管理。个人认证信息将保存在$HOME/.dockercfg文件中。
- Dockerfile执行流程:
- 从基础镜像运行一个容器;
- 执行一条指令,对容器进行修改;
- 执行类似
docker commit
的操作,提交一个新的镜像层; - Docker再基于刚提交的镜像运行一个新容器;
- 执行Dockerfile中的下一条指令,直到所有指令都执行完毕。
(所以最好多条指令合并到一个RUN
中)
- 可以在
docker build
中指定Dockerfile所在git仓库地址。构建上下文根目录如果有.dockerignore,可以设置不被上传到构建上下文中的文件。docker build过程默认有缓存,–no-cache可以忽略。 docker history
查看镜像如何被构建的。docker run
的-p
参数可以对外公开Dockerfile中EXPOSE
参数指定的端口,随机绑定到宿主机的49000~49999端口。- docker file 指令:
- CMD。用于指定一个容器启动时要运行的命令。
docker run
中指定的命令,会覆盖Dockerfile中的CMD命令。如果指定多个CMD指令,只有最后一条会执行。 - ENTRYPOINT。
docker run
命令行指定的任何参数都会被当作参数再次传递给ENTRYPOINT
指令中指定的命令。CMD和ENTRYPOINT组合妙用:ENTRYPOINT指定运行的命令,CMD指定命令参数。如果确实需要可以在docker run
中加--entrypoint
参数。 - WORKDIR。容器内部的工作目录。
- ENV。新的环境变量可以在后续的命令中使用。
-e
参数运行时指定。 - USER。运行的用户身份,
-u
参数运行时覆盖。 - VOLUME。卷功能让我们可以将数据(如源代码)、数据库或者其他内容添加到镜像中而不是将这些内容提交到镜像中,并且允许我们在多个容期间共享这些内容。
- ADD。文件源也可以使用URL格式。如果是归档文件,会自动解压缩,已经存在的解压缩目录不会被覆盖。ADD命令会使构建缓存变得无效。
- COPY。不会提取和解压。源路径要相对于当前构建路径,目的路径需要绝对路径。目标位置不存在会自动创建。
- ONBUILD。当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。按照父镜像中指定的顺序执行,并且只能被继承一次(防止Dockerfile构建过程的递归调用问题)。
- CMD。用于指定一个容器启动时要运行的命令。
- 部署自己的docker registry
- 安装docker时会创建一个名为docker0的网络接口,每个docker容器都会在这个接口上分配一个IP地址。docker默认使用172.17.x.x作为子网网络,如果这个子网被占用,会尝试在172.16~172.30创建子网。接口docker0是连接宿主机和docker的虚拟网桥,每创建一个容器就会创建一组互联的网络接口,其中一端作为容器里的eth0接口,另一端命名类似vethec6a作为宿主机的一个端口。Docker创建的虚拟子网由宿主机和所有docker容器共享。
- 配置防火墙规则和NAT规则,允许容器和宿主机路由。高级网络配置
- 为了避免容器内应用ip的硬编码,可以使用
--link
参数创建两个容器间的父子连接。通过把容器连接在一起,可以让父容器使用别名访问子容器。 - 对于只用一次的容器,可以指定
--rm
参数。