docker on ubuntu 16.04 error when killing container
我无法杀死或停止任何 docker 容器。我已经允许非特权用户运行 Docker 命令。
但我无法停止任何其他容器。
我得到了关注:
1 2 3 4 5 6 | $ 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 用户/密码凭证
版本:\\'3.1\\'
1 2 3 4 5 6 7 8 9 10 11 12 13 | services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: example adminer: image: adminer restart: always ports: - 8080:8080 |
Docker信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | $ 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 作品中移除未知:
1 | sudo aa-remove-unknown |
AppArmor (Application Armor) 是一个 Linux 安全模块,可保护操作系统及其应用程序免受安全威胁。为了使用它,系统管理员将 AppArmor 安全配置文件与每个程序相关联。 Docker 期望找到加载和执行的 AppArmor 策略。检查默认配置文件:
1 | # sudo apparmor_status |
要在容器上使用 docker 默认配置文件,请运行:
1 | $ docker run --rm -it --name test-container --security-opt apparmor=docker-default image-name |
您可以使用以下命令禁用它:
1 | --security-opt apparmor=unconfined |
使用 docker run 命令。
要禁用 apparmor 服务,请使用:
1 | # systemctl stop apparmor && systemctl disable apparmor |
对于 Ubuntu 14。使用:
1 2 | # service apparmor stop # update-rc.d -f apparmor remove |
建议为 Docker apparmor 设置工作配置文件而不是禁用它,尤其是对于生产设置。
查看这个关于使用 AppArmor 保护容器的精彩谷歌文档。
https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor
此命令将停止所有 docker 容器。
1 | sudo killall docker-containerd-shim |
此命令将删除所有 docker 容器。
1 | sudo docker-compose down |
只要在终端运行这个命令,所有docker运行的容器都会停止
1 | sudo systemctl restart docker.service |
按照以下步骤可以停止容器:
禁用apparmor服务:
1 | sudo systemctl disable apparmor.service --now |
卸载 AppArmor 配置文件:
检查 AppArmor 状态:
你现在应该可以停止并杀死你的容器了。
学分
这可能是由 Ubuntu\\ 的安全性特别是 apparmor 引起的。在这种情况下,您当然可以删除系统的安全性,但这似乎很激烈。另外,似乎正在对 docker 进行一些修补,这将很快解决所有问题。
同时,您可以在
例如尝试:
1 | docker run --security-opt apparmor:unconfined -ti ubuntu bash |
然后尝试
不幸的是,除非您重新启动,否则您将不得不手动停止已经运行的 dockerfile 一次。一个(极端的)选择是运行:
1 2 | sudo killall -9 docker sudo killall -9 dockerd |
为了方便起见,"alias" docker... 你需要确保参数放到正确的位置,例如
1 2 3 4 5 6 7 8 9 10 | # in your ~/.bash_profile (~/.profile for ubuntu) docker() { if [ $# -gt 0 ] && ["$1" =="run" ] ; then shift docker run --security-opt apparmor:unconfined"$@" else command docker"$@" fi } |
然后来源
使用以下命令后,我可以再次使用
1 2 3 | sudo apt-get purge --auto-remove apparmor sudo service docker restart docker system prune --all --volumes |