docker 学习(一)镜像和镜像的构建Dockerfile
docker学习
概述
- 诞生时间:2013年
- 编写语言:go
- 目标:实现轻量级操作系统虚拟化解决方案。
- 基础是Linux容器(LXC)等技术。
- 与传统虚拟化的区别:
在任何地方开发、部署和运行任何应用
Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。
docker 组件
- docker engine 基于虚拟化技术的轻量级并且功能强大的开源引擎管理工具。
- docker hub 分享管理images尽享的SaaS服务
为什么选择docker
- 快速交付应用程序
- 部署快
- 依赖少
- 易迁移
- 省资源
- 快速构建轻松管理
镜像
镜像概述
- docker 镜像又文件系统叠加而成,低端是一个引导文件系统bootfs,用户不会跟引导文件系统又交互,当容器启动后,就会被移到内存中,引导文件系统就会被卸载。
- 第二层是rootfs,可以是操作系统。docker里rootfs永远是只读状态
- 镜像存在只读层,不会改变
- 父镜像:每个镜像都可能依赖有一个或多个下层组成的一个镜像,下层就是上层的父镜像
- 基础镜像:没有父镜像的镜像就是基础景象
- 镜像id:所有镜像都通过一个64位十六进制字符串内部是256bit的值来标识,为了简化使用,前12个字符组成短id。
获取镜像
docker pull命令从仓库获取镜像,默认仓库源是docker官方源,为了加快速度,可以使用其它源地址:
docker pull http://localhost:5000/ubuntu:18.04
最常用的是更换docker默认源为国内源:
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
重启docker即可使用
列出本地镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.52:5000/centos latest 7a5530ef979d 5 days ago 4.75 GB
centos lnmp2 7a5530ef979d 5 days ago 4.75 GB
127.0.0.1:5000/centos latest 7a5530ef979d 5 days ago 4.75 GB
192.168.100.52/centos latest 7a5530ef979d 5 days ago 4.75 GB
id相同的镜像是同一个镜像
tag用来标记同意仓库的不同镜像
使用docker run 启动镜像的时候,如果不指定具体的tag。怎会启动最新latest
构建镜像
一般来说不是真正的创建新镜像,而是基于一个已有的基础镜像,如ubuntu,centos等构建新镜像而已。
1.可以从已有镜像上更新,也可以基于本地系统创建
修改已有镜像
先使用镜像启动容器,然后进入容器进行修改,修改完成后退出容器,用docke commit 命令进行提交更改后的容器副本,
提交
docker commit
选项:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
2.Dockerfile和docker build构建镜像:
- Dockerfile使用的是DSL语法。docker build基于Dockerfile里面的指定进行构建镜像。
- 创建一个空目录,并新建Dockerfile文件
mkdir -p /home/docker-web && cd /home/docker-web && touch Dockerfile
vim Dockerfile
#注释
FROM ubuntu:14.04 #指定一个基础镜像,FROM要大写
MAINTAINER #镜像作者以及联系方式
RUN #RUN命令会在当前镜像中运行指定命令。比如:
RUN yum -y install apache
默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c来执行,不支持shell用exec格式的RUN
RUN [ "yum","-y","install","apache"]
EXPOSE指定需要打开哪些端口
构建镜像
docker build -t="centos/apache:v1 ."
-t
选项为镜像指定仓库和镜像名字。
.
指定在当前目录中指定Dockerfile
也可以指定一个git仓库源地址
构建每一步都会有id,如果构建出错,进入前一步骤的id进行调试,然后再次构建。
- Dockerfile和构建缓存
由于每步过程都会提交为镜像,最终镜像之前的镜像就可以看作是缓存,如果构建失败对某一步骤进行调试,前面几步没有改动,会在有修改的步骤开始进行构建。
不需要构建缓存时,用--no-cache
参数
- 基于缓存构建Dockerfile模板
构建缓存的好处是,可以实现简单的Dockerfile模板,,比如在Dockerfile文件顶部增加包仓库或者更新包,尽可能命中缓存。
- ENV指令为环境变量,由于镜像的层次文件系统,环境变量在后续的层次中被引用。当容器启动后,在容器可以通过env命令查看环境变量。
ENV DIR=/usr/local/
WORKDIR $DIR
ENV创建的环境变量会持久的保存到从此镜像创建的任何容器中,也可所以使用docker run -e
参数指定环境变量,只在启动时有效
- RUN命令是构建容器时所需要运行的命令
- CMD是在容器运行时,需要运行的命令,将要运行的命令放在一个数组结构中例如:CMD ["bin/bash","ls"]
, 如果不加数组结构,docker会在命令前加上/bin/sh -c
- 启动容器时docker run命令可以覆盖CMD
- Dockerfile中只能指定一个CMD命令。多个CMD只会执行最后一个
- ENTRYPOINT指令与CMD相似,区别:docker run会覆盖CMD命令,但是不能覆盖ENTRYPOINT命令。如需覆盖在启动时市容docker run --entrypoint
- WORKDIR指令从镜像创建容器时,在容器内设置一个工作目录,指定ENTRYPOINT和/或者CMD、RUN、COPY、ADD指令的工作目录,如果不存在,就会创建。可以多次设置。在启动容器时,用docker run -w
参数进行覆盖。
- USER指令用来指定该镜像会议什么用户运行。启动时用docker run -u
参数进行覆盖。默认为root。
USER user
USER user:group
USER uid:gid
USER uid:group
- VOLUME指令基于镜像创建的容器添加卷,
VOLUME ["/data/mysql","data"]
- ADD指令将构建环境下的文件和目录复制到镜像中,
ADD passwd /etc/passwd
将本地构建目录下的passwd复制到镜像中/etc/passwd。可以是一个url,或者构建上下文文件或者目录,不能是构建目录意外的文件。docker通过末尾的/判断是目录还是文件。添加url示例:ADD http://www.baidu.com/123.zip /home/baidu.zip
当ADD的文件是本地归档文件。会自动解包。ADD baidu.zip /home/
会自动解包,如果存在目标文件或目录,不会被覆盖,自动解压支支持本地归档文件,不支持url。如果目标路径不存在则会自动创建 - COPY指令与ADD类似,区别是COPY只是在构建上下文中复制本地文件,不会提取和解压,本地文件与Dockerdile同一路径。目标位置必须是是容器内的一个绝对路径。任何由该指令创建的文件uid和gid都是0
- ONBUILD指令是Dockerfile文件中的触发器,并不会在基于此Dockerfile构建镜像中生效,当基于此父镜像构建子镜像时,才会触发生效。孙子镜像不能触发,onbuild不能执行FROM、MAINTAINER、和ONBUILD本身
- EXPOSE指令是告诉docker该容器内部的应用程序会使用容器的指定端口,