一:基于容器做镜像
默认从dockerHUB上拉取busybox镜像
[root@localhost ~]# docker pull busybox
启动容器。
[root@localhost ~]# docker run –name busybox-test -it busybox /bin/sh
- -i: 交互式操作。
- -t: 终端。
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
/bin/sh可写可不写,因为此容器镜像默认运行的就是/bin/sh。另外打开一个ssh窗口查看已经启动的容器。
查看容器当前目录情况,且在当前容器下创建目录文件并在此目录下创建一个网页文件。
这个过程容器需在运行状态我们不能退出关闭容器,(如果我们下次启动busybox这个容器,刚才的创建的文件及改变的内容肯定不会有的)如果我们期望把刚才改变的内容改变的结果保存起来,我们就需要基于运行的容器来做镜像
基于容器做镜像
[root@localhost ~]# docker commit -p busybox-test
- -P:这里的 -p 是暂停容器的意思 基于busybox-test这个容器做的镜像
这个镜像REPOSITORY(仓库)和TAG( 标签)只有一个ID,为了后面引用方便我们需要给镜像打上标签。
给镜像打上标签(一个镜像可以有多个标签)
[root@localhost ~]# docker tag 096dbf4680a2 jchj/httpd:v0.1
jchj/httpd:v0.1 jchj是指的是dockerHUB用户账号名称
httpd:仓库的名称
v0.1:镜像版本
再次查看镜像
[root@localhost ~]# docker image ls 或 docker images
一个镜像能打多个标签如再次给此镜像打上第二个标签,观察此镜像ID是一样的。
latest:最新版
[root@localhost ~]# docker tag jchj/httpd:v0.1 jchj/httpd:latest
[root@localhost ~]# docker image ls
此时如果我想要删除一个标签也只是删除了一个引用,并不会删除镜像,就像是删除了一个硬链接一样,只是删除了它的引用路径,并不会删除文件。
删除操作:
[root@localhost ~]# docker image rm jchj/httpd:latest
再次查看已经没有此jchj/httpd:latest此镜像了。
如何在做镜像时同时也打上标签。
镜像定义了基于此镜像启动容器时默认要运行的程序。
如查看已经启动的busybox镜像
[root@localhost ~]# docker inspect busybox
查看下nginx镜像的默认运行的程序
[root@localhost ~]# docker inspect nginx
查看下centos镜像的默认运行的程序
[root@localhost ~]# docker inspect centos
如上我们基于busybox创建的jchj/httpd:v0.1镜像,默认启动容器时运行的命令依然时busybox的/bin/sh
(容器一定是基于某个镜像启动的)在基于这个容器创建新镜像时期望这个镜像默认运行的命令不再是原来的镜像的默认命令,也就是在基于这个容器创建新的镜像时改变其默认运行的程序。
例如:进入基于此jchj/httpd:v0.1镜像启动的容器,基于此容器的制作新镜像时默认启动的不再是/bin/sh而是httpd
[root@localhost ~]# docker run -it jchj/httpd:v0.1
[root@localhost ~]# docker commit -a “jchj <jchj.shop>” -c ‘CMD [“/bin/httpd”,”-f”,”-h”,”/data/html”]’ -p vigilant_booth jchj/httpd:v0.2
- -a:注明作者
- -c:修改CMD的命令,这里CMD一定要是大写。
- -p:这里的 -p 是暂停容器的意思,基于vigilant_booth这个容器制作名为jchj/httpd:v0.2的镜像
基于vigilant_booth容器制作的新镜像默认运行的程序是httpd
再基于jchj/httpd:v0.2这个镜像启动一个容器看看默认启动程序是不是httpd
[root@localhost ~]# docker run –name tt -itd jchj/httpd:v0.2
[root@localhost ~]# docker ps(也可使用命令docker container ls)
[root@localhost ~]# docker inspect tt
[root@localhost ~]# docker inspect tt 查看容器,一个微型的web服务器就运行起来了。
[root@localhost /]# docker rename jms_web jms_http
二:本地镜像推送至容器仓库
这里选择的是阿里云容器仓库,当然你也可以推送至dockerHUB仓库、自建的容器仓库或其它第三方容器仓库。
这以阿里云的仓库为例:选择“容器镜像服务”个人实例-个人版
以jchj-shop找个容器仓库为例:点击jchj-shop仓库的管理,看查看此仓库的使用。
首先需要登录容器仓库:
[root@localhost ~]# docker login –username=aliyunXXXXXXX registry.cn-zhangjiakou.aliyuncs.com
查看需要推送至仓库镜像的ID并打赏标签。
推送至阿里云仓库:
查看推送至阿里云容器仓库的镜像:
注:在同一个局域网内如果不希望docker镜像上传至仓库后再在另外的docker主机pull到本地,其实也可以直接在本地打包后再复制到远程主机上。
打包本地镜像:
[root@localhost ~]# docker save -o ./shop.gz jchj/httpd:v0.2
传送至10.0.0.200的主机上。
登录10.0.0.200主机安装docker,启动docker加载刚SCP过来的镜像
[root@localhost ~]# docker load -i shop.gz
删除所有已退出的容器
docker rm $(docker ps -q -f status=exited)
删除所有已停止的容器
docker rm $(docker ps -a -q)
删除所有正在运行和停止的容器
docker stop $(docker ps -a -q) docker rm $(docker ps -a -q)
删除所有容器,没有任何标准
docker container rm $(docker container ps -aq)
但是,在1.13及以上版本中,为了完整的系统和清理,我们可以直接使用下面的命令,
docker system prune
所有未使用的容器,图像,networking和卷将被删除。 另外,单独的,即单独的,我们可以使用下面的命令,清理组件,
docker container prune docker image prune docker network prune docker volume prune