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 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镜像进入容器
(2)文件的形式添加层:dockerfile
docker rm -f 3d1c37601346 #删除正在工作进程
docker rmi busybox:v1 #清除v1层
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
FROM busybox
ENV hostname server1
WORKDIR /nginx
ADD redis-5.0.3.tar.gz /
VOLUME ["/data"]
RUN touch file1
CMD echo helloworld