docker最底端是一个引导文件系统,即bootfs。nginx
第二层是root文件系统rootfs,位于引导文件系统之上。git
在传统的Linux引导过程当中,root文件系统会最早以只读的方式加载,当引导结束并完成了完整性检查以后,它才会被切换为读写模式。可是在docker里,root文件系统永远只能是只读状态,而且docker利用联合加载技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,可是在外面看起来只能看到一个文件系统。联合加载将各层文件系统叠加到一块儿,这样最终文件系统会包含全部底层的文件和目录。web
docker将这样的文件系统成为镜像。一个镜像能够放到另外一个镜像的顶部。位于下面的镜像成为父镜像,最底部的叫作基础镜像。docker
当docker第一次启动一个容器时,初始的读写层是空的。当文件系统变化时,这些变化都会引用到这一层上。好比,若是想修改一个文件,这个文件会从该读写层下面的只读层复制到读写层。该文件的只读版本依然存在,可是已经被读写层中的该文件副本所隐藏。这种机制被成为写时复制。ubuntu
docker images #查看全部的docker镜像
本地镜像都保存在/var/lib/docker下,全部的容器都保存在/var/lib/docker/containers缓存
docker pull ubuntu #拉去镜像
docker run -it --name 容器名称 ubuntu:12.04 /bin/bash #能够给镜像加上版本
镜像分用户镜像和顶层镜像。bash
docker images fedora #查看指定的镜像列表
docker search puppet #查找指定的镜像
构建镜像ui
docker login #登陆(国内访问docker hub好慢啊)
docker commit 本地容器ID 用户名/容器名 #提交
commit 还能够附带一些别的参数。blog
这本书里并不推荐使用docker commit的方法构建镜像。it
使用Dockerfile
Docker 大致按照以下流程执行Dockerfile中的指令。
docker build -t="用户名/镜像名" #基于Dockerfile构建容器
也能够经过git仓库源地址指定Dockerfile的位置。
若是构建出错,能够经过docker run 命令来基于此次构建到目前为止已经成功的最后一步建立一个容器。
--no-cache 避免使用缓存
docker history 镜像ID #获取镜像的构建历史
Docker 能够在宿主机上随机选择一个49000-49900的一个比较大的端口号来映射到80端口上。
能够经过docker port 容器ID 新的端口号 命令来设置端口映射
也能够在运行docker run 时指定 -p 宿主端口:容器端口
docker run -d -p 8080:80 --name static_web username/image \
nginx -g "daemon off" #这一句不是太懂,对nginx不是太了解
-p 也能够将端口绑定到特定的IP地址上,如 -p 127.0.0.1:8080:80
-P 能够将容器中EXPOSE的端口所有公开