Docker镜像
1、镜像的分层结构
(1)共享宿主机的kernel
base镜像提供的是最小的linux发行版。
同一个docker主机支持运行多种linux发行版。
采用分层结构的好处是镜像之间可以共享资源。

docker pull  nginx:1.16
docker history nginx:1.16
docker history nginx:latest 	#第二个镜像下载速度快,和第一个有

很多相同资源共享。

docker rmi nginx:1.16			#删除只删除不同的部分。

(2)copy-on-write可写容器层
容器层以下所有镜像层都是只读。只有container为读写功能。修改数据时会将修改的数据写到容器层。
docker从上往下依次查找文件。
容器层保存镜像变化部分,并不会对镜像本身进行修改。
经镜像层数尽量减少(最多127层)

2、镜像的构建
(1)docker commit三部曲:
运行容器。
修改容器。
将容器保存为新的镜像。
效率低,可重复性弱,容易出错。且安全性低。

docker load -i 			#导入已经下载好的镜像
docker ps				#显示运行镜像
docker ps -a    		#显示所有镜像

docker desktop 镜像容量 docker镜像层数_数据

docker history busybox:latest
docker run -it busybox				#运行
docker attach +id					#重新链接进入
ctrl+p+q							#退出不退容器
docker commit +id +名称:v1(版本,原始上追加一层)
docker commit 0c63432ee56e busybox:v1
docker history busybox:v1			#查看
docker run -it --rm busybox:v1		#通过v1镜像进入容器

docker desktop 镜像容量 docker镜像层数_nginx_02


(2)文件的形式添加层:dockerfile

docker rm -f 3d1c37601346	#删除正在工作进程
docker rmi busybox:v1		#清除v1层

docker desktop 镜像容量 docker镜像层数_运维_03

docker build -t demo:v1 .
docker images			#查看都有哪几层
docker history demo:v1		#查看每一层具体内容
docker run -it --rm demo:v1	#运行完后立即删除

docker build -t demo:v2 .	#改变了就在v1上面加了一层
docker run -it demo:v2

3、dockerfile命令详解:
(1)FROM:
指定base镜像,如果本地不存在会从远程仓库下。
(2)MAINTAINER
设置镜像的作者或者邮箱。
(3)COPY
把文件从build context复制到镜像中。
支持两种格式:

COPY src dest 和COPY ["src","dest"]

并且src必须在build context所在的文件目录中。
(4)ADD
与COPY类似,不同的是可以归档压缩文件,会自动拷贝到镜像中

ADD redis-5.0.3.tar.gz /
docker build -t demo:v1 .
docker run -it --rm demo:v1 
ls						#查看自动解压在根目录下。

(5)ENV
设置环境变量,可以被后续的指令使用。

ENV hostname server1

(6)EXPOSE
暴露运行服务端端口
(7)VOLUME
申明数据卷,指定数据挂载点。

VOLUME ["/data"]
docker build -t demo:v2 .
docker history demo:v2 
docker run -it demo:v2
cd data/
touch file1
docker inspect 5170eaa9831b
cd /var/lib/docker/volumes/466af2dc6f90075d4b7827d56b0e3f6c14888c37108428d6d00f6d69af8a4346/_data

容器内删除后宿主机也不存在。

docker volume prane	#删掉未挂载的无用卷。

(8)WORKDIR
指定设置镜像中的当前工作目录,不存在会自动创建。

WORKDIR /nginx

workdir创建命令并且进入后直接在定义的目录。

(9)RUN

在容器内运行命令并创建新的镜像层,常用于安装软件包。

(10)CMD和不可以

设置容器启动后执行的命令,CMD可以覆盖,ENTRYPOINT

docker desktop 镜像容量 docker镜像层数_数据_04

docker desktop 镜像容量 docker镜像层数_数据_05

FROM busybox
ENV hostname server1
WORKDIR /nginx
ADD redis-5.0.3.tar.gz /
VOLUME ["/data"]
RUN touch file1
CMD echo helloworld