Docker-如何启动docker

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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层。

按照我们前面讲解的命令,我们通过后台启动它,我们虽然启动这个容器,但是这个容器启动以后立即就退出,并没有按照我们的预期在后台持续运行。

bash 复制代码
[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参数来启动来,它就是按照我们的预期在后台运行。

bash 复制代码
[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的官方镜像。

bash 复制代码
[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
bash 复制代码
[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.自我制作的镜像

就需要根据自己需要来实现,规则也可以参考上面两种。

根据前面信息,我们也就可以根据不同的镜像输入不同的运行命令,确保他是可以正常启动,而不会出现启动及退出。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

相关推荐
pingzhuyan4 小时前
03(总)-docker篇 Dockerfile镜像制作(jdk,jar)与jar包制作成docker容器方式
java·docker·jar
清风~徐~来4 小时前
【Linux】环境变量
linux·运维·chrome
LCY1335 小时前
3.k8s是如何工作的
云原生·容器·kubernetes
Bl_a_ck5 小时前
【C++】Docker介绍
运维·docker·容器·eureka
何似在人间5756 小时前
负载均衡的实现方式有哪些?
运维·负载均衡
文牧之7 小时前
MySQL 修改用户密码
运维·数据库·mysql
keepython7 小时前
【n8n docker 部署的代理问题】解决n8n部署无法访问openai等外国大模型厂商的api
运维·人工智能·docker·容器
八股文领域大手子7 小时前
优化IDEA2024.3大型项目启动慢
运维·nginx·spring·docker·容器
sg_knight8 小时前
Spring Cloud 2024.x智能运维:AI驱动的故障预测与自愈
java·运维·人工智能·spring boot·spring cloud
LCY1338 小时前
4. k8s核心概念 pod deployment service
云原生·容器·kubernetes