Docker run最后加/bin/bash遇到的问题

Posted 是渣渣呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker run最后加/bin/bash遇到的问题相关的知识,希望对你有一定的参考价值。

问题展示

1.使用docker run -dit (容器ID/容器名+一些参数)/bin/bash
后台启动es镜像

[root@iZ2zegnzd0af38r6v96pcfZ test]# docker run -dit -p 9200:9200 -p 9300:9300 -e  ES_JAVA_POTS="-Xms256m -Xmx256m" --name estest4 25476914cc66 /bin/bash
ca2d6cc2b66c549e14385a6facedca5801c5f277be377e8cd19acfe988850dbe


我们可以看到es是无法访问的

2.于是我们使用docker run -dit (容器ID/容器名+一些参数)

[root@iZ2zegnzd0af38r6v96pcfZ test]# docker run -dit -p 9200:9200 -p 9300:9300 -e  ES_JAVA_POTS="-Xms256m -Xmx256m" --name estest5 25476914cc66 
570b16eaaf579b6cda2c053b9a29a4805aab8ca6edb07deb40598b4931de29c6

这样运行es是可以访问的!!

原因猜想

  1. 首先应该跟 /bin/bash 有关
  2. 可能是 /bin/bash 的方式没有把es的服务启动

因为我搜索为什么es容器启动了但访问不了的时候发现有人用docker启动nginx但是访问不了,最后发现是nginx服务没有启动

证实一下猜想

首先先看一下能访问的那个es容器(estest5)



(这是开启estest5后内存的使用情况)

(这是停止容器estest5后的内存使用情况)

[root@iZ2zegnzd0af38r6v96pcfZ ~]# docker start estest4
estest4
[root@iZ2zegnzd0af38r6v96pcfZ ~]# docker stop estest4
estest4

然后,再看一下不能访问的那个es容器(estest4)

[root@iZ2zegnzd0af38r6v96pcfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2zegnzd0af38r6v96pcfZ ~]# docker start estest4
estest4
[root@iZ2zegnzd0af38r6v96pcfZ ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS              PORTS                                            NAMES
ca2d6cc2b66c   25476914cc66   "/usr/local/bin/dock…"   14 hours ago   Up About a minute   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   estest4

但是,当我们查看内存使用情况时,可以看到虽然启动了estest4,但是内存基本没变化!

所以说,我觉得docker run … /bin/bash虽然启动了es容器,但是没有开启服务,所以当然访问不了,
但是为何没开启呢??我也不清楚。。

/bin/bash到底是啥?

1.bash 和 shell

首先,shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。 不论何时你键入一个命令,它都被Linux shell所解释。

其次,Bourne Again shell (bash), 是 Bourne shell 的扩展。bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。

为什么要用 bash 来代替 sh 呢?Bourne shell 最大的缺点在于它处理用户的输入方面。在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时。而 bash 准备了几种特性使命令的输入变得更容易。
  1. docker run -dit (容器ID/容器名+一些参数)/bin/bash
    这三个参数(-i, -t, -d :这里写在一起了 -dit ) 是啥意思

    -i 以交互模式运行容器,通常与 -t 同时使用;
    -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -d 后台运行容器,并返回容器ID;

我们在使用docker run -dit (容器ID/容器名+一些参数)/bin/bash的时候,其实就是表示载入容器后运行bash(命令语言解释程序) ,
因为docker中必须要保持一个进程(运行的程序)的运行,要不然整个容器就会退出。
所以说,bash就担任起了docker中运行的那个进程的角色!而/bin/bash则是bash在linux下的位置

ps:以上都是个人看法,可能有很多错误,欢迎指正!

以上是关于Docker run最后加/bin/bash遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

docker run 最后一个参数/bin/bash和/usr/sbin/init有什么区别?(/usr/sbin/init 启动容器之后可以使用systemctl方法)

docker容器启动时执行脚本 run /bin/bash执行多条指令

输入使用 Google Cloud Run 运行的 docker 容器

为啥运行docker命令返回"/var/run/docker.sock"权限拒绝

如何让docker以daemon方式运行/bin/bash

Docker常用命令