1.通过commit构建镜像
1>运行容器
docker ps #查看当前运行的容器
docker ps -a #显示所有的容器
docker rm -f nginx #删除容器nginx
docker rm -f game #删除容器game
docker load -i rhel7.tar #若本地有保存好的镜像,则可以直接导入
docker pull busybox #若没有则需要进行拉取,拉取basybox镜像
2>修改容器
docker history busybox:latest #查看basybox在运行时需要执行什么操作,发现有CMD
CMD表示容器运行时会默认运行的操作
docker run -it busybox #交互式运行
在容器内创建文件,ctrl+d退出,但此时容器已经停止
docker ps -a #可以查看停止的容器
由于运行时没有进行容器的命名,因此在启动时需要使用随机生成的名称或者容器ID
docker start f25154ebb502 #启动容器
docker attach f25154ebb502 #连接容器
快捷键ctrl+p+q #不退出,是容器在后台运行,不会停止
3>将容器保存为新的镜像
保存时,即使容器停止也不影响保存,因为保存的是静态数据
测试时创建的文件是在容器的文件系统中,而不是保存在本地的文件系统中(当前本地文件系统为xhs)
若存储在本地的文件系统,效率较高,而容器层的文件系统的读写效率较差
若应用数据非常庞大,保存在容器的话会导致i镜像非常大,拉取时不方便,会浪费大量的磁盘空间和带宽空间
docker commit f25154ebb502 busybox:v1 #打包提交镜像名称为basybox:v1
docker history busybox
docker history busybox:v1
通过对比发现,v1版在原始的层上面又增加了新的一层,用来保存之前操作的痕迹,是一层一层向上叠加的方式
docker rm -f f25154ebb502 #正在运行的容器删除时,加-f强制,否则需要先停止容器
docker run -it --rm busybox:v1 #使用自己打包的镜像basybox:v1查看容器中的内容,并自动释放容器
发现原先在容器内保存的内容在镜像中存在
在镜像中每一层都是通过commit打包提交而成
2.通过Dockerfile构建镜像
示例1:
1>删除前面构建的镜像和容器
docker rmi busybox:v1 #由于已经将上述实验所产生的容器删除,因此直接删除镜像即可(先删除容器再删除镜像)
2>编写Dockerfile文件
mkdir docker/ #创建空目录
注意不要在根下创建,默认情况下构建时会将创建的目录下的所有数据发送到docker引擎
若在根下创建则会将根下的所有数据发送给docker引擎进行构建
vim Dockerfile #编辑Dockerfile文件
FROM #默认从哪个镜像开始
COPY #拷贝文件,必须在当前目录
3>创建镜像demo:v1
docker build -t demo:v1 . #创建镜像到当前,-t指定镜像名称,会默认从当前读取编写的Dockerfile文件并执行操作
docker images
docker history demo:v1
通过此种方式,可以很清楚的知道在每一层都进行了哪些操作
示例2:
1>编写Dockerfile文件
编辑内容为:
FROM busybox
COPY file1 /
RUN echo hello > file2 #默认会保存在根目录下
2>创建镜像demo:v2
docker build -t demo:v2 .
docker history demo:v2
docker history demo:v1
发现v2是在v1的基础上进行构建, 相同的层进行共享
示例3:
1>编写Dockerfile文件
编辑内容为:
FROM busybox
COPY file1 /
RUN echo hello > file2
RUN echo westos > file3
2>创建镜像demo:v3
docker build -t demo:v3 .
构建时发现相同的步骤都是使用cache,会加速构建过程
docker history demo:v3
在容器中进行测试:
docker run -it --rm demo:v1 #使用容器demo:v1并自动释放
docker run -it --rm demo:v2
docker run -it --rm demo:v3