项目背景
背景:要求把公司的静态网页部署在docker容器上,并且将容器打包交给运维人员
踩到的坑:没有弄明白export和save的区别
操作步骤
方法1,利用Dockerfile制作镜像[推荐直接看这里]
制作模板
下载基础模板
>* sudo docker pull nginx
准备html
>在index同层目录下建立Dockerfile
>* sudo gedit Dockerfile
>FROM nginx:latest
COPY . /usr/share/nginx/html
打包生成镜像
生成镜像
>* sudo docker build -t html:1.0 . 【html:1.0为指定的镜像名:tag】
运行docker容器
- sudo docker run -p 8080:80 -d html:1.0
检查结果:
- 浏览器:localhost:8080
导出镜像
- sudo docker save html > html.tar
使用镜像
导入镜像
- sudo docker load < html.tar
方法2:[累赘, 不要看]
制作镜像模板
下载nginx容器
- sudo docker pull nginx
可以看出镜像是一层一层下载的,这验证了镜像其实是个千层饼,是一层一层叠加的
开启容器
- sudo docker run -p 8080:80 -d nginx //将80端口映射为8080,或者80:80还是原先的80端口,不可以不写。
- netstat -anp | grep 8080 //端口已经开启了
- sudo docker ps
将html导入/usr/share/nginx/html目录
- sudo docker cp demo/ 264f32137ad0:/usr/share/nginx/html
- 【备注:demo目录下保存的是html文件】
- sudo docker exec -it 264f32137ad0 bash
- 【另一种写法:sudo docker exec -it 264f32137ad0 /bin/bash】
- 将原来html下面的所有文件删除,将demo下载的静态文件移动到html目录下载
- 打开浏览器,输入localhost:8080就可以看到html静态网页了
- exit
使用save制作镜像
提交修改的容器,并生成新的镜像
- sudo docker commit 264f32137ad0 nginx
- sudo docker images
导出镜像
- sudo docker save nginx> newnginx.tar
【另一种写法:sudo docker save -o newnginx.tar nginx】
【备注:nginx是容器名字,可以用容器ID代替】
使用刚刚制作的镜像
导入镜像
环境:一台新的ubuntu上
- sudo docker load < newnginx.tar
【另一种写法:sudo docker load --input nginxv1.tar】
备注:导入容器时可能会有权限问题,这时候:sudo chmod 777 newnginx.tar
如果想重命名镜像:
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
开启容器并且浏览器查看
- sudo docker run -p 8080:80 -d nginx
- 打开浏览器,输入localhost:8080就可以看到html静态网页了
- sudo docker inspect nginx 【查看所制作的镜像的信息】
发现修改的配置文件依然存在
出错的步骤
因为没有弄清楚save和export的区别,第一次我是使用export方法导入导出的,但是发现不能监听端口时会出错。
制作镜像
- sudo docker container ls -a
- sudo docker export bcad5b323e6c > niginxv2.tar
【备注:导出镜像,bcad5b323e6c是镜像ID】
导入镜像
- sudo cat niginxv2.tar | docker import - niginx:v2
【将容器快照niginxv1.tar导入为镜像,并且指定镜像名字叫做niginx:v1 】
解决:
- sudo -i 【切换到root用户】
- cat niginv2.tar | docker import - niginx:v2
- su - ocean 【切换到普通用户】
- sudo docker images
运行容器
- sudo docker run -p 8080:80 -d niginx:v2
docker: Error response from daemon: No command specified.
See ‘docker run --help’.
错误原因:
1、没有cmd命令,即使加上了bash,但是在浏览器不能查看设置的静态网页
2、查看export设置的详细信息
- sudo docker inspect niginx:v2
3、我进入import导出的镜像,发现我刚刚导入的html文件还在。
总结:采用export制作的镜像,它的配置信息什么的不见了。
推测:docker export的应用场景主要用来制作基础镜像
总结:save VS export
- save是持久化镜像,export是持久化容器
- sudo docker save 镜像ID或者镜像名字 > 保存名字.tar
- sudo docker export 容器ID或者容器名字 > 保存名字.tar
- docker load载入镜像存储文件,docker import导入容器快照,但是两者都会恢复为镜像
- docker load不能对载入的镜像重命名,docker import容器快照文件导入时可以重新指定标签
*容器快照文件将会丢弃所有的历史记录和元数据信息[仅保存容器当时的快照状态],而镜像存储文件将保存完整记录。