作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile
Docker镜像
Docker仓库
Docker原理(本小节属于)
Docker网络&存储&日志
Docker-Compose
Docker番外篇
我们经过前面两小节介绍docker的操作命令,只要熟练掌握这些命令,实际上我们已经可以掌握容器的运行,但是如果我一个容器无法启动或者启动失败,我们应该怎么去排错呢?
所以我们需要对docker的原理有一定的理解,这里我们先介绍docker的运行原理之一。
在讲解docker的运行原理之前,我们先来讲解前台进程和后台进程。在 Linux 系统中,进程可以根据其运行方式分为前台进程和后台进程。理解这两个概念有助于更好地管理和控制系统的运行状态。下面是关于这两个概念的详细解释:
前台进程 (Foreground Process)
定义:前台进程是指当前与终端交互的进程。用户可以直接看到前台进程的输出,并可以向其发送输入。
前台进程通常会阻塞终端,这意味着用户不能在前台进程运行期间输入其他命令,除非前台进程结束或被暂停。
示例:在终端中运行 ping 127.0.0.1 命令,ping 命令会持续输出结果,直到用户按下 Ctrl+C 终止它(适合linux,win默认4个包就会退出)。
后台进程 (Background Process)
定义:后台进程是指在后台运行的进程,它们不与终端直接交互。用户可以在后台进程运行的同时继续使用终端执行其他命令。
示例:使用 & 符号将命令放到后台运行。例如,运行 sleep 100 &,sleep 命令将在后台运行,终端立即返回,用户可以继续输入其他命令。
Docker的启动
通过前面的学习,我们了解docker的隔离性实际上比虚拟机差,它并没有从操作系统上进行隔离,而是通过Linux上的namespace特性进行的逻辑隔离(这个后面会单独讲)。
所以我们docker里面的进程实际上就是在docker子进程下面启动了一个普通进程(在操作系统里面也可以看到这个进程)。如果这个进程退出,则这个容器就会退出,这也就是我们的docker里面必须要有一个前台进程的原因。也是为后面的Dockerfile提前做好准备,避免我们制作的镜像出现无法启动情况。
下面我们讲通过例子来讲解这个问题,这个镜像官方的centos7的镜像,只有3层。
按照我们前面讲解的命令,我们通过后台启动它,我们虽然启动这个容器,但是这个容器启动以后立即就退出,并没有按照我们的预期在后台持续运行。
[root@localhost ~]# docker run -d centos:7
88c8b9abd7000fa2366a10bd3d1caa131daffcb462094908baffb4040a1c2cd6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88c8b9abd700 centos:7 "/bin/bash" 7 seconds ago Exited (0) 6 seconds ago funny
我们换一种方式来启动它,使用了-itd参数来启动来,它就是按照我们的预期在后台运行。
[root@localhost ~]# docker run -itd centos:7
c16e503b7ddafe655403fb23718b1cd638d13d30f9924f952a3e34e2cc1d065d
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c16e503b7dda centos:7 "/bin/bash" 4 seconds ago Up 4 seconds peaceful_tharp
我们再换一个nginx的镜像,这个镜像虽然tag被我修改过,但是它也是docker的官方镜像。
[root@localhost ~]# docker run -d 192.168.31.43:5000/nginx
d664641bef7b6fcea5941efd6e3c38b8f13f6ac3f33181aa40b460fed51b11ca
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d664641bef7b 192.168.31.43:5000/nginx "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 80/tcp elastic_taussig
[root@localhost ~]# docker run -itd 192.168.31.43:5000/nginx
38dfe0c1fea8fd643f4abb5ae0b7c5fa9efdda2eb84c47ed0ea2556b801067d7
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38dfe0c1fea8 192.168.31.43:5000/nginx "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 80/tcp happy_bhabha
可以看到无论我们无论是使用-itd 还是-d 它都可以按照我们预期的方式在后台持续运行,这个是为什么呢?
通过这个对比,让我们了解到docker run的参数和不同的镜像其实相关联,不同的镜像是可以匹配不同的参数,这个就需要对镜像有一个基本的认识,这里简单的分类下:
1.操作系统&环境镜像
比如centos,ubuntu,jdk等类型的镜像
2.服务类操作系统
比如nginx,tomcat,mysql等提高具体服务的镜像
3.自我制作的镜像
就需要根据自己需要来实现,规则也可以参考上面两种。
根据前面信息,我们也就可以根据不同的镜像输入不同的运行命令,确保他是可以正常启动,而不会出现启动及退出。
运维小路