You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu容器启动失败求助:Docker-Compose配置后容器崩溃

问题分析与解决方案

首先要明确:你的容器并不是“崩溃”,而是正常退出(exit code 0就是明证)。Ubuntu官方镜像默认的启动命令是bash,当容器以非交互模式启动时,bash没有终端输入会立刻结束运行,主进程结束后Docker自然会停止容器,所以你会看到容器启动即退出,日志抓不到内容(EOF是因为容器已经退出,没有日志输出)。

下面分两种场景给你解决方案:

场景1:只是需要容器持续运行(用于后续进入容器操作)

修改你的docker-compose.yml,给容器指定一个持续运行的命令,比如tail -f /dev/null,这个命令会一直挂起,让容器保持运行状态:

version: '2'
services:
  ubuntu:
    image: 'ubuntu:16.04'
    ports:
      - '22:22'
    command: tail -f /dev/null

启动后你可以用docker exec -it playground_ubuntu_1 bash进入容器执行操作。

场景2:需要启动SSH服务(映射22端口的目的应该是这个)

官方Ubuntu镜像默认没有安装openssh-server,所以直接映射22端口没用,需要先安装并配置SSH服务,让它作为容器的主进程前台运行。推荐用Dockerfile来构建自定义镜像:

  1. 新建一个Dockerfile文件,内容如下:
FROM ubuntu:16.04
# 更新源并安装openssh-server
RUN apt-get update && apt-get install -y openssh-server
# 创建sshd运行所需的目录
RUN mkdir /var/run/sshd
# 设置root密码(替换成你自己的密码)
RUN echo 'root:your_secure_password' | chpasswd
# 修改sshd配置,允许root登录
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 暴露22端口
EXPOSE 22
# 前台启动sshd,作为容器的主进程
CMD ["/usr/sbin/sshd", "-D"]
  1. 修改docker-compose.yml,改为构建本地镜像:
version: '2'
services:
  ubuntu:
    build: .
    ports:
      - '22:22'

然后执行docker-compose up -d启动容器,之后你就可以用ssh root@localhost(输入你设置的密码)连接容器了。

内容的提问来源于stack exchange,提问作者asosnovsky

火山引擎 最新活动