您的位置:首页 > 运维架构 > Docker

Ubuntu 16.04 安装Docker ,Pull Docker image的时候遇到docker pull TLS handshake timeout

2017-02-15 10:50 811 查看
docker pull ubuntu

执行该语句报错。。。。

遇到了下的问题,

error pulling image configuration: Get https://dseasb33srnrn.cloudfront href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/registry-v2/docker/registry/v2/blobs/sha256/e3/e369c36508565c04452573471f3d2744329ecc65c302bd642fc5672830f09c6a/data?Expires=1484796497&Signature=DMls8thKqq0TuI295Frs8~PVg5TcmGAC5BoFSmA3RiKZKZj4eATQNkOEZbLN2Bp3v~27YB3xRLCZFXEe1JXalrdZHrkEOM4OgEOribsFAGibFG67YYxW5WiDBnpZccmtUKVqLMABskt2teE2dwTn5WPAh8uIcbqlcchfwQY3nuA_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q:
net/http: TLS handshake timeout

解决方法是:

mkdir -p certs && openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt

然后依次输入生成的证书的信息即可!!!
(填一些省市区县姓名信息等)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

有时还可能会在次出现,以下是解决方案:

最近在做Docker相关的东西,发现只要一pull镜像,就出现如下的ERROR

x509: certificate signed by unknown authority.

调查后发现,是公司IT把https证书换成了公司的证书(目的大家自己猜)。

解决思路:把替换后的证书直接用openssl拉下来,然后加入到系统(我是Ubuntu)系统证书中,然后使用update-ca-certificates更新,最后重启docker服务,成功!!

方式1:

$ echo -n | openssl s_client -showcerts -connect dseasb33srnrn.cloudfront.net:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/local/share/ca-certificates/cloudfront.crt

上面的dseasb33srnrn.cloudfront.net是docker提示证书错误的网址。把这个网址替换成你的网站,同时把改下你要生成的证书名字就OK。

然后重启docker deamon

$ sudo service docker restart

方式2:

$ echo -n | openssl s_client -showcerts -connect dseasb33srnrn.cloudfront.net:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> /etc/ssl/certs/ca-certificates.crt

$ update-ca-certificates

Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.

Running hooks in /etc/ca-certificates/update.d....

Adding debian:cloudfront.pem

done.

done.

同时替换上面的dseasb33srnrn.cloudfront.net就好了.

然后重启docker

$ sudo service docker restart

结语:

我上面的方式之所以可以搞定大多数由于公司IT部门替换https证书造成的错误,是因为很多程序是使用系统默认的证书(路径)。

对于一些特殊的程序,比如python pip,不使用系统默认的证书,而是使用自己的路径,可以强制它使用*方式2*生成的证书。
本人适合第二种方法。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

还可以这样解决:

出现这个问题,一般的原因是无法连接到 docker hub,通过:
$ sudo systemctl stop docker

$ sudo docker -d -D


开启 debug 模式,然后再运行 pull 就会出现类似下面的错误:
DEBU[0282] Error contacting registry https://registry-1.docker.io/v1/: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/data?Expires=1449474474&Signature=Gw6Y0xqjZT-1S8kPpNg9Z6GA~SH6SunDvh3eNGWvDQtBrotU9Qv6a3Mr6sAkP5L84zM32lsTxGrIehFKyEuwVncRy1sfEI-4Ggiuvqedwaw61HFYYBefoQJHDUtHOxUZkOJ6AuUlxOJeKhfHyLDMmPf3H1NSQ8U8L5Mf8rUXL0M_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout


很明显可以看出是连接不到 docker hub,那就需要查看网络原因了。可能需要个梯子。当然较简单的解决办法就是用国内的仓库,下面的方法就是使用国内的 daocloud 的仓库:

$ echo "DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"" | sudo tee -a /etc/default/docker

$ sudo service docker restart
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: