先说一下 yum update 和 yum upgrade 的区别:
yum -y update : 升级所有包,包括升级软件和升级系统内核。我用的是该方式。
yum -y upgrade : 只升级所有包,不升级软件和系统内核。
OS环境:Centos7.8
内核:uname -r(yum update 升级之前) uname -r (yum update 升级以后)
3.10.0-327.el7.x86_64 3.10.0-1127.13.1.el7.x86_64
刚开始我没有执行 yum -y update,直接安装 docker 服务:
yum install -y docker
sybase-docker:docker.io/datagrip/sybase
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/datagrip/sybase Sybase 15.7 & 16.0 18 [OK]
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dd7d4e5021b datagrip/sybase "/entrypoint.sh" 20 seconds ago Created datagrip-sybase
发现端口(PORTS)没有映射成功
网上找到了解决办法,说是重启 docker 服务即可
systemctl restart docker
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dd7d4e5021b datagrip/sybase "/entrypoint.sh" 31 seconds ago Created 0.0.0.0:8000->5000/tcp, 0.0.0.0:8001->5001/tcp datagrip-sybase
重新启动容器
docker start datagrip-sybase
查看容器状态
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dd7d4e5021b datagrip/sybase "/entrypoint.sh" 50 seconds ago Up 4 seconds 0.0.0.0:8000->5000/tcp, 0.0.0.0:8001->5001/tcp datagrip-sybase
后续操作的过程中不知道为何又出现容器自动停止了(容器状态:Exited)
重新启动容器再进入容器报错
docker start datagrip-sybase
Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "process_linux.go:339: ......
网上找资料说是Linux与docker版本的兼容性问题,需要升级docker版本
查看 OS 内核版本
uname -r
3.10.0-327.el7.x86_64
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
查看 docker 版本
docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-161.git64e9980.el7_8.x86_64
Go version: go1.10.3
Git commit: 64e9980/1.13.1
Built: Tue Apr 28 14:43:01 2020
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-161.git64e9980.el7_8.x86_64
Go version: go1.10.3
Git commit: 64e9980/1.13.1
Built: Tue Apr 28 14:43:01 2020
OS/Arch: linux/amd64
Experimental: false
升级docker版本的方法参考:《Centos7上升级docker版本》
升级docker服务版本后,我docker操作的过程中碰到了问题。重新启动docker容器,还是报错:
docker start datagrip-sybase
Error response from daemon: Unknown runtime specified docker-runc
Error: failed to start containers: datagrip-sybase
执行 docker images 发现不知为何此时出现两个相同的image(REPOSITORY & TAG & IMAGE ID完全相同)
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
datagrip/sybase latest 29cd514762d6 11 months ago 5.92GB
datagrip/sybase latest 29cd514762d6 11 months ago 5.92GB
尝试删除镜像报错
docker stop datagrip-sybase #先停止容器
docker rmi 29cd514762d6
Error: No such image: 29cd514762d6
docker rmi -f $(docker images -qa)
Error: No such image: 29cd514762d6
docker rmi datagrip/sybase:latest #尝试通过 REPOSITORY:TAG 来删除还无法完全删除
最后尝试直接删镜像除物理文件
docker 镜像文件是存在/var/lib/docker/image/overlay2/imagedb/content/sha256 目录下的,sha256加密方式存储的镜像文件
cd /var/lib/docker/image/overlay2/imagedb/content/sha256
rm -rf 29cd514762d69bd7caaedc63daad32066a23e1394c11ae46e25063683128f66d
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
查看镜像终于删除了
重新加载镜像
cd /opt/sybase-img/
docker load -i sybase.tar #刚开始内存不足,出现load失败,加大内存后load成功
或
docker load < sybase.tar
重新创建并运行容器
docker run -d -ti -p 8000:5000 --name datagrip-sybase datagrip/sybase
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8076e07f5f83 datagrip/sybase "/entrypoint.sh" 7 minutes ago Up 7 minutes 0.0.0.0:8000->5000/tcp, 0.0.0.0:8001->5001/tcp datagrip-sybase
docker exec -it datagrip-sybase /bin/bash #执行该操作时还是报错 OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "read init-p: connection reset by peer": unknown
source /opt/sybase/SYBASE.sh
isql -U sa -P 1q2w3e -S MYSYBASE
尝试直接整体卸载 docker 然后重新安装试试
yum remove -y docker-ce #yum 删除 docker-ce
rm -rf /var/lib/docker #删除docker目录
重装docker-ce
yum -y install docker-ce
service docker start
cd /opt/sybase/ && docker load < sybase.tar
97ca462ad9ee: Loading layer 204.1MB/204.1MB
c2d54a859b53: Loading layer 2.318GB/2.318GB
b83283c9c6d1: Loading layer 7.984MB/7.984MB
1d83c5beeab4: Loading layer 2.56kB/2.56kB
fa2355946082: Loading layer 44.65MB/44.65MB
c10ef6de1f90: Loading layer 1.988GB/1.988GB
afe7fadcf5de: Loading layer 4.608kB/4.608kB
5af21db73a05: Loading layer 1.365GB/1.365GB
374cddce4299: Loading layer 7.168kB/7.168kB
04fa922588f1: Loading layer 200.7kB/200.7kB
d747b6167cde: Loading layer 4.096kB/4.096kB
a0f493356778: Loading layer 4.096kB/4.096kB
Loaded image: datagrip/sybase:latest
查看镜像显示正常了(只显示一个IMG)
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
datagrip/sybase latest 29cd514762d6 11 months ago 5.92GB
重新创建并运行容器
docker run -d -ti -p 8000:5000 --name datagrip-sybase datagrip/sybase
进入容器操作
docker exec -it datagrip-sybase /bin/bash #还是报错 OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "read init-p: connection reset by peer": unknown
source /opt/sybase/SYBASE.sh
isql -U sa -P passwd -S MYSYBASE
isql -U tester -P guest1234 -S MYSYBASE # cat /opt/sybase/init1.sql #init2.sql, init3.sql可以查看用户、密码和数据库
1> select * from sysservers
2> go
/opt/sybase/ASE-15_0/scripts/installpubs2
网上有人说可能是端口或网络问题
尝试 docker run 的时候加 --expose=5000 暴露端口
docker stop datagrip-sybase
docker rm datagrip-sybase
docker run -d -ti -p 8000:5000 --expose=5000 --expose=5001 --name datagrip-sybase datagrip/sybase
docker exec -it datagrip-sybase /bin/bash
还是不行
再尝试 docker run 加 --net="host" 切换成主机网络,容器和宿主机共用主机网络,如果不加--net,默认为bridge模式
docker stop datagrip-sybase
docker rm datagrip-sybase
docker run --net="host" -d -ti -p 8000:5000 --name datagrip-sybase datagrip/sybase
docker exec -it datagrip-sybase /bin/sh
OK,切换成主机网络后,问题得到解决,可能是防火墙、端口映射方面的问题,具体原因未找到(后来我再尝试删除容器、重新再创建容器,没有加--net="host",问题没有再复现)
进入容器后,查看一下监听端口是否监听在 localhost:port 上(只允许本机访问),这样的话容器的端口映射将失败,应该检查容器内部服务监听在0.0.0.0上。
sh-4.2# netstat -an |grep 5000
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
sh-4.2# exit
到这里才算恢复正常,解决了所有错误。