• docker容器保持运行不退出


    nsenter工具进入docker容器
    概述
    对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker exec 、docker attach 命令,并且还提供了nsenter工具,外部工具供我们使用。docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法。docker exec命令是在docker 1.3之后增加的一个比docker attach命令更加方便的命令。和docker exec差不多方便的命令是nsenter工具。

    nsenter安装
    $ cd /tmp;
    $ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
    $ ./configure --without-ncurses
    $ make nsenter && sudo cp nsenter /usr/local/bin

    nsenter使用
    在使用nsenter命令之前需要获取到docker容器的进程,然后再使用nsenter工具进去到docker容器中,具体的使用方法如下:

    $ docker inspect -f {{.State.Pid}} 容器名或者容器id #每一个容器都有.State.Pid,所以这个命令除了容器的id需要我们根据docker ps -a去查找,其他的全部为固定的格式
    $ nsenter --target 上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中

    解释nsenter指令中进程id之后的参数的含义:
    * –mount参数是进去到mount namespace中
    * –uts参数是进入到uts namespace中
    * –ipc参数是进入到System V IPC namaspace中
    * –net参数是进入到network namespace中
    * –pid参数是进入到pid namespace中
    * –user参数是进入到user namespace中

    在Linux中,最爱简单的查看指定命令参数含义的办法是在终端中输入:

    $ nsenter --help #会回显所有与该命令有关的参数
    $ man nsenter #能查到更加详细的使用示例和参数说明

    现象
    启动docker容器
    docker run –name [CONTAINER_NAME] [CONTAINER_ID]
    查看容器运行状态
    docker ps -a
    发现刚刚启动的mydocker容器已经退出

    原因
    docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出

    办法
    可以使用交互式启动

    docker run -i [CONTAINER_NAME or CONTAINER_ID]

    上面的不太友好,建议使用后台模式和tty选项

    docker run -dit [CONTAINER_NAME or CONTAINER_ID]

    查看容器状态

    docker ps -a

    docker调出后台容器

    docker attach [CONTAINER_NAME or CONTAINER_ID]

    TIPs:退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行

    如下命令,会在指定容器中执行指定命令,[ctrl+D]退出后不会终止容器运行

    docker exec -it [CONTAINER_NAME or CONTAINER_ID] /bin/bash

  • 相关阅读:
    原来Stable Diffusion是这样工作的
    othofinder跑出来结果缺少single_copy_othologue_sequences.
    文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《就地无常规电源支撑下考虑新能源基地频率稳定的储能优化配置方法》
    centeros7系统安装指定版本的mongodb数据库
    docker中已创建容器的修改方法
    Markdown使用方法
    Spring Retry教程(3)-模板方式的实现
    【 java 常用类】java 比较器
    postgresql-窗口函数
    【老生谈算法】matlab实现卡尔曼滤波算法源码——卡尔曼滤波
  • 原文地址:https://blog.csdn.net/m0_67402731/article/details/126327541