相信大家在进行docker实践的过程中或多或少都会遇到一些问题,本篇文章博主主要对自己实践过程中遇到的问题进行一个总结,希望会对大家有所帮助。
问题一:当执行指令docker-machine create时提示No default boot2docker iso found Iocally, downloading the latest release...
解决方案:手动下载需要的boot2docker iso文件,然后放到指定的路径下。
具体步骤:
1. 通过浏览器访问如下地址:api.github.com/repos/boot2… (注意该地址可能需要*访问),找到"html_url": "https://github.com/boot2docker/boot2docker/releases/tag/v18.09.5"
该地址就是最新的boot2docker iso文件的下载地址
2. 如图所示找到所需的安装包并下载:
3. 将下载好的文件放到如下路径:/User/{username}/.docker/machine/cache/
4. 重新执行docker-machine create指令即可
问题二:operating system "windows" cannot be used on this platform or operating system "Linux" cannot be used on this platform
解决方案:
不同类型container下build出来的image只能在所对应的类型的container下运行,比如不能在windows container中运行linux container build出来的image
问题三:当执行docker-machine scp指令将本地文件copy到docker-machine create指令创建的虚拟机中时,可能会遇到如图所示的情况:
需要我们输入账号的密码,但是我们在通过docker-machine create指令创建vm的时候根本没有要求输入账号和密码
解决方案:通过linux sudo passwd指令手动修改账号的密码
具体步骤:
1. 进入到我们创建的vm中
2. 执行sudo passwd account-name
3. 我们就可以利用修改之后的密码来访问了
问题四:在使用docker-compose.yml文件来管理service的时候,执行docker stack deploy -c docker-compose.yml stack-name指令时可能会遇到类似如下问题:
networks Additional property networks is not allowed
replicas Additional property replicas is not allowed
解决方案:
该篇检查YAML文件格式,为大家提供一个YAML文件在线校验器 大家可以通过这个在线校验器来检查自己的YAML文件格式,YAML文件中key: value, key的冒号和value之间需要有一个空格,大家一定要注意
问题五:在通过指令docker swarm init创建docker容器集群时遇到如下错误:
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (XXX ip on eth0 and XXX ip on eth1) - specify one with --advertise-addr
解决方案:遇到该问题的原因是因为我们的笔记本电脑大部分都是双网卡,在创建docker集群的时候需要指定一个固定的ip和port,以便可以让其他子节点加入到该集群中,根据错误提示我们可以使用如下指令解决这个问题:
docker swarm init --advertise-addr ip:port
问题六:在将一个应用程序构建为一个镜像文件的时候可能会遇到如下错误:
CreateComputeSystem 409810e2ee4751a9ad42e313cfa7045f723c737743c506fbe406e9f52266e519: The container operating system does not match the host operating system.
真实案例:在windows server 2019上做.net core开发的时候,默认vs添加的dockerfile文件中引用的基础镜像是 microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803 和microsoft/dotnet:2.2-sdk-nanoserver-1803 需要修改为:microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1809 和 microsoft/dotnet:2.2-sdk-nanoserver-1809
或者直接使用microsoft/dotnet:2.2-aspnetcore-runtime 和 microsoft/dotnet:2.2-sdk
解决方案:导致这个问题的原因是因为引入的基本镜像和我们当前主机的系统版本不匹配,通过找到匹配的基础镜像就可以解决这个问题。
问题七:在向本地搭建的私有Registry中push镜像的时候,提示如下error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.
问题原因:Docker默认不允许非HTTPS方式推送镜像。
解决方案:在想要push镜像到私有Registry的机器上添加如下配置信息:
"insecure-registries":["ip:port"],具体步骤如下:
右键whale图标,在弹出的dialog中选择Settings,在弹出的dialog中点击Daemon,然后在Insecure registries中填入:ip:port, 如192.168.1.123:5000
问题八:在向本地搭建的私有Registry中push镜像的时候,提示如下error: Skipped foreign layer received unexpected HTTP status: 500 Internal Server Error
解决方案:该问题共有两种解决方案
方案1: 进入到registry的container,找到config.yml文件,在文件中加入如下配置信息:
validation:
disabled: true复制代码
方案2:进入到registry的container,找到config.yml文件,在文件中加入如下配置信息:
validation:
manifests:
urls:
allow:
- ^https?://复制代码
具体步骤:(该步骤是在windows10系统中的操作步骤)
1. 通过指令docker exec -it container-name /bin/sh进入到container的内部Linux指令窗口
2. 通过指令cd /etc/docker/registry/ 进入到container所在的机器的registry文件夹
3. 通过指令ls 能列举出文件夹中包含的文件,找到config.yml文件
4. 通过指令cat config.yml可以查看文件的内容
5. 通过指令vi config.yml 来编辑文件的内容,键入i键开启编辑模式,向文件中加入方案1或者方案2中的内容
6. 编辑结束之后点击Esc,然后输入:wq 退出编辑,这样文件我们就修改完毕了
7. 重启docker,重新push 镜像即可
该问题的解决方案参考:github.com/docker/dist…
我会根据自己在使用docker过程中遇到的问题不断的更新该篇文章,希望能够帮到大家。
上一篇(单主机上实现多Docker虚拟主机的创建和服务部署)