我通过 systemd 单元处理由 docker 容器实现的许多服务(数据库、Web 服务器...)。它可以工作,但是系统需要很长时间才能关闭,显然是在等待 docker 服务关闭。
这是我在 Debian Stretch 下使用 Docker CE 在虚拟机中制作的 systemd 单元的示例:
/lib/systemd/system/mariadb.service
[Unit]
Description=MariaDB
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --rm \
--name=mariadb \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=user \
-e MYSQL_PASSWORD=user \
-v /var/lib/mysql:/var/lib/mysql \
mariadb:latest
ExecStop=-/usr/bin/docker stop mariadb # See UPDATEs 1 & 2
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我使用 systemctl 命令时,服务会在几秒钟内正确启动和停止。但是当我关闭系统时,它显示:
持续时间超过3分钟。如果有许多容器通过 systemd 运行,则可能会更长。
该问题并非特定于 MariaDB。
有没有更好的方法来通过 systemd 处理 docker 容器,避免额外的关机时间?
更新 1:正如 Bennett Hardwick 在评论中建议的那样,我尝试从服务的定义中删除 ExecStop …
昨天升级我的系统后,我试图重新启动我的 docker 容器。我正在运行一个sbt(scala 构建工具)容器。不幸的是,它停止工作,出现以下错误
library initialization failed - unable to allocate file descriptor table - out of memory/usr/share/sbt/bin/sbt-launch-lib.bash: line 46: 76 Aborted (core dumped) "$@"
Run Code Online (Sandbox Code Playgroud)
然后我发现我 dockerized 的任何 Java 应用程序都停止工作了。所以我尝试运行一个简单的 tomcat。结果如下(在底部剪下,因为它有数百行[Too many errors, abort]
docker run -it --rm tomcat:8.0
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /docker-java-home/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
library initialization failed - unable to allocate file descriptor table - out of memory#
# A fatal error has been detected by the …Run Code Online (Sandbox Code Playgroud) 问题是什么 ?
root@hero:/home/intra# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7f12c671a23 owasp/zap2docker-stable "zap-webswing.sh" 25 minutes ago Up 25 minutes (unhealthy) 0.0.0.0:8080->8080/tcp, 0.0.0.0:8090->8090/tcp quizzical_bartik
root@hero:/home/intra# docker stop b7f12c671a23
Error response from daemon: cannot stop container: b7f12c671a23: Cannot kill container b7f12c671a23517a2c76c02e28a08af34fbe68a6709a09f5a303182656cb7c4d: unknown error after kill: runc did not terminate sucessfully: container_linux.go:388: signaling init process caused "permission denied"
: unknown
root@hero:/home/intra#
Run Code Online (Sandbox Code Playgroud) 我最近创建了一个必须拉出公共 github 存储库的 docker 容器,但是,它无法解析主机 github.com。事实上,它甚至无法执行 ping 命令。
注意:这里的所有网络操作都在构建后的容器内,当容器运行时
ping www.google.com 给 cannot resolve host
它根本无法连接到互联网。
在查看互联网和Docker 文档后
我尝试启用 IPForwarding 但无济于事。
/usr/lib/systemd/network/80-container-host0.network启用IPForwarding后的内容
...
[Network]
DHCP=yes
LinkLocalAddressing=yes
LLDP=yes
EmitLLDP=customer-bridge
IPForward=true // this line was changed
[DHCP]
UseTimezone=yes
Run Code Online (Sandbox Code Playgroud)
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
sudo service restart docker
Run Code Online (Sandbox Code Playgroud)
这个本来对这个问题有效
ubuntu 有一个解决方案,但是我的网络配置没有那个有问题的线路
我sudo …
我只是使用通常的方法更新安装在我机器上的所有软件包:
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
Run Code Online (Sandbox Code Playgroud)
重新启动系统后,我看到我的 Docker 容器从执行中消失了,然后我决定启动通常的hello-world容器。我检索到以下错误消息。
sudouser@machine:~$ sudo docker run hello-world
docker: Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: strconv.Atoi: parsing "0-beta1": invalid syntax.
ERRO[0004] error waiting for container: context canceled
Run Code Online (Sandbox Code Playgroud)
Distributor ID: Ubuntu
Description: Ubuntu Groovy Gorilla (development branch)
Release: 20.10
Codename: groovy
Kernel: GNU/Linux 5.8.0-19-generic x86_64
Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 docker 的工作原理,在使用 docker-compose 时遇到 yaml 文件的问题。
version: '3.7'
services:
portainer:
container_name: portainer
image: portainer/portainer
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: always
ports:
- "9000:9000"
hass:
container_name: hass
image: homeassistant/home-assistant
volumes:
- /home/flory/home_assistant:/config
- /etc/letsencrypt:/certs
restart: always
network_mode: host
mqtt:
container_name: mqtt
container_name: mqtt
image: eclipse-mosquitto
restart: always
volumes:
- /home/flory/mosquitto/config: /mosquitto/config
- /home/flory/mosquitto/data: /mosquitto/data
- /home/flory/mosquitto/log: /mosquitto/log
ports:
- 1883:1883
- 9000:9000
volumes:
portainer_data:
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
services.mqtt.volumes 'type' 是必需的属性。
有人可以帮我纠正这个问题吗?
我在我的 Fedora 系统上更新了 docker。在此之后,当我运行 docker 命令时,我收到错误“无法联系 docker 守护进程”。
运行systemctl status docker显示 docker 守护进程未能启动。检查 journaldjournald -xe显示以下错误:
ERROR: ZONE_CONFLICT: 'docker0' already bound to a zone
Run Code Online (Sandbox Code Playgroud) cgroup mountpoint not found for memory使用 docker.io 时如何解决?
我安装了 ubuntu-14.04,内核版本 3.13.0-20-generic。Docker 版本是 0.8.1。
我在 Windows 7 上运行boot2docker v1.2.0 并遵循了文件夹共享的说明。
我在 docker 控制台中收到消息,表明 samba 服务器正在启动,当我启动时,docker logs samba-server我得到一些看起来正在工作的输出:
docker@boot2docker:~$ docker logs samba-server
Setting up samba cfg --start my-data1 /data
add /data
Starting Samba daemons: nmbd smbd.
watching /var/log/samba/*
==> /var/log/samba/cores <==
==> /var/log/samba/log.nmbd <==
[2014/08/30 20:24:28, 0] nmbd/nmbd.c:861(main)
nmbd version 3.6.6 started.
Copyright Andrew Tridgell and the Samba Team 1992-2011
==> /var/log/samba/log.smbd <==
[2014/08/30 20:24:28, 0] smbd/server.c:1053(main)
smbd version 3.6.6 started.
Copyright Andrew Tridgell and the Samba Team 1992-2011
tail: …Run Code Online (Sandbox Code Playgroud) 我希望为一个项目实现Docker的 PoC ,但只有运行 Ubuntu 12.04(精确)的机器可用。我不确定内核版本是否足够最新以运行 Docker。
您预计我会在尝试使用这些机器时遇到什么问题?
docker ×10
linux ×3
ubuntu ×2
arch-linux ×1
debian ×1
java ×1
mqtt ×1
networking ×1
permissions ×1
samba ×1
systemd ×1
windows ×1
yaml ×1