自从升级到Fedora 27之后,突然发现dnf upgrade
提示使用docker-common
替换docker
。
但是升级替换之后,却不能执行docker
指令,显示缺少/usr/bin/docker-latest
。从软件仓库来看,确实有一个docker-latest
软件包,所以就先尝试安装
dnf install docker-latest
不过,安装以后,虽然可以使用docker ps
指令,但是显示尚未启动服务。只时,此时并没有systemctl
可以管控的docker服务。
从Docker官方网站来看,当前Docker已经将软件分裂成社区版本和企业版本,并且在Fedora平台不再提供企业版本,只能安装部署社区版本。由于Fedora 27刚刚发布,当前Docker并没有释出针对Fedora 27的社区版本,导致现在存在的困境。
参考 Please provide repo for docker-ce on Fedora 27 #164 当前可以暂时使用 Fedora 26版本的 docker-ce 运行于 Fedora 27,即下载 https://download.docker.com/linux/fedora/docker-ce.repo ,然后通过以下命令替换$release
变量
sed -i 's/\$releasever/26/g' /etc/yum.repos.d/docker-ce.repo
等以后提供了Fedora 27版本之后,在使用以下命令恢复
sed -i 's/26/\$releasever/g' /etc/yum.repos.d/docker-ce.repo
- 首先清理Fedora发行版提供的Docker
dnf remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine
- 添加Docker CE软件参股
dnf config-manager \
--add-repo \
https://download.docker.com/linux/fedora/docker-ce.repo
注意:当前参考前述先替换
$release
成固定数值26
sed -i 's/\$releasever/26/g' /etc/yum.repos.d/docker-ce.repo
- 安装Docker CE
dnf install docker-ce
- 如果需要体验最新的实验特性,可以编辑
/etc/docker/daemon.json
设置如下
{
"experimental": true
}
- 启动Docker服务
systemctl start docker
- 检查实验模式是否激活
docker version -f '{{.Server.Experimental}}'
以往使用docker部属的的容器,在安装了docker-ce
之后,启动出现错误提示
$ docker start dev5
Error response from daemon: Unknown runtime specified oci
Error: failed to start containers: dev5
OCI即Open Container Initiative,请参考 Demystifying the Open Container Initiative (OCI) Specifications
这个问题在Fix docker Unknown runtime specified oci
error 提供了一个解决方法
- 找到存在问题容器的ID
docker ps -a
实际上可以通过docker inspect dev5
来找到这个dev5
容器的详细配置信息,其中有一条就是:
"Id": "12be884e554aea2a055687567aa4800522d8b62028854e3166d9544a3a5c5d22"
- 进入目录
/var/lib/docker/containers/<ID>
cd /var/lib/docker/containers/12be884e554aea2a055687567aa4800522d8b62028854e3166d9544a3a5c5d22
- 检查
hostconfig.json
,删除掉Runtime
属性的oci
值 - 重启docker
sudo systemctl restart docker
不过,实际上上述解决方法只是绕开功能问题,参考dockerd(stable version)参数显示默认容器的运行参数是
runc
,需要修改-default-runtime string Default OCI runtime for containers (default "runc")
通过ps aux | grep docker
检查发现,除了/usr/bin/dockerd
进程外,还有一个docker-containerd --config /var/run/docker/containerd/containerd.toml
进程。
检查/var/run/docker/containerd/containerd.toml
配置文件可以看到
[plugins]
[plugins.linux]
shim = "docker-containerd-shim"
runtime = "docker-runc"
runtime_root = "/var/lib/docker/runc"
no_shim = false
shim_debug = false
shim_no_newns = false
有关runtime
默认使用了docker-runc
插件
解决了上述Unknown runtime specified oci
,再次启动dev5
容器,又遇到新的报错
$ docker start dev5
Error response from daemon: secret store is not initialized
Error: failed to start containers: dev5
经过google,在dockered中找到了提示:
Edge only: This is the dockerd configuration reference for Docker CE Edge versions. Some of these options may not be available to Docker CE stable or Docker EE. You can view the stable version of this dockerd configuration reference or learn about Docker CE Edge.
也就是说,默认的stable版本docker ce不能够支持一些特性,需要使用edge版本。
所以修改/etc/yum.repos.d/docker-ce.repo
,关闭stable
版本仓库,启用edge
版本仓库,重新安装docker-ce
解决不了兼容以往docker容器的方法,所以还是卸载了
docker-ce
,重新安装Fedora 27提供的docker版本
rpm -e docker-ce
dnf install docker docker-common container-selinux
这个发行版安装的docker
则可以通过如下命令启动
systemctl start docker