常见问题
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 服务,再重新连接。