docker创建容器一直restart解决

博客介绍了容器不退出的原因,即容器同时只能管理一个进程,要使容器不退出需有进程在前台执行。还给出解决方案,如启动脚本最后进程用前台运行方式,可在脚本后加 /bin/bash 或 tail -f /dev/null ,也可在 dockerfile 写 CMD 后台运行命令 && /bin/bash ,并提供了调试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因:
容器同时只能管理一个进程,如果这个进程结束了容器就退出了,但是不表示容器只能运行一个进程(其他进程可在后台运行),但是要使容器不退出必须要有一个进程在前台执行。

解决方案:
启动脚本最后一个进程一定要用前台运行方式 即在进程最后不加 &(&表示在后台执行),否则容器退出。

方法1: 可在脚本后加 /bin/bash ,如果还不行,就换为 tail -f /dev/null (实时查看/dev/null)。

方法2: dockerfile文件写CMD 后台运行命令 && /bin/bash

可用调试方法:
docker run -it -d —name 容器名字 docker镜像名 /bin/bash

<think>嗯,用户想了解如何在Docker创建并保持Zookeeper容器一直运行,并且设置开机自动启动。首先,我需要回忆一下Docker的基本命令,尤其是关于运行容器和后台模式的参数。记得用`docker run`命令,加上`-d`让容器在后台运行。但是用户提到“一直保持运行”,可能需要检查Zookeeper的官方镜像是否有特殊配置,比如前台运行的问题。 然后,Zookeeper作为分布式协调服务,通常需要持久化数据,所以应该考虑挂载数据卷,使用`-v`参数。另外,网络配置也很重要,可能需要指定端口映射,比如2181、2888、3888这些端口。用户可能还希望容器在系统重启后自动启动,所以需要`--restart unless-stopped`或者`always`选项。 接下来,用户可能遇到的问题可能是容器启动后立即退出。这可能是因为Zookeeper进程没有保持前台运行,导致Docker认为容器已经结束。这时候需要确认镜像的Dockerfile是否有使用前台启动命令,比如`CMD ["zkServer.sh", "start-foreground"]`。如果官方镜像已经处理了这一点,那么直接用`-d`应该没问题。 另外,开机自动启动涉及Docker服务的自启以及容器的重启策略。需要确保Docker服务本身在系统启动时运行,然后容器的`--restart`参数会生效。可能需要提醒用户检查系统是否启用Docker服务自启,比如使用`systemctl enable docker`。 可能还需要提供docker-compose的配置示例,因为用户可能更倾向于使用更简洁的yaml文件来管理容器配置,这样也方便以后扩展和修改。同时,检查防火墙设置,确保相关端口开放,避免连接问题。 总结步骤的话,应该是:拉取镜像,运行容器并设置后台模式和重启策略,挂载数据卷,端口映射,然后验证容器状态。最后,测试开机后是否自动启动成功。如果有问题,查看日志用`docker logs`来排查原因。</think>好的,下面是通过Docker创建并保持Zookeeper容器持续运行,并设置开机自启的详细步骤: --- ### 一、保持容器持续运行 ```bash # 使用官方zookeeper镜像(后台模式 + 持久化配置) docker run -d \ --name my-zookeeper \ --restart unless-stopped \ -p 2181:2181 \ -p 2888:2888 \ -p 3888:3888 \ -v /your/local/path/data:/data \ -v /your/local/path/datalog:/datalog \ -e ZOO_MY_ID=1 \ -e ALLOW_ANONYMOUS_LOGIN=yes \ zookeeper:latest ``` #### 参数说明: 1. `-d`:后台运行容器 2. `--restart unless-stopped`:自动重启策略(除非手动停止) 3. `-v`:挂载数据卷防止数据丢失 4. `-e`:环境变量配置(ZOO_MY_ID必须≥1) 5. 端口映射: - 2181:客户端连接端口 - 2888:集群节点通信端口 - 3888:Leader选举端口 --- ### 二、设置开机自动启动 #### 方法1:通过`--restart`参数(推荐) ```bash # 创建容器时直接指定 docker run ... --restart unless-stopped ... # 修改已存在的容器 docker update --restart unless-stopped my-zookeeper ``` #### 方法2:配置系统服务(适用于需要更精细控制的场景) 1. 创建服务文件 ```bash sudo nano /etc/systemd/system/zookeeper-docker.service ``` 2. 添加以下内容 ```ini [Unit] Description=Zookeeper Docker Container Requires=docker.service After=docker.service [Service] ExecStart=/usr/bin/docker start -a my-zookeeper ExecStop=/usr/bin/docker stop -t 30 my-zookeeper Restart=always [Install] WantedBy=multi-user.target ``` 3. 启用服务 ```bash sudo systemctl daemon-reload sudo systemctl enable zookeeper-docker.service ``` --- ### 三、验证操作 1. 检查容器状态 ```bash docker ps -a | grep my-zookeeper ``` 2. 查看日志(排查启动问题) ```bash docker logs -f my-zookeeper ``` 3. 测试Zookeeper连接 ```bash telnet localhost 2181 # 输入`stat`查看状态 ``` --- ### 四、使用docker-compose(推荐方案) 创建`docker-compose.yml`文件: ```yaml version: '3' services: zookeeper: image: zookeeper:latest container_name: my-zookeeper restart: unless-stopped ports: - "2181:2181" - "2888:2888" - "3888:3888" volumes: - ./data:/data - ./datalog:/datalog environment: ZOO_MY_ID: 1 ALLOW_ANONYMOUS_LOGIN: "yes" ``` 启动服务: ```bash docker-compose up -d ``` --- ### 常见问题排查 1. **容器自动退出**:检查日志中的`ZOO_MY_ID`是否设置,确保数据目录有写入权限 2. **端口冲突**:使用`netstat -tuln | grep 2181`检查端口占用 3. **集群配置**:多节点时需要设置`ZOO_SERVERS`环境变量 4. **数据持久化**:定期备份`/data`和`/datalog`目录 建议通过`docker-compose`管理容器,这是目前最简洁可靠的部署方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值