zoukankan      html  css  js  c++  java
  • docker容器之后台运行

    我们 docker run 启动容器的时候,常需要将其在后台运行,通常我们设置参数 -d 即可。

    但后台运行,其实是有前提的,如果没有前台进程,那么实际运行完docker run命令后,会处于退出状态,即exited

    例子:

    docker run -d --name my-redis redis bash
    
    # 指定命令是bash,但显然bash在容器起来后,很快就会结束,导致没有前台进程,故容器处于退出状态
    

    Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。
    而上面的代码中bash就是需要执行的指定的命令。

    命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。

    解决办法

    目前了解的可以使用以下3种方法,具体用哪种方法,依据实际情况,生产情况下,通常用docker-compose结合具体cmd作为容器初起的命令。

    1.指定挂起阻塞命令启动容器

    docker run -d --name my-redis redis sleep 99999999999999
    

    命令执行后,通过docker ps -a | grep my-redis,可以看到容器处于运行状态,即up

    2.使用交互界面后退出容器

    docker run -it --name my-redis redis bash
    

    之后会进入容器,如果想保持容器后台运行,我们可以 Ctrl + p + q,再次查看容器运行状态,也可以看到容器处于up状态。

    3.-td命令结合使用

    docker run -itd --name my-redis2 redis bash
    # -i 不是必需,加了,容器起来后终端返回容器ID
    

    刚也提到,就是-d运行容器时,需要有前台进程,-t提供一个伪终端,类似前台进程,查看容器运行状态,也可以看到,容器处于up状态。

    补充-进入容器的4种方法

    docker提供了多种进入容器的方法,这里补充4种常见的方法:

    • 使用docker attach
    • 使用SSH
    • 使用nsenter
    • 使用exec

    docker attach

    docker attach 容器ID|容器name 
    

    使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,建议开发时使用。

    ssh
    在镜像(或容器)中安装SSH Server,这样就能保证多人进入,不建议使用,具体见为什么不需要在 Docker 容器中运行 sshd

    nsenter
    nsenter使用方法

    docker exec-推荐使用
    通常我们可以通过容器name容器ID进入到容器中:

    • 如果我们在启动容器的时候指定-name选项,我们可以:docker exec -it container_name bash

    • 没指定name,我们可以通过docker ps查看容器的ID,之后再通过docker exec -it containerID bash进入容器

    参考:https://www.cnblogs.com/xhyan/p/6593075.html

  • 相关阅读:
    人工智能学习笔记003-Python运算符
    人工智能学习笔记002-Python数据类型
    人工智能学习笔记001—python介绍
    dataclasses 笔记
    Js逆向-滑动验证码图片还原
    python3 marshmallow学习
    python 安装 SQLAlchemy 报错
    flask 与 SQLAlchemy的使用
    flask 与 flask_migrate的使用
    flask与flask-script的使用
  • 原文地址:https://www.cnblogs.com/davis12/p/14456227.html
Copyright © 2011-2022 走看看