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.自我制作的镜像

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

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

运维小路

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

相关推荐
Lw老王要学习18 分钟前
Linux架构篇、第五章git2.49.0部署与使用
linux·运维·git·云计算·it
showmethetime30 分钟前
搭建高可用及负载均衡的Redis
运维·redis·负载均衡
上天_去_做颗惺星 EVE_BLUE1 小时前
Docker入门教程:常用命令与基础概念
linux·运维·macos·docker·容器·bash
alden_ygq2 小时前
Kubernetes容器运行时:Containerd vs Docker
docker·容器·kubernetes
努力搬砖 ing2 小时前
Docker疑难杂症解决指南
docker·容器·eureka
林九生2 小时前
【Docker】Docker环境下快速部署Ollama与Open-WebUI:详细指南
java·docker·eureka
Grassto2 小时前
dockerfile: PaddleOCR hubserving api 服务
docker·ocr·paddleocr
ZHOU_WUYI3 小时前
Flask Docker Demo 项目指南
python·docker·flask
张青贤5 小时前
K8s中的containerPort与port、targetPort、nodePort的关系:
云原生·容器·kubernetes
云攀登者-望正茂7 小时前
AKS 支持 Kata Container容器沙盒 -预览阶段
容器·azure