【Docker】看完将会满足你对Docker 90%的操作需求,实例解析命令

前言

注意:如果博客中的命令直接复制到终端,有问题。直接自己再敲一遍就可以了,可能是因为富文本的原因。

本博客适合入门到进阶,结合实例深入介绍Docker命令,绝对不像其他一些总结博客随便贴一些命令。本博客有完整的知识链,中途记录你可能遇到的各种坑点,对命令的介绍结合实例。看完能够满足你对Docker 90%的操作需求。

本文引用的其他博客都是博主遇到坑时亲测过的,质量保证。

一、Docker的安装及操作

1、Docker要求Linux的内核版本在3.0【及】以上

2、安装过程

3、查看Docker版本

4、Docker的启动、重启、停止、状态、开机自启动

二、Docker镜像操作

1、Docker镜像下载加速

2、检索镜像

3、拉取(下载)镜像

4、查看本地的所有镜像

5、删除某个镜像

三、Docker容器操作

1、查看容器列表

2、(重要)运行镜像,创建一个容器

(1)命令参数介绍

(2)对于 -it 和 -d 理解和使用

(3)docker run的正确打开方式

3、进入和退出容器

3、容器的启动、重启、停止、删除

4、容器日志

5、容器内部和主机之间的文件拷贝



未完待续,还有下集。。。

一、Docker的安装及操作

1、Docker要求Linux的内核版本在3.0【及】以上

查看内核版本:

uname -r

-a:显示主机名/内核/硬件平台等全部信息
-r:只显示内核版本

博主虚拟机使用的镜像是比较老的Redhat,尝试升级内核,没成功。索性直接就下载了一个Centos7的镜像,再新建了新的虚拟机。如果有使用虚拟机的同学的Linux内核版本没有达到要求,可以查看我的另一篇博客:https://blog.csdn.net/qq_43290318/article/details/107704675

2、安装过程

yum install docker

安装过程,直接一条命令搞定了。如果下载速度慢,ctrl + C取消当前操作,将yum源配置为国内镜像仓库。

最好将yum源配置为清华大学的镜像仓库,不建议使用阿里的镜像仓库,亲测不稳定,体验不好。

参考博客:https://blog.csdn.net/xiaojin21cen/article/details/84726193

3、查看Docker版本

命令:docker -v

4、Docker的启动、重启、停止、状态、开机自启动

启动:syctemctl start docker

重启:syctemctl restart docker

停止:syctemctl stiop docker

查看Docker的状态:systemctl status docker

设置开机自启动:systemctl enable docker(默认不是开机自启动,建议设置为开机自启动)

二、Docker镜像操作

1、Docker镜像下载加速

假如你在从Docker Hub上拉取镜像时,下载速度慢。则可以修改: /etc/docker/daemon.json ,使用国内镜像加速。

这里参考一篇不错的博客:https://www.cnblogs.com/nhdlb/p/12567154.html

博主直接使用的是阿里的镜像加速,速度还可以。也不算非常快。

2、检索镜像

命令:docker search 关键字

不建议这样干,建议直接去Docker镜像仓库(Docker Hub:https://hub.docker.com/)官网去搜索。找好自己想要的镜像及对应的版本(TAG)之后,再回到Linux的终端使用命令拉取。

3、拉取(下载)镜像

命令:docker pull 镜像名(:tag)

如果不写“:tag”,那么默认为“:latest”

4、查看本地的所有镜像

命令:docker images

5、删除某个镜像

命令:docker rmi 镜像id 或 镜像名

注意:是“rmi”,而不是“rm”,这里“i”,可以理解为 image 的第一个字母

三、Docker容器操作

对于镜像和容器,我们可以这样理解:

软件镜像(QQ安装程序)---->运行镜像---->产生并启动一个容器(正在运行的软件,运行的QQ),只不过一个镜像可以创建并运行多个容器,他们之间相互隔离。

同时注意,一个容器相当于一个简易版的Linux,在容器内部可以使用基本的Linux命令。

1、查看容器列表

docker ps

不加任何参数,表示:查看正在运行中的所有容器

-a:所有容器,包括正在运行和不运行的

-l:最近一次运行的容器

-n x(数字):最近x次运行的容器

-q:静默模式,只显示容器id

2、(重要)运行镜像,创建一个容器

(1)命令参数介绍

命令:docker run 镜像名

命令参数:

--name 名字:为容器指定一个名字(唯一性),不加会随机生成一个名字。

容器名与容器id具有同等地位,一般来说命令中用到容器id的地方都可用名字来代替。

-d:后台运行容器,并返回容器的完整id(即启动守护式容器)

-i:以交互模式运行容器,通常与-t同时使用

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-P:随机端口映射(不建议使用)

-p 主机端口 : 容器端口    :指定端口映射

这个命令有点复杂,如果不理解正确,就会用错。尤其对于 -it 和 -d 的理解,以及对-p的理解。

(2)对于 -it 和 -d 理解和使用

运行centos镜像

docker run -it --name mycentos centos

这个命令比较好理解,给新创建的容器一个名字为“mycentos”。加上-it,表示成功创建并启动容器之后,返回一个伪终端给我。

从截图上来看,执行命令后,我们进入了这个刚创建的容器内部,并且给了我们一个伪终端。如何退出容器?

输入“exit”命令:会导致容器停止运行

ctrl+P+Q:退出伪终端,返回主机的终端,容器不会停止运行

这里先mark一下,退出容器也是个难点,后面会讲到。

docker run --name mycentos1 -d centos

关注“-d”,表示在后台创建并运行容器。

但是有一个问题,发现该容器并没有运行起来!!!

为什么容器被异常退出了?

因为Docker容器在后台运行,就必须有一个前台进程。如果容器的启动命令不是一直挂起的命令,Docker会认为容器启动后无事可做而自杀。这就是为什么加上-d后执行命令正常,但却发现容器异常停止运行的原因。

为了印证这一说法,下面我们创建一个tomcat。

docker run --name mytomcat -d tomcat

奇怪了,为什么mytomcat容器并不会像上面的mycentos1容器那样,被停止?我们再运行下面这一条命令看一下

docker run -it --name mytomcat1  tomcat

执行完这条命令后,发现有tomcat的日志打印,打印完之后没有退出,我们怎么输入都无法退出。实际上此时我们已经进入容器内部,且处于一个交互终端,这个终端并不是像centos的命令终端。tomcat一开始在这个交互终端给我们输出一堆启动日志,输出后并没有退出。这个交互终端就是这个容器前台进程,这就保证了容器能够在后台运行,而不被Docker认为这个容器无事可做,而把它给干掉。

按ctrl + C,停止当前命令操作,就会关闭这个终端进程,前台进程关闭,Docker会这个人容器在后台无事可做,就把它停止了。

(3)docker run的正确打开方式

可以发现,tomcat比较特殊,因为运行tomcat容器会自动挂起一个输出日志的前台进程。那么只需要加上“-d”,它就能够在后台启动并运行,Docker不会因为它无事可做把它干掉。

centos的容器不一样,它创建启动,没有挂起一个前台进程。如果只加上“-d”,那么容器会在后台被创建并运行,但是立马又会被Docker干掉。因为这个容器它没有前台进程,Docker会认为它在后台无事可做,就把它干掉了。

对于centos这种镜像,我们可以这样运行:

docker run -it --name mycentos2 -d centos

我们发现了后台运行centos容器时,我们“-it”和“-d”同时使用,它就能够后台运行而不被干掉。

为什么?因为“-it”,在容器内部帮我们挂起了一个终端进程(前台进程)。

3、进入和退出容器

docker attach 容器id :进入容器内部(准确来说,进入容器内部挂起的那个前台进程)

docker exec -it  容器id /bin/bash:进入容器内部,新建一个【命令】终端

两个命令有什么区别?下面结合实例分析。

docker attach mytomcat

执行命令后,我们已经进入mytomcat容器内部了,但是为什么不是一个命令终端?而是空白的,输入什么都没用?

回想前面,docker run --name mytomcat -d tomcat,mytomcat容器挂起的是一个输出日志的前台进程。现在我们attach进入容器内部,此时处于的也是这个输出日志的终端。

docker exec -it  mytomcat /bin/bash

执行命令后,我们进入了mytomcat容器内部,但是这次给我们的是一个命令终端,而并非日志终端。这是因为这个帮我在容器内,再新建了一个命令终端进程,且覆盖到日志进程之上。

那么输入“exit”退出容器,容器会停止运行吗?

为什么容器不会停止运行?因为“exit”退出的是“docker exec”新建的命令终端进程,这个结束后mytomcat容器内部原本日志进程尚未结束,这就表示容器内部仍有前台进程挂起,Docker不会认为容器在后台无事可做而把它干掉。如何印证这一说法?可以attach进去容器内部看一下,发现仍然会处于日志进程。

到这里。相信对于 运行容器 和  进出容器有了更深刻的理解。下面我再以mycentos容器为例再印证上述说法。

运行mycentos容器,并挂起一个命令终端。我们并不用“exit”退出,而是按ctrl + P + Q,退出容器。注意,此时容器内部仍然挂起着命令终端(前台进程)。所以后台的mycentos容器并不会被干掉。

上述截图“exit”退出后,容器并没有被干掉。因为“exit”退出的是“docker exec”新建的命令终端进程,而原本“docker run”是挂起的命令终端并没有结束,这就表示容器内部仍有前台进程挂起,Docker不会认为容器在后台无事可做而把它干掉。

3、容器的启动、重启、停止、删除

启动:docker start 容器id

重启:docker restart 容器id

停止:docker stop 容器id

删除:docker rm 容器id(注意这里是“rm”, 不是“rmi”,注意与镜像的删除区分开)

无法删除正在运行中的容器。如果要强制删除正在运行中的容器,需要加上“-f”,如:docker rm -f 容器id。

拓展:删除所有容器(包括正在运行中的容器,谨慎使用)

 docker rm -f $(docker ps -aq) 或 docker ps -aq | xargs docker rm

4、容器日志

docker logs

查看日志

-t:显示日志生成的时间

-f:实时刷新日志

--tail x(数字):查看倒数的x条日志记录

5、容器内部和主机之间的文件拷贝

容器内 --> 主机:

docker cp 容器id : 容器内部路径 主机路径

主机 --> 容器内:

docker cp 主机路径  容器id : 容器内部路径

关于“容器内部路径”,在下一篇博客,根据配置实例再作分析。

 

未完,请见下一篇博客。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值