Docker系列学习(二)——查看,启动,退出,保存镜像的方法
docker是我最近工程开发上急需使用的一个开发工具,但是由于本人“深入沉浸”windows系统,并且对于Linux系统不太熟悉,所以学习docker很多困难,因此用这个博客来记录一下很简单的docker的常用操作。本文是以Linux系统为基础,windows系统对于docker的安装太繁琐了,而且有windows版本的限制,强烈推荐使用Linux系统。本文参考了很多博主的经验分享,如果大家要看原文可以到本文底部查看原网站。有众多的docker命令行可以参看官方文档,我也在更新一些常用的docker命令的使用方式,有需要的同学可以查看我的这篇博文Docker系列学习(三)——docker镜像和docker容器基本命令。
1、进入Docker
安装docker的方式可以参看我上一篇博文。
一般来说Linux安装好docker之后,就可以直接使用docker这个命令了,如果没有启动docker(守护进程)会出现以下命令报错:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
可以使用以下代码进入:
service docker start
2 、关闭Docker服务
其实一般说的关闭docker其实就是关闭docker的守护进程,一般来说可以不用管这个(我现在水平还不到探讨这个的水平)
service docker stop
3、Docker查看现有镜像
查看现有镜像:
docker images
其实可以看到返回了现有镜像的列表,下面来解读以下返回的内容:
- REPOSITORY:“镜像所属的仓库名”,在仓库下会有很多版本的镜像,也就是一个仓库会包含多个镜像,而这里显示表示的是不同镜像属于那些仓库
- TAG:“镜像的标签名”,在仓库中,不同的镜像是以标签的形式来区分的。一个REPOSITORY仓库名+TAG标签名,就构成了一个完整的镜像名,如:centos:7.02、ubuntu:14.04、debian:latest这个镜像名就会对应一个镜像的ID。我们之前在运行镜像时,通常只是指定了centos,并没有指定后面的TAG标签名,在这种情况下,docker会默认使用“latest”标签所对应的镜像。
- IMAGE ID:“镜像的唯一ID”,常常可以使用这个来打开指定的镜像,因为TAG是可以重复的,但是ID是唯一的
- CREATED:“镜像建立的时间”。
- SIZE:“镜像建立的大小”。
4、Docker删除现有镜像
删除镜像有两种方法,一般是通过ID删除和通过TAG删除,刚才有提到TAG是可以重复的,对于同一个镜像可以有多个标签,所以如果采用指定标签的方法来删除镜像,只会删除你指定的REPOSITORY仓库名+TAG标签名的那个镜像。
docker rmi hello-world:latest
上面的命令就是删除hello-world这个仓库里的标签为latest的镜像。
不过要注意到这样删除是不能删除正在被容器使用的镜像,例如有以下报错:
这个时候可以使用 docker rmi -f hello-world:latest的命令强制删除,不过不推荐这样的方式,正确方法是:
- 先删除引用这个镜像的容器(删除容器和查看容器的方法下面会讲到)
- 再删除这个镜像
5、Docker启动镜像
对于Docker来说,image是静态的,类似于操作系统快照,而container则是动态的,是image的运行实例。因此启动镜像就需要创建容器。
有一个image名称为ubuntu,那么比如现在我们启动这个image的container并且进入到这个container的bash命令行中:
docker run -t -i ubuntu /bin/bash
命令行的理解如下:
-
docker run:启动container(这种方式是基于镜像的启动,会创建一个新的容器)
-
ubuntu:你想要启动的image
-
-t:进入终端
-
-i:获得一个交互式的连接,通过获取container的输入
-
/bin/bash:在container中启动一个bash shell
上图就是成功查创建了一个容器,并进入到了,容器的ID是2fa8d7535635,这个时候容器就已经在运行了。
如果要退出容器就直接在命令行输入 exit,就可以退出了。
6、Docker查看现有容器
查看正在运行的容器
docker ps
可以看到我们之前运行的容器已经显示出来了(这个是在新窗口执行的命令行,原来的那个窗口没有exit容器),如果exit容器之后,用这个命令行就看不到。如果想要查看所有的容器,可以使用下面的命令行。
docker ps -a #查看无论运行还是没有运行的容器
可以看到就算退出容器之后依然有可以查看到对应的容器信息。
- CONTAINER ID(container id ) :顾名思义 ,容器ID的意思,可以通过这id找到唯一的对应容器
- IMAGE (image):该容器所使用的镜像
- COMMAND (command):启动容器时运行的命令
- CREATED (created):容器的创建时间,显示格式为”**时间之前创建“
- STATUS (status):容器现在的状态,状态有7种:created(已创建)|restarting(重启中)|running(运行中)|removing(迁移中)|paused(暂停)|exited(停止)|dead
- PORTS (ports): 容器的端口信息和使用的连接类型(tcp\udp)
- NAMES (names): 镜像自动为容器创建的名字,也唯一代表一个容器
7、Docker删除现有容器
刚才提到了在删除镜像以前,需要先删除引用着的容器,我们可以使用以下的命令行来进行。我们先看下有哪些容器存在。
然后使用docker rm dockerID的方法删除。
docker rm 3043893130d5
可以看到已经刚才存在的容器已经没有了,当然还有更多高级的删除容器的方法,可以参考(https://www.cnblogs.com/wholj/p/10396516.html)
8、Docker 修改镜像以及保存镜像
对于镜像来说,每次进入镜像(容器)并且操作镜像里的内容之后,如果直接使用exit退出容器,是不会保存你的操作的(也就是说重新加载dockerrun -t -i xxxx /bush镜像之后,一切内容都会重新来)。如果我们想要保存我们的操作该怎么办呢?下面我们启动之前创办的ubuntu的系统,并在ubuntu系统里安装vim编译器,并保存。
启动ubuntu系统,如果没有指定:TAG,会启动TAG为latest的镜像
docker run -it ubuntu /bin/bash
可以看到这个容器里面并没有vim编译器
接下来我们在这个容器安装vim编译器(具体细节参看我之前的博文Linux中安装vim编译器),具体就是两行命令行。安装完成之后命令行键入vim之后可以看到
好了这个系统已经被更改了,接下来是把这个系统(容器)打包成镜像保存(换句话说就是没有办法更改原来的镜像的,但是可以保存修改后的容器为另一个镜像的方法来保存),主要的命令是
docker commit 75eb300dd5b2 ubuntu:2.0
上面这个命令就是docker commit 容器ID ubuntu:2.0(这里这个镜像新的TAG)。
可以看到出现这个界面就说明已经保存成功了(主要到这个命令行以一定要在新的窗口中执行,不是在容器中执行这个储存命令行)
最后我们可以看看我们刚刚新创建的镜像。
可以看到我们的ubuntu:2.0镜像已经创建好了。如果我们进入ubuntu:2.0可以发现vim已经被安装好了。
9、Docker镜像及容器的保存位置
我们已经学会修改以及保存镜像,那我们会问那些下载到本地的镜像在哪里呢?我是一个对空间要求极高的人,在可以的情况下我希望知道所有的东西都放在哪里,因此无论安装什么包我都希望知道它的具体路径并设置好(特别是这种需要频繁下载东西的软件)。我们可以通过一下命令来查看。
sudo docker info
着张图片显示出来docker的信息,其中我们需要注意到的是:Docker Root Dir: /var/lib/docker,这就是docker镜像的存储路径(镜像的名字是不会显式的写在文件夹上的,具体的对应关系可以参看这篇博文)。
接下来是我们需要知道该如何更改这个路径,比如把这些镜像放到另一个分区里面。
1、把/var/lib/docker这个文件夹下的所有内容移动到另一个文件夹下,比如我这里移动到/data/docker这个文件里。
2、修改配置文件,更改docker中镜像和容器的默认储存位置。(注意,刚安装docker的需要新建这个文件)
sudo vim /etc/docker/daemon.json
3、将文件中'data-root',改为‘data-root’:'/home/data/docker'
4、重启docker服务
参考网址:
https://www.cnblogs.com/520yang/articles/8744454.html
https://blog.csdn.net/woshimeihuo/article/details/90209779
https://blog.csdn.net/acmman/article/details/84449092
https://www.cnblogs.com/quanxiaoha/p/10542278.html