docker on ubuntu 终止容器时出现 16.04 错误
docker on ubuntu 16.04 error when killing container
我无法终止或停止任何 docker 容器。我允许非特权用户使用 运行 Docker 命令。 docker run hello-world
工作正常。
但是我无法停止任何其他容器。
我得到以下信息:
$ docker stop 59e3b815d1dc
Error response from daemon: cannot stop container: 59e3b815d1dc:
Cannot kill container 59e3b815d1dcf2d8c8bcd3dd641c3c033b83ac68ea2f0257a32a76468af7374c:
unknown error after kill: docker-runc did not terminate sucessfully:
container_linux.go:393: signaling init process caused "permission denied"
: unknown
与 sudo 相同的错误。同时,所有容器 运行 成功,但要停止它们只能完全重启系统。
Docker 撰写示例:
# 使用 postgres/example user/password 凭据
版本:'3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
Docker 信息:
$ docker info
Containers: 7
Running: 2
Paused: 0
Stopped: 5
Images: 10
Server Version: 17.12.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9b55aab90508bd389d7654c4baf173a981477d55
runc version: 9f9c96235cc97674e935002fc3d78361b696a69e
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.4.0-116-generic
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 11.61GiB
Name: peter-pen
ID: P6FS:C76H:WIAO:LCWC:TCHT:JEYB:6W3M:HXYD:S4E2:KTUZ:2T3Q:3GPI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
AppArmor(应用程序装甲)是一个 Linux 安全模块,可保护操作系统及其应用程序免受安全威胁。要使用它,系统管理员需要将 AppArmor 安全配置文件与每个程序相关联。 Docker 期望找到加载并执行的 AppArmor 策略。检查默认配置文件:
# sudo apparmor_status
要在容器上使用 docker 默认配置文件,运行:
$ docker run --rm -it --name test-container --security-opt apparmor=docker-default image-name
您可以使用以下命令禁用它:
--security-opt apparmor=unconfined
使用 docker 运行 命令。
要禁用 apparmor 服务,请使用:
# systemctl stop apparmor && systemctl disable apparmor
对于Ubuntu 14.使用:
# service apparmor stop
# update-rc.d -f apparmor remove
建议为 Docker apparmor 设置工作配置文件而不是禁用它,尤其是对于生产设置。
查看关于使用 AppArmor 保护容器的精彩 google 文档。
https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor
此命令将停止所有 docker 个容器。
sudo killall docker-containerd-shim
此命令将删除所有 docker 个容器。
sudo docker-compose down
对我来说,从 AppArmor 中删除未知项有效:
sudo aa-remove-unknown
按照以下步骤停止容器:
禁用 apparmor 服务:
sudo systemctl disable apparmor.service --now
卸载 AppArmor 配置文件:
sudo service apparmor teardown
检查 AppArmor 状态:
sudo aa-status
您现在应该可以停止并终止您的容器了。
只需运行终端中的这条命令,所有docker运行ning容器都会停止
sudo systemctl restart docker.service
使用以下命令后,我可以再次使用 docker-compose stop
:
sudo apt-get purge --auto-remove apparmor
sudo service docker restart
docker system prune --all --volumes
这可能是由 Ubuntu 的安全性引起的,特别是 apparmor 在这种情况下,您当然可以删除系统的安全性,但这似乎太过分了。另外,似乎正在对 docker 进行一些修补,这将很快解决所有问题。
同时,您可以在 docker run
命令中添加选项 --security-opt apparmor:unconfined
。这似乎比移除 apparmor 更可取。
例如尝试:
docker run --security-opt apparmor:unconfined -ti ubuntu bash
然后尝试 docker stop
,看看现在一切正常!
很遗憾,除非您重新启动,否则您将不得不手动停止已经 运行 docker 文件这一次。一个(极端的)选择是 运行:
sudo killall -9 docker
sudo killall -9 dockerd
为了简化操作,“别名”docker...您需要确保参数位于正确的位置,例如
# in your ~/.bash_profile (~/.profile for ubuntu)
docker()
{
if [ $# -gt 0 ] && [ "" == "run" ] ; then
shift
docker run --security-opt apparmor:unconfined "$@"
else
command docker "$@"
fi
}
然后来源~/.profile
我无法终止或停止任何 docker 容器。我允许非特权用户使用 运行 Docker 命令。 docker run hello-world
工作正常。
但是我无法停止任何其他容器。
我得到以下信息:
$ docker stop 59e3b815d1dc
Error response from daemon: cannot stop container: 59e3b815d1dc:
Cannot kill container 59e3b815d1dcf2d8c8bcd3dd641c3c033b83ac68ea2f0257a32a76468af7374c:
unknown error after kill: docker-runc did not terminate sucessfully:
container_linux.go:393: signaling init process caused "permission denied"
: unknown
与 sudo 相同的错误。同时,所有容器 运行 成功,但要停止它们只能完全重启系统。
Docker 撰写示例: # 使用 postgres/example user/password 凭据 版本:'3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
Docker 信息:
$ docker info
Containers: 7
Running: 2
Paused: 0
Stopped: 5
Images: 10
Server Version: 17.12.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9b55aab90508bd389d7654c4baf173a981477d55
runc version: 9f9c96235cc97674e935002fc3d78361b696a69e
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.4.0-116-generic
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 11.61GiB
Name: peter-pen
ID: P6FS:C76H:WIAO:LCWC:TCHT:JEYB:6W3M:HXYD:S4E2:KTUZ:2T3Q:3GPI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
AppArmor(应用程序装甲)是一个 Linux 安全模块,可保护操作系统及其应用程序免受安全威胁。要使用它,系统管理员需要将 AppArmor 安全配置文件与每个程序相关联。 Docker 期望找到加载并执行的 AppArmor 策略。检查默认配置文件:
# sudo apparmor_status
要在容器上使用 docker 默认配置文件,运行:
$ docker run --rm -it --name test-container --security-opt apparmor=docker-default image-name
您可以使用以下命令禁用它:
--security-opt apparmor=unconfined
使用 docker 运行 命令。
要禁用 apparmor 服务,请使用:
# systemctl stop apparmor && systemctl disable apparmor
对于Ubuntu 14.使用:
# service apparmor stop
# update-rc.d -f apparmor remove
建议为 Docker apparmor 设置工作配置文件而不是禁用它,尤其是对于生产设置。
查看关于使用 AppArmor 保护容器的精彩 google 文档。
https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor
此命令将停止所有 docker 个容器。
sudo killall docker-containerd-shim
此命令将删除所有 docker 个容器。
sudo docker-compose down
对我来说,从 AppArmor 中删除未知项有效:
sudo aa-remove-unknown
按照以下步骤停止容器:
禁用 apparmor 服务:
sudo systemctl disable apparmor.service --now
卸载 AppArmor 配置文件:
sudo service apparmor teardown
检查 AppArmor 状态:
sudo aa-status
您现在应该可以停止并终止您的容器了。
只需运行终端中的这条命令,所有docker运行ning容器都会停止
sudo systemctl restart docker.service
使用以下命令后,我可以再次使用 docker-compose stop
:
sudo apt-get purge --auto-remove apparmor
sudo service docker restart
docker system prune --all --volumes
这可能是由 Ubuntu 的安全性引起的,特别是 apparmor 在这种情况下,您当然可以删除系统的安全性,但这似乎太过分了。另外,似乎正在对 docker 进行一些修补,这将很快解决所有问题。
同时,您可以在 docker run
命令中添加选项 --security-opt apparmor:unconfined
。这似乎比移除 apparmor 更可取。
例如尝试:
docker run --security-opt apparmor:unconfined -ti ubuntu bash
然后尝试 docker stop
,看看现在一切正常!
很遗憾,除非您重新启动,否则您将不得不手动停止已经 运行 docker 文件这一次。一个(极端的)选择是 运行:
sudo killall -9 docker
sudo killall -9 dockerd
为了简化操作,“别名”docker...您需要确保参数位于正确的位置,例如
# in your ~/.bash_profile (~/.profile for ubuntu)
docker()
{
if [ $# -gt 0 ] && [ "" == "run" ] ; then
shift
docker run --security-opt apparmor:unconfined "$@"
else
command docker "$@"
fi
}
然后来源~/.profile