Docker学习 (三)镜像
CloudMan的《每天5分钟玩转Docker容器技术》教程笔记
2018.06.01
base镜像
1. 不依赖其他镜像,从scratch构建
2. 其他镜像可以以之为基础进行扩展
例如:
下载centos:docker pull centos
内核空间的文件系统是kernel,启动时会加载bootfs
用户空间的文件系统是rootfs,包含/dev,/proc,/bin等
base镜像提供的rootfs很小,是最小安装的linux发行版
查看当前kernel版本:uname -r
打开并进入CentOS容器:docker run -it centos
验证容器是CentOS:cat /etc/redhat-release
容器只能使用host的kernel,并且不能修改
镜像的分层结构
Docker支持通过扩展现有的镜像来创建新的镜像
分层结构的好处是可以共享资源
可写的容器层(位于顶部),容器层之下的叫镜像层
所有对容器的改动 无论添加删除修改,都只发生在容器层
只有当需要修改时才复制一份数据,这就是copy-on-write。
镜像层是只读的,因此镜像可以被多个容器共享
构建镜像
docker commit
纯手工方法,不推荐
1. 运行容器
2. 修改容器
3. 将容器保存为新的镜像
例子:
docker run -it ubuntu
apt-get install -y vim
在新窗口执行:docker ps查看当前运行的容器
docker commit distracted_sammet ubuntu-with-vi
docker run ubuntu-with-vi
查找vi安装位置:which vi
问题:在安装vim时,输入apt-get install vim时会提示unable to locate package vim
解决:先更新列表:apt-get update
Dockerfile构建文件
vi Dockerfile
"
FROM ubuntu
RUN apt-get update && apt-get install -y vim
"
touch Dockerfile
pwd
ls
docker build -t ubuntu-with-vi-dockerfile .
ubuntu-with-vi-dockerfile是通过在base镜像(ubuntu)的顶部添加一个新的镜像层而得到的
镜像的缓存特性
在Dockerfile中添加一行之后,在创建新的镜像时会调用之前的缓存
如果不使用缓存,则在docker build后加上 --no-cache
调试Dockerfile
某一步骤失败时可以打开上一步的临时docker进行debug
Dockerfile常用指令
FROM 指定base镜像
MAINTAINER 设定镜像作者
COPY 将文件从build context复制到镜像
ADD 与COPY类似
ENV 设置环境变量
EXPOSE 指定容器中的进程监听某个端口
VOLUME
WORKDIR 设置镜像中的当前工作目录
RUN 在容器中执行指定的命令
CMD 容器启动时运行的指定的命令
ENTRYPOINT 设置容器启动时运行的命令
2018.06.01
RUN vs CMD vs ENTRYPOINT
RUN:执行命令并创建新的镜像层
CMD:设置容器启动后默认执行的命令及参数
ENTRYPOINT:配置容器启动时运行的命令
Shell和Exec格式
Shell格式:<instruction><command>
例如:CMD echo "hollo world"
Exec格式:<instruction>["executable","param1","param2",…]
例如:CMD ["/bin/echo","Hello world"]
CMD和ENTRYPOINT更推荐使用Exec格式
如果Dockerfile有多个CMD,只有最后一个CMD有效
CMD中的参数可以在启动时被动态替换掉,而ENTRYPOINT中的参数始终会被用到
分发镜像
使用公共Registry
docker login -u [username]
docker push [username]/httpd
搭建本地Regisry
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2