部署Docker
1.部署docker相关
此章描述在新的服务器上安装docker容器。
1.1 概述
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
1.2 软件环境配置
Centos7.0 64位
Vmware workstation 16.1
1.3 安装docker
1.3.1 yum安装
CentOS 7(使用 yum 进行安装)
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
1.3.2使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
1.3.3手动安装
卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
1.3.4使用 Docker 仓库进行安装
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
1、设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum
install -y yum-utils
device-mapper-persistent-data
lvm2
使用以下命令来设置稳定的仓库。
使用官方源地址(比较慢)
$ sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
可以选择国内的一些源地址:
阿里云
$ sudo yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学源
$ sudo yum-config-manager
--add-repo
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
2、安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
有多个 Docker 仓库吗?
如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。
Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7
docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7
docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7
docker-ce-stable
通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
启动 Docker。
$ sudo systemctl start docker
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community
$ sudo docker run hello-world
1.4 安装报错及解决
错误内容
本人安装时遇到的报错(具体以实际情况为准)
package docker-ce-3:19.03.2-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed - cannot install the best candidate for the job - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded - package containerd.io-1.2.2-3.el7.x86_64 is excluded - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded (try to add "--skip-broken" to skip uninstallable packages or "--nobest" to use not only best candidate packages) |
原因分析
containerd.io >= 1.2.2-3 ,意思是 containerd.io 的版本必须大于等于 1.2.2-3
解决
更新 containerd.io 的版本
(尝试添加"--skip-broken"以跳过可卸载的软件包,或者添加"--nobest"以不仅使用最佳候选软件包))
#下载containerd.io
wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
#安装containerd.io
yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
#继续6.2安装步骤
重新安装最新版本的docker
引用:https://www.cnblogs.com/Gdavid/p/13030007.html
1.5安装校验
docker version
显示如下信息则为安装成功
[Work-HN-001 ~]$ sudo docker version Client: Docker Engine - Community Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:46:54 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:45:28 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683 |
引用阿里巴巴镜像站社区技术文章
2、配置openresty
2.1概述
OpenResty(又称:ngx_openresty) 是一个基于 nginx的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。
OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。
OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了。
2.2 docker部署
2.2.1拉取镜像
docker pull sevenyuan/openresty
2.2.2启动openresty
docker run -id --name openresty -p 80:80 sevenyuan/openresty
2.2.3创建挂载目录
mkdir -p /opt/docker/openresty
2.2.4将容器内的初始配置拷贝
docker cp openresty:/usr/local/openresty /opt/docker/
2.2.5删除 openresty 容器
docker rm -f 容器ID
2.2.6挂载方式启动
docker run -id -p 80:80
--name openresty --restart always --privileged=true
-v /opt/docker/openresty/nginx/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
-v /opt/docker/openresty/nginx/logs:/usr/local/openresty/nginx/logs
-v /etc/localtime:/etc/localtime
sevenyuan/openresty
/etc/localtime 是用来描述本机时间
2.2.7测试是否成功
curl 127.0.0.1
3、镜像的获取与容器的使用
# 搜索镜像
docker search
# 下载镜像
docker pull
# 查看镜像
docker images # 列出images
docker images-a # 列出所有的images(包含历史)
docker rmi
# 使用镜像创建容器
docker run -i -t sauloal/ubuntu14.04
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭
docker run -itd --name centos_aways --restart=always centos #创建一个名称centos_aways的容器,自动重启
# --restart参数:always始终重启;on-failure退出状态非0时重启;默认为,no不重启
# 查看容器
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
# 再次启动容器
docker start/stop/restart
docker start [container_id] #:再次运行某个container (包括历史container)
#进入正在运行的docker容器
docker exec -it [container_id] /bin/bash
docker run -i -t -p
# 删除容器
docker rm
docker rm `docker ps -a -q` #:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
docker run 和 docker create 参数基本一样,run是创建容器并后台启动,create是只创建容器。
docker run 相当于docker create 和 docker start
run创建容器:docker run -itd
create创建: docker create -it
-t, --tty Allocate a pseudo-TTY
-i, --interactive Keep STDIN open even if not attached
-d, --detach Run container in background and print container ID #run的参数
容器资源限制参数
-m 1024m --memory-swap=1024m # 限制内存最大使用(bug:超过后进程被杀死)
--cpuset-cpus="0,1" # 限制容器使用CPU
docker容器随系统自启参数
docker run --restart=always redis
no – 默认值,如果容器挂掉不自动重启
on-failure – 当容器以非 0 码退出时重启容器
同时可接受一个可选的最大重启次数参数 (e.g. on-failure:5).
always – 不管退出码是多少都要重启
docker run -itd --name test01 -p IP:sport:dport -m 1024m --memory-swap=1024m --cpuset-cpus="0,1" --restart=always
docker exec -it test01 bash # 进入容器也可以用exec命令
查看容器状态信息
[root@localhost ~]# docker stats
[root@localhost ~]# docker stats --no-stream
3.1进入容器 - nsenter 命令
3.1.1 nsenter安装
nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
cd /usr/src ; wget https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.tar.gz
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin
3.1.2 nsenter使用
nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
PID=$(docker inspect --format "{{ .State.Pid }}"
通过这个 PID,就可以连接到这个容器:
nsenter --target $PID --mount --uts --ipc --net --pid
更简单的,建议下载 .bashrc_docker,并将内容放到 .bashrc 中。
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而
docker-enter 可以进入容器或直接在容器内执行命令。
echo $(docker-pid
docker-enter
docker-enter
3.2持久化容器与镜像
3.2.1 通过容器生成新的镜像
运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit 命令可以把一个正在运行的容器变成一个新的镜像。
docker commit
3.2.2 持久化容器
export命令用于持久化容器
docker export
3.2.3 持久化镜像
Save命令用于持久化镜像
docker save 镜像ID > /tmp/save.tar
3.2.4 导入持久化container
删除container 2161509ff65e
docker rm 2161509ff65e
导入export.tar文件
cat /tmp/export.tar | docker import - export:latest
3.2.5 导入持久化image
删除image daa11948e23d
docker rmi daa11948e23d
导入save.tar文件
docker load < /tmp/save.tar
对image打tag
docker tag daa11948e23d load:tag
3.3 export-import与save-load的区别
导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag 来回滚之前的层)。
3.4 一些其它命令
docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行
docker inspect $CONTAINER_ID #docker inspect
docker build
docker build -t repo[:tag] 同上,可以指定repo和可选的tag
docker build - <
docker port
3.5 docker文件存放目录
Docker实际上把所有东西都放到/var/lib/docker路径下了。
[root@localhost docker]# ls -F
containers/ devicemapper/ execdriver/ graph/ init/ linkgraph.db repositories-devicemapper volumes/
containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。
3.6 docker使用小技巧
3.6.1清理全部停止的docker容器
有时候我们会有很多已经停止的容器或者由于错误强制退出不能用的容器,那我们就需要删除了,但是我们一个一个的rm删除很麻烦,有多少容器就要rm多少次,我们可以根据docker ps -qa 查出所有容器的id,一次性全部删除,不用担心会删除正在运行的容器,运行中的容器rm无法删除,这样我们就一次性把所有停止的容器删除了
# 只适用于Linux环境下
docker rm $(docker ps -qa)
3.6.2查看镜像中得环境变量
当我们制作好一个镜像或者获取到一个镜像之后如果我们想知道他的环境变量,我们首先想到的就是创建容器看看就知道了,其实不必,我们可以直接通过env查看
docker run nginx env
Windows上和Linux的区别
这两种环境的区别主要原因还是docker的支持问题,我们都知道docker最开始是在Linux上发行的,依赖于Linux内核,但是Windows上没有,那么我们现在是怎么用的呢,虚拟机,如果是win10以下版本基本上装的都是VirtualBox,win10的很多都会选择桌面版的,使用的Hyper-V ,也是虚拟机的一种。只有有了虚拟机之后docker才能在windows上使用,到这里我们应该知道两种不同之处了
在Linux上docker直接就在Linux系统上的,但是在windows上不同,windows系统上是虚拟机,虚拟机上才是docker
Linux系统 << docker容器
win系统 << 虚拟机 << docker容器
也就是这种原因,导致我们在使用的过程中有略微的不同,最常见的就是开端口的时候
Linux系统:docker容器端口直接映射到Linux系统
windows系统:docker容器端口映射到虚拟机,再由虚拟机映射到我们的windows
注: 把我们虚拟机中选择网络的时候选择网络地址转换(NAT),这样我们就不用考虑中间虚拟机到windows这层的端口映射问题了
3.6.3挂载
在使用Docker的时候很多人都喜欢制作镜像,把应用直接打包到镜像中,直接启动镜像,一切OK,但是避免不了的是我们有时候会做一些细微的修改,特别是配置文件或者是一些项目中微小的修改,这种时候我们还是要重新做镜像吗?答案是不需要的,没有必要
我们前端使用nginx镜像部署,但是发布之后发现有一点样式需要微调,那么我们是不是还需要重新制作一个镜像呢,这样我们会不会感觉很麻烦(至少我会感觉很麻烦),想想我们只需要把修改过的文件把容器中的文件覆盖就行了,怎么样才能直接把修改过的文件覆盖容器中的文件,两种办法:第一直接把文件cp到容器中,这个过程我们还是要操作容器,怎么才能不动容器呢?挂载 我们可以在启动容器的时候直接把会在后面修改的东西挂载到宿主机上,这样我们就不用动容器了,启动的时候使用-v参数挂载宿主机文件或目录到容器
docker run -d -p 80:80 -v /c/Users/SunArmy/Desktop/html:/usr/share/nginx/html nginx
我们随便写一个index.html里面写上welcome nginx
把这个文件覆盖/opt/docker/html/下的index.html
再访问
重启都不需要直接OK
为什么不选择直接cp到容器中
有这样一种情况,如果你需要修改的是配置文件,这肯定是需要重启的,但是在修改的时候不小心把配置文件写错了,这个时候你的容器就起不来了,想要修改容器中的配置,那也做不到了(除非重新创建容器),换种做法,如果我们把配置文件挂载在外面当你启动不起来的时候你可以直接在宿主机上修改为正确配置重启启动即可,综上,挂载的方式比cp到容器中的方式方便且安全
3.6.4 jq工具
最后介绍一个操作json的工具,这个是在查看容器配置的时候用的,我们使用docker inspect ID查看容器配置,往往会过滤出来一些我们关注的信息,一般情况下我们会选择docker inspect --format= 或者使用grep
但是无论使用哪一种都没有我们最熟悉的操作json的方式来过滤用着爽
jq工具需要单独安装yum install jq
使用jq过滤docker inspect 获取地址
docker inspect ac |jq -r .[0].NetworkSettings.IPAddress
. 代表管道前面的输出,之后的[0]就是数组的第1个元素,后面的 . 就是类似于点出对象中的属性一样,跟我们平时使用json是一样的,jq还能方便的格式化查看json文件,对于在命令行下查看json文件简直是利器
修改Docker本地镜像和容器的存储位置
很多人都是只知道创建了容器,从来没有关注过创建的容器在哪?本地镜像在哪?
但是,当你不得不关注的时候往往就是你的docker镜像和容器把你的盘装满了
查看Docker镜像和容器存储的位置
docker info |greo Docker
默认位置就是:/var/lib/docker
修改存储位置的方法有两种:
一):通过建立软连接,把/var/lib/docker 移动到其他地方,建立到这里的软连接
# 停止docker
service docker stop
# 移动/var/lib/docker 到/usr/local/
mv /var/lib/docker /usr/local/
# 建立软连接
ln -s /usr/local/docker /var/lib/docker
# 启动Docker
service docker start
这个时候我们已经修改了,但是查看位置的时候看到的位置还是/var/lib/docker
但是这是个链接,可以查看大小发现是空的,真实的存储位置已经成为了/usr/local/docker
# 查看/var/lib/docker目录大小
du -dh /var/lib/docker
二):修改配置文件
默认配置文件/etc/docker/daemon.json
如果没有的话就自己创建
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"graph":"/opt/docker"
}
直接修改 graph 的值为你的位置然后重启,OK
启动
service docker stop
停止
service docker start
重启
service docker restart
再查看docker的存储位置,已经修改成功
4.Docker 容器配置独立IP
一般安装docker后都会通过端口转发的方式使用网络,比如 “-p 2294:22” 就将2294抓发到22端口来提供sftp服务,这样使用起来没有问题。但端口号很难记忆,如果前边有nginx等抓发工具,可以将2294再转回22,但有没有方法直接给docker容器配置独立ip地址呢?
以下两种方式都需要安装pipework
其作用是指定物理网段容器IP地址
1 2 3 4 5 6 |
cd /usr/src # 若没有wget命令,安装 yum install -y wget wget -O pipework-master.zip https://codeload.github.com/jpetazzo/pipework/zip/master # 若没有unzip命令,安装 yum install -y unzip zip unzip pipework-master.zip cp -p pipework-master/pipework /usr/local/bin/ |
以下两个种方式重启后ip地址都会丢失,所以每次重启后都要重新分配ip地址
4.1通过虚拟网卡br0桥接
4.1.1修改宿主机物理网卡配置
1 |
vi /etc/sysconfig/network-scripts/ifcfg-em1 |
修改两个配置
1 2 |
BOOTPROTO=none # 配置不启动dhcp BRIDGE=br0 # 配置网桥 |
4.1.2增加网桥设备 br0
1 |
vi /etc/sysconfig/network-scripts/ifcfg-br0 |
在其中增加如下内容
1 2 3 4 |
DEVICE=br0 ONBOOT=yes TYPE=Bridge BOOTPROTO=dhcp |
配置完成后重新启动网络,此时 br0 设备就使用的物理网卡 em1 作为桥接通信。
4.1.3创建容器(创建了一个centos7的容器)
1 |
docker run -itd --net=none --name=test01 ansible/centos7-ansible /bin/bash # 其中 --net=none不设置网络 |
4.1.4给创建的容器制定物理IP地址
1 2 |
pipework br0 test01 192.168.2.235/24@192.168.2.1 # 网桥 容器名 IP地址 网关地址 |
4.1.5进入容器查看ip地址
1 2 3 |
docker exec -it test01 /bin/bash # 进入test01容器 yum install -y net-tools # 安装ifconfig ifconfig |
此时就应该看到配置的 192.168.2.235 这个ip。
此种方法的问题是,之后每个容器都需要指定一个ip地址。
4.2通过物理网卡桥接
4.2.1 绑定物理ip
1、创建容器(创建了一个centos7的容器)
1 |
docker run -itd --net=none --name=test02 ansible/centos7-ansible /bin/bash # 其中 --net=none不设置网络 |
2、给创建的容器制定物理IP地址,其中eth0跟据实际情况修改
1 2 |
pipework eth0 test02 192.168.2.234/24@192.168.2.1 # 网桥 容器名 IP地址 网关地址 |
3、进入容器查看ip地址
1 2 3 |
docker exec -it test02 /bin/bash # 进入test01容器 yum install -y net-tools # 安装ifconfig ifconfig |
此时就应该看到配置的 192.168.2.234 这个ip。
此种方法的问题是,之后每个容器都需要指定一个ip地址。
4.2.2 使用内网地址172.x.x.x
1、创建容器(创建了一个centos7的容器)
1 |
docker run -itd --name=test03 ansible/centos7-ansible /bin/bash |
2、进入容器查看ip地址
1 2 3 |
docker exec -it test03 /bin/bash # 进入test01容器 yum install -y net-tools # 安装ifconfig ifconfig |
4.2.3重启后固定ip
以上防范重启后需要使用shell脚本的方式重新分配ip地址,也可使用 docker-static-ip 固定ip。实现与pipework一样,只是用Python把整个指定的IP的操作变成后台进程,把 [容器,网桥,IP地址,网关]写进containers.cfg 。
程序会根据配置文件来自动设置容器的IP地址,每10秒检查一次,如果有新增的就会自动设置。
当重启容器时,IP地址消失,程序会根据配置文件再次自动分配。
5、Docker服务报错
5.1 Cannot connect to the Docker datemon
1、现象:
重启docker服务报错如下:
systemctl restart docker.service
Cannot connect to the Docker datemon at tcp://0.0.0.0:2375 is the docker daemon runing?
2、解决方案:
只能重启下网卡,然后把docker文件全部干掉,这是我当时能想到的解决方案了,自己做开发测试还好,生产千万别乱搞。(注:此方案为最终解决方案,使用此方案时,一定要参考其他方案能不能解决你的问题)
service network restart
重新开机,然后删除docker安装包(注:做如下操作时,一定要提前备份,不然你docker容器中数据会全部丢失)
rm -rf /var/lib/docker
然后重新安装下docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
为避免再次出现问题,我们做如下配置
配置DOCKER_HOST
sudo vim /etc/profile.d/docker.sh
添加下面内容:
export DOCKER_HOST=tcp://localhost:2375
使配置文件生效
source /etc/profile
source /etc/bashrc
配置启动文件
sudo vim /lib/systemd/system/docker.service
修改下面语句
ExecStart=/usr/bin/dockerd -H unix://
修改为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
重载配置和重启
sudo systemctl daemon-reload
sudo systemctl restart docker.service
查看
docker version
说明已经正常。
5.2 Error response from daemon: OCI runtime create failed
现象:
docker: Error response from daemon: OCI runtime create failed
解决方案:
在新服务器上安装好docker后,发现无法运行,经常一顿搜索后,发现是docker安装的版本过高,最新版本docker-18.06 的核心好像没有经过充分的测试就发布了。
导致一运行,就提示:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused "exit status 23"": unknown.
查看内核版本
root@ebs-25698:~# docker-runc --version
runc version 1.0.0-rc5+dev.docker-18.06
commit: a592beb5bc4c4092b1b1bac971afed27687340c5
spec: 1.0.0
docker的版本是18.06,进行一个降级版本的操作就可以了。
docker版本降级方法
运行命令:apt-get install docker-ce=17.12.1~ce-0~ubuntu 进行降级,如果无法安装的话,先apt-get remove docker-ce把docker卸了再装。
安装其它版本的话,自行apt-cache policy docker-ce 查看目前可以安装的版本。
5.3 OCI runtime create failed...process_linux.go:449:
现象:
解决方案:
这是selinux未关闭所致。关闭即可。
参考文档:https://www.runoob.com/docker/centos-docker-install.html
https://www.cnblogs.com/reasonzzy/p/11378467.html
https://blog.csdn.net/zhaogot/article/details/114069916
https://www.cnblogs.com/Gdavid/p/13030007.html
https://www.cnblogs.com/seozed/p/10985003.html
https://www.cnblogs.com/xingchong/p/14810237.html
https://www.cnblogs.com/SunArmy/p/11128842.html