前言
注意:如果博客中的命令直接复制到终端,有问题。直接自己再敲一遍就可以了,可能是因为富文本的原因。
本博客适合入门到进阶,结合实例深入介绍Docker命令,绝对不像其他一些总结博客随便贴一些命令。本博客有完整的知识链,中途记录你可能遇到的各种坑点,对命令的介绍结合实例。看完能够满足你对Docker 90%的操作需求。
本文引用的其他博客都是博主遇到坑时亲测过的,质量保证。
未完待续,还有下集。。。
一、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 : 容器内部路径
关于“容器内部路径”,在下一篇博客,根据配置实例再作分析。
未完,请见下一篇博客。