docker容器中的程序,为什么一定要前台运行
#### [docker](https://so.csdn.net/so/search?q=docker&spm=1001.2101.3001.7020) 容器默认会把容器内部第一个进程,也就是`pid=1`的程序作为docker[容器](https://so.csdn.net/so/search?q=%E5%AE%B9%E5%99%A8&spm=1001.2101.3001.7020)是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
代码语言:javascript
复制
1 |
|
Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。 而上面的代码中bash就是需要执行的指定的命令。
命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。
解决办法
目前了解的可以使用以下3种方法,具体用哪种方法,依据实际情况,生产情况下,通常用docker-compose
结合具体cmd
作为容器初起的命令。
1.指定挂起阻塞命令启动容器
代码语言:javascript
复制
1 |
|
命令执行后,通过**docker ps -a | grep my-redis
,可以看到容器处于运行状态,即up
**。
2.使用交互界面后退出容器
代码语言:javascript
复制
1 |
|
之后会进入容器,如果想保持容器后台运行,我们可以 **Ctrl + p + q
,再次查看容器运行状态,也可以看到容器处于up
**状态。
3.-td命令结合使用
代码语言:javascript
复制
1 |
|
刚也提到,就是-d
运行容器时,需要有前台进程,-t
提供一个伪终端,类似前台进程,查看容器运行状态,也可以看到,容器处于**up**
状态。
补充-进入容器的4种方法
docker提供了多种进入容器的方法,这里补充4种常见的方法:
- 使用docker attach
- 使用SSH
- 使用nsenter
- 使用exec
docker attach
代码语言:javascript
复制
1 |
|
使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,建议开发时使用。
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
进入容器