
本篇能让你了解到基于容器制作镜像并把镜像上传到docker hub上docker采用分层构建机制最底层为bootfs是用于系统引导的文件系统容器启动完后会被卸载以节约内存资源最底层的称为基础镜像base image最上层为可写层其下的均为只读层启动容器时docker daemon默认从本地获取镜像本地不存在时从Registry中下载镜像并保存到本地用户可自建私有Registry,也可使用官方的Docker Hub也可使用第三方的Registrydocker官方制作了很多基础镜像如centos、ubuntu等用户在这些基础镜像上制作自己的镜像上传且公开到docker hub制作镜像有几种方式1.Dockerfile使用docker build命令制作2.基于容器制作使用docker commit制作本篇将使用此方式做镜像3.docker hub automated builds 用户把Dockerfile文件上传到github再让docker hub监控github上Dockerfile文件的变化然后自动构建镜像也是第一种方式基于Dockerfile的实现下面将基于容器制作镜像需要先启动一个容器然后使用docker commit 命令做成镜像以busybox作为基础镜像启动成容器并进入容器的shell窗口中创建一个html启动一个httpd服务把处于此状态的容器做成一个镜像运行该镜像时就会自动运行httpd服务语法docker commit [options] CONTAINER [REGPOSITORY[:TAG]]1.下载busybox镜像docker pull busybox2.让容器处于启动状态docker run -it --name b1 busybox3.-it 会默认进入 /bin/bash 窗口创建一个目录和html文件mkdir -p /data/html vi /data/html/index.html 输入 h1Busybox httpd server./ h14.再开一个linux连接终端使用 docker commit -h 查看制作镜像的帮助文档5.做镜像 docker commit -p b1 (引用b1容器让b1容器处于暂停状态)6.查看刚制作的镜像docker image ls发现 repostory 与 tag 都为none因为制作时没有设置repository和tag7.给容器打标签docker tag imageId 645906265/httpd:v0.1 (因为没有repostory所以使用 imageId为容器名)还可以再打个新标签docker tag 645906265/bbhttpd:v0.1 645906265/httpd:v0.2 有repostory:tag就用8.删除镜像时如果它有多个tag标签则只会删除当前标签的引用直到是最后一个引用时则删除镜像docker image rm 645906265/httpd:v0.29.启动刚刚制作的容器 docker run -it --name b2 645906265/httpd:v0.1 验证有没有刚刚创建的目录与html文件10.基于b1容器再次制作镜像docker commit -p -c ‘CMD [“/bin/httpd” , “-f” , “-h /data/html”]’ b1 645906265/httpd:v0.3 启动容器时要默认执行一段命令可使用 -c 命令注入一段CMD指令11.运行镜像docker run --name b3 645906265/httpd:v0.3 查看容器docker inspect b3找到IPAddress 通过 curl 该IPAddress 可访问html 页面12.把制作好的镜像push到 docker hub 供他人使用先在hub.docker.com上登录https://cloud.docker.com/repository/list 然后创建一个 repository创建时默认有登录账户作为前缀name为httpd和打包的repository:tag一样如果没有账户需要注册一个13.推送镜像使用 docker push --help推送前先要登录docker login --help14.登录docker hubdocker login -u 645906265 回车输入密码成功后会提示 Login Succeeded15.推送docker push 645906265/httpd 不加标签推送会把所有刚刚创建的都推送到docker hub上如果推送时指定标签则只推送这个镜像16.退出登录docker logout17.把镜像本地打包成压缩包然后分发到其他服务器上还原到docker中把两个镜像打包docker save -o myimages.gz 645906265/httpd:v0.1 645906265/httpd:v0.3复制到其他主机上scp myimages.gz node02:/root/node02上如果装了 docker ,使用 docker load -i myimages.gz 命令把刚刚打包的镜像文件载入本地docker容器运行必须有一个前台进程 如果没有前台进程执行容器认为空闲就会自行退出在hub.docker.com 上搜索 645906265/httpd 就可以搜索到刚刚推送的镜像其他人可以pull下载使用了下一篇云原生应用4Dockerfile制作镜像