如果是小白,建议先浏览以下网址,配置好环境创建好镜像再来看我这篇
Docker入门
https://blog.csdn.net/qq_40280582/article/details/107603241
安装docker以及通过容器创建镜像
https://blog.csdn.net/xiaoyuerp/article/details/84642616
CentOS Docker 安装
Docker 支持以下的 64 位 CentOS 版本:
https://www.runoob.com/docker/centos-docker-install.html
-----------------------------------------------------------------
正文开始
docker image ls
命令用于列出所有镜像
docker container ls
命令可以查看当前正在运行的容器
docker container ls -a
可以列举出所有的容器,包括正在运行的和没有运行的容器
STATUS:UP代表容器正在运行,Exited代表容器关闭
image和container的关系解释
这里通俗一点就是
Class Image{
/----------------------------------------------/
}
Image container1 = new Image();
Image container2 = new Image();
Image container3 = new Image();
通过一个镜像,创建三个容器。
详细来说:
- 要有Container首先要有Image,也就是说Container是通过image创建的。
- Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。
- 在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。
- Image 跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。
- Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP。
怎么通过镜像创造容器?答案:
运行容器需要定制具体镜像,如果镜像不存在,会直接下载
#简单操作
docker run 镜像的标识|镜像的名称[:tag]
#常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
#-d:代表后台运行容器
#-p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
#--name 容器名称:指定容器的名称
docker container run -d -p 8080:3000 -it --name dcc repository:tag /bin/bash
docker container run -d -p 8080:3000 -it --name dcc ackh_dcc:v1.1 /bin/bash
我们参考docker image ls 的图片
通过 repostry:tag创造 repostry:tag == ackh_dcc:v1.1
-p 端口映射 8080是本地 3000是docker,简单来说跑的程序是3000端口,装docker的服务器是8080端口,服务器IP:8080可以访问该程序。
-it 命令行映射 /bin/bash 启动后执行的命令 可以是其他命令。
一般都使用镜像名而不是镜像id
ctrl + P + Q
安全退出容器返回服务器,不关闭
通过 docker contain ls -a 一看
我们可以看到新的容器创建了而且状态是运行,这个IMAGE是镜像id,这个容器里面与镜像不相符。
所以我们把它删掉 记住只能删掉非运行状态
docker rm 8e839ddc522e
docker rm containerid
如果容器正在运行
删除容器首先需要关闭容器
docker stop containerid
删除后查看容器
docker container ls -a
已经没了
关闭删除查看三连
如果容器Exited如何重启?
重启容器
docker start containerid
可以看到容器STATUS状态由Exited转为Up
对于STATUS=Up状态的容器想进去执行操作可以输入
docker container exec -it container_ID /bin/bash
docker container exec -it 728d387e0d7c /bin/bash
我们从仓库上拉取到一个镜像后,启动为容器就可以使用了,但是,可能这个容器里面的环境不是我需要的,所以我们需要自己进行定制,例如在里面配置自己需要的环境什么的,配置好之后把这个容器生成一个镜像就可以拿到其他机器上使用了。
根据运行好配置好的环境创建镜像
docker commit -m "镜像标识" -a "作者" 容器id repository:tag
docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1.0
或
docker commit -m "install net-tools and vim" -a "author" 79fab4540315 test_centos
不加tag也可以
docker commit创建镜像命令
-m指定该镜像的描述信息
-a指定镜像作者的信息
79fab4540315为该容器的id
mymysql:v1.0和 test_centos则是生成的新镜像的名称和tag
其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。
等到几分钟,输入命令 docker image ls 可以看到以我们当前全部的操作就这样保存在一个镜像里面啦。
这个镜像有啥用?
答案:
我们制作好镜像后,有时需要将镜像复制到另一台服务器使用。
能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所以如果使用仓库的方式,只能自己搭建私有仓库,这会在另一篇文章中介绍。
如果我们仅仅是要复制到另外少数的服务器,搭建私有仓库显然没有这个必要,而将镜像保存为文件上传到其他服务器再从文件中载入镜像也是一个不错的选择。
所以可以使用Docker save和Docker load命令来存储和载入镜像。
删除镜像
docker中删除images的命令是docker rmi,但有时候执行此命令并不能删除images
docker rmi imageId或者repository:tag
docker rmi andrew
注意:回到之前的问题,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。
所以想要删除运行过的images必须首先删除它的container。
因为我没有用这个andrew创建过任何容器,所以直接删除成功
所以现在andrew这个镜像已经被我删除。
保存镜像为文件
如果要讲镜像保存为本地文件,可以使用Docker save命令。
docker save -o 导出的目录加文件名字(在当前路径则不需要目录) 要保存的镜像(repository:tag)
docker save -o andrew.tar andrew:latest
docker save -o C:\Users\77145\Desktop\andrew.tar andrew:latest
或者将本地的镜像导出
docker save -o 导出的路径加文件名字 镜像id
完成后通过 ls 命令即可看到文件
因为我是用windos的而且当前目录是桌面,所以在桌面生成了。
从文件载入镜像
从文件载入镜像可以使用Docker load命令。
在演示这个示范之前,我先删除这个导出来文件的镜像
仓库名字为andrew
从文件载入镜像
从文件载入镜像可以使用Docker load命令。
docker load --input 目录加文件名字(在当前路径则不需要目录)
docker load --input andrew.tar
或者
docker load < 目录加文件名(在当前路径则不需要目录)
docker load < andrew.tar
等待若干分钟
当时根据容器打包成镜像的文件已经还原为镜像,镜像id也是一样。故意放完整过程让大家看,删除的镜像,从文件中重新生成,这个镜像文件就像备份一样,可以在任何装有docker的机子运行生成这个镜像。只要以这个镜像启动容器就可以运行你配置好所有环境的项目了!
如果用镜像ID保存镜像,虽然不规范,但是有效,但是这种方式导出的镜像名称和版本都是null,需要手动修改
#修改镜像文件
docker tag 镜像id 新镜像名称:版本
docker tag <IMAGE ID> <repository>:<tag>
希望能给个赞或评论。