常见问题

Q01:我的私钥丢了,怎么重新下载?

A:

已经注入的密钥是不能下载私钥的,建议重新注入。

Q02:为什么注入的密钥无效?或不能添加公钥?

A:

创建完成后如需要自行添加公钥,详见 如何注入 SSH 密钥

Q03:为什么我的网站之前好的,突然打不开了?

A:

这往往是由于未正确设置 Docker 的 CMD 和 ENTRYPOINT 导致,在容器重启或者重建后,虽然容器已经恢复可用,但是容器内的应用并未启动需要手动拉起,我们建议合理设置启动命令保障服务高可用。

Q04:Web Console 闪退或卡在 login?

A:

原因1 这往往是容器 OOM 导致,建议重启容器;

原因2 进入容器管理需要装bash,未安装该命令则无法login。

Q05:CPU 占用率过高该怎么办?

A:

可以通过 TOP 命令查看是哪些进程占用了 CPU 的资源,kill 掉不需要的进程。

Q06:有状态负载重启后 hosts 文件被还原?

A:

容器中部分系统文件未做持久化,建议在 Dockerfile 中采用 echo "" >> /etc/hosts 的方式将hosts内容做到镜像中。也可在 Dockerfile 中的 ENTRYPOINT 部分从对象存储的文件获取 hosts 数据再加到镜像中的 /etc/hosts 中。

Q07:无 Deployment 负载新建的数据被还原?

A:

无状态负载中一般只存放应用,需要持久化的数据建议在书写 Dockerfile 时添加到镜像中。数据库建议使用我们提供的数据库服务。

Q08:删除容器时容器内程序如何捕获删除信号,然后做些清理操作?

A:

删除容器时会发送信号 SIGTERM,可以捕获此信号然后做需要的清理操作。

Q09:上传到容器中的文件中文内容乱码?

A:

以ubuntu16为例。 修改文件 /etc/vim/vimrc,在文件最后加入如下内容:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 
set termencoding=utf-8 
set encoding=utf-8

Q10:上传到容器中的中文文件名乱码?

A:

以ubuntu16为例。 在文件 /var/lib/locales/supported.d/local 中添加如下内容,文件不存在则新建:

zh_CN.GBK GBK

文件 /etc/profile中加入如下内容:

export LANGUAGE=”zh_CN:zh:en_US:en”
export LANG=zh_CN.GBK 

执行命令 source /etc/profile 使配置生效,断开连接重新连接。

Q11:捕获信号 SIGTERM?

A:

容器在重启和删除时会向容器中的主进程(PID 为1)发送 SIGTERM 信号,可以在主进程中捕获此信号,然后做相应的处理。

本示例中当捕获到 SIGTERM 信号时访问 nginx,查看 nginx 的 access.log 中是否有被测容器的访问信息即可知晓是否捕获到 SIGTERM 信号,具体步骤如下:

(1) 部署 使用官网镜像新建 nginx 容器服务,绑定弹性公网 IP ,假设 IP 为 59.111.90.8。

捕获 SIGTERM 信号的代码文件 sig.py 内容如下:

# -*- coding: utf-8 -*-
import os    
import signal    
from time import sleep    
def onsignal_term(a,b):    
    print '收到SIGTERM信号' 
    os.system("curl 59.111.90.8")
#信号处理函数,将SIGTERM绑定在函数onsignal_term上面    
signal.signal(signal.SIGTERM,onsignal_term)    
def onsignal_usr1(a,b):    
    print '收到SIGUSR1信号'    
#信号处理函数,将SIGUSR1绑定在函数onsignal_term上面    
signal.signal(signal.SIGUSR1,onsignal_usr1)    
while 1:    
    print '进程id是:',os.getpid()    
    sleep(10)    

只需要将 sig.py 中的 IP 改为自己 nginx 的 IP,其他部分不需修改。

书写 Dockerfile 文件,将 python sig.py 作为第一个启动命令,即主进程,示例 Dockerfile 内容如下:

FROM hub.c.163.com/public/centos:6.7-tools
ADD sig.py /root/sig.py
ENTRYPOINT  python /root/sig.py

利用此 Dockerfile 构建镜像,并新建服务,如 service1。 (2) 测试

重启服务 servcie1,查看 nginx 容器 /var/log/nginx/access.log 文件中是否有 servcie1 访问信息,如果有则捕获到了 SIGTERM 信号。 清除 access.log 中 service1 的访问信息,删除容器 service1,查看 nginx 的 access.log 中是否有 service1 的访问信息,如果有则捕获到信号 SIGTERM。

Q12:更改日志目录的用户组及权限?

A:

在 Dockerfile 的启动命令中添加更改用户组或权限的命令(若基镜像的启动命令是ENTRYPOINT,则Dockerfile中的启动命令必须是ENTRYPOINT)。示例代码:

ENTRYPOINT chown -R testuser:testuser /home/logs/ && /usr/sbin/sshd -D

Q13:SSH 远程连接较慢?

A:

可以修改下 sshd 服务的配置文件 /etc/ssh/sshd_config ,将GSSAPIAuthentication 设置为 no ,UseDNS 设置为 no ,然后重启下 sshd 服务,再重新连接。