当我apt-get dist-upgrade在 Docker 容器中运行时,我得到,
Unpacking libc6:i386 (2.31-1) over (2.30-8) ...
Setting up libc6:i386 (2.31-1) ...
Checking for services that may need to be restarted...
Checking init scripts...
Nothing to restart.
sleep: cannot read realtime clock: Operation not permitted
dpkg: error processing package libc6:i386 (--configure):
installed libc6:i386 package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
libc6:i386
E: Sub-process /usr/bin/dpkg returned an error code (1)
Run Code Online (Sandbox Code Playgroud)
libc 2.31-1 是否支持在 Debian 测试主机上的 docker 中运行,
Linux x1c7 …
我遇到了一个关于 Linux 上挂载命名空间的奇怪问题。我有两个系统,两个 X86_64 都在 Fedora 16 下运行内核 3.2.3-2。我试图tmpfs在使用以下unshare命令创建的子命名空间中挂载文件系统:
unshare -m /bin/bash
Run Code Online (Sandbox Code Playgroud)
从手册页:
mount namespace
mounting and unmounting filesystems will not affect rest of the
system (CLONE_NEWNS flag),
Run Code Online (Sandbox Code Playgroud)
在一个系统上,这按预期工作。也就是说,如果我从这个开始:
# ls /mnt
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
然后在子命名空间中挂载tmpfs文件系统/mnt:
# PS1="child# ' unshare -m /bin/bash
child# mount -t tmpfs tmpfs /mnt
Run Code Online (Sandbox Code Playgroud)
的内容/mnt在子命名空间中被屏蔽:
child# ls /mnt
child#
Run Code Online (Sandbox Code Playgroud)
但继续在父级中可见:
# ls /mnt
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
在第二个系统上,完全相同的命令序列将导致在父命名空间和子命名空间中可见的挂载。换句话说,似乎该unshare命令实际上并没有产生单独的挂载命名空间。
我不知道这两个系统之间有任何实质性差异。一个是运行桌面环境,另一个不是。SELinux 在两个系统上都被禁用。
我正在寻找有关可能导致这种行为差异的原因的任何建议。
我有一个奇怪的问题。
我无法通过 ssh 连接到具有 ip 地址的 docker 容器172.17.0.61。
我收到以下错误:
$ ssh 172.17.0.61
ssh: connect to host 172.17.0.61 port 22: Connection refused
Run Code Online (Sandbox Code Playgroud)
我的Dockerfile确实包含openssh-server安装步骤:
RUN apt-get -y install curl runit openssh-server
Run Code Online (Sandbox Code Playgroud)
并且还步骤启动 ssh:
RUN service ssh start
Run Code Online (Sandbox Code Playgroud)
可能是什么问题?
当我进入容器使用nsenter并启动ssh服务时,我就可以 ssh 了。但是在创建容器时ssh-server似乎没有开始。
我该怎么办?
我结合了原始博客文章中的详细说明和手册页中的最新说明(使用 dnf 而不是 yum)。
# sudo dnf -y --releasever=24 --installroot=$HOME/fedora-24 --disablerepo='*' --enablerepo=fedora --enablerepo=updates install systemd passwd dnf fedora-release vim-minimal
# sudo systemd-nspawn -D fedora-24
Spawning container fedora-24 on /home/alan-sysop/fedora-24
Press ^] three times within 1s to kill container.
-bash-4.3# passwd
Changing password for user root.
New password:
Retype new password:
Run Code Online (Sandbox Code Playgroud)
结果:
passwd: Authentication token manipulation error
Run Code Online (Sandbox Code Playgroud)
和 AVC 弹出窗口,即 SELinux 错误。它说passwd不允许取消链接(替换)/etc/passwd。“疑难解答”按钮的建议之一是我可以将标签分配passwd_file_t给/etc/passwd.
怎么了,我该如何解决?
我正在使用Docker in action的书,并且我已经多次看到术语“流程会计”。我处于应用程序上下文的容器化中。我想更多地了解流程会计的概念。谷歌给我找了一些财务会计的文章;我正在寻找与计算机系统相关的含义。
请您解释一下这个概念好吗?
我正在寻找输入是否预期以下与网络命名空间到期相关的观察结果,或者应该报告为错误?
/proc/<pid>/net/dev它可以防止/延迟另一个进程的命名空间到期,直到它关闭此文件。这样做不需要成为该命名空间的一部分。这似乎是非常令人惊讶的行为。它允许本地用户访问适当的proc文件来延迟/防止网络命名空间的 veth 接口的破坏。一个有问题的监控工具打开文件/proc而不关闭它们也可能导致这种情况。
(在 Debian Buster - Linux 5.4.0-0.bpo.4-amd64 上)
1)创建网络命名空间:
$ unshare -n
$ echo $BASHPID
18807
Run Code Online (Sandbox Code Playgroud)
2)创建veth并将一端移动到上面创建的网络命名空间中
$ ip link add dev veth18807 type veth peer name eth18807
$ ip link set eth18807 netns 18807
$ ip addr | grep veth
14: veth18807@if13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
Run Code Online (Sandbox Code Playgroud)
3)tail -f /proc/18807/net/dev在单独的终端中启动
$ tail -f /proc/18807/net/dev
...
tail: /proc/18807/net/dev: file truncated
...leave …Run Code Online (Sandbox Code Playgroud) 剧情简介:
pivot_root new_root put_old
问题:
为什么需要执行exec更改正在运行的可执行文件才能卸载旧的根文件系统(put_old)?
假设put_old移动到不在新根文件系统内的目录 ( new_root)。那还可以卸载吗?
为什么chroot执行后还需要pivot_root?new_root此时已经成为新的根文件系统。
pivot_root最后,如果父进程(例如bash)已从 shell 分叉,如何更改其根目录?改变不应该只影响pivot_root流程本身吗?页面中的“当前进程”是man指父进程还是pivot_root其本身?
例子:
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
Run Code Online (Sandbox Code Playgroud)
man pivot_root:
请注意,
exec chroot更改正在运行的可执行文件,如果之后应卸载旧根目录,则这是必要的。
有没有办法使用类似于debootstrapDebian/Ubuntu 的方式在 chroot 内创建 Centos 系统?我\xe2\x80\x99d 需要它用于容器项目,其中 Docker 不是解决方案(我\xe2\x80\x99d 使用 systemd 容器)。不幸的是,我\xe2\x80\x99m无法在网络上找到任何相关内容。
感谢您的帮助。
\n刚刚开始学习容器,所以我可能错过了一些东西/还没有读够,但我遇到了一种奇怪的行为,并试图了解正在发生的事情。我尝试谷歌搜索,但无法找到解释,所以我无法判断我是否遗漏了一些概念,遇到了一些限制,或者遇到了错误。
基本上,当我尝试附加到容器时,容器会停止。
我在 Fedora 33 上使用从中央存储库安装的 podman v3.1.2,并遵循官方“入门”指南(此处)。我正在用户模式下运行所有内容(例如无根)。
指南中运行的初始命令的摘要:
$ podman pull docker.io/library/httpd >/dev/null
$ podman run -dt -p 8080:80/tcp docker.io/library/httpd
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48cf6fbe988a docker.io/library/httpd httpd-foreground 23 seconds ago Up 22 seconds ago 0.0.0.0:8080->80/tcp cool_cori
$ curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
$ podman stop -l
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
$ podman rm -l
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在我试图稍微偏离指南。我想看看是否可以命名容器并附加到它并从容器内运行 bash 终端。我浏览了一下man podman-run并添加了--name和--hostname参数,这似乎没问题。另请通读man podman-attach,听起来它应该允许我在容器中获得 bash 终端,但当我使用它时,它会停止容器。
$ podman run …Run Code Online (Sandbox Code Playgroud) 我试图确定为什么在 Docker 化环境中运行的 Web 服务器消耗的内存比我预期的要多。在调查这个问题时,我发现以下行为对我来说没有意义:
docker run -d --name test ubuntu:22.04 tail -f /dev/nulldocker stats,内存使用情况报告为400KiB / 62.68GiBdocker top test,只有一个进程在运行(tail -f /dev/null )docker exec -it test sh -c 'apt update && apt install -y git && git clone https://git.savannah.gnu.org/git/emacs.git'docker stats,内存使用情况现在报告为494.9MiB / 62.68GiBdocker top test并确认仍然只有一个进程在运行 ( tail -f /dev/null)那么我的 Docker 容器中这近 500MB 的内存是用来做什么的呢?我的印象是内存被进程消耗了,但容器中只有一个进程,它不能负责。
内存使用量是来自文件系统吗?主机系统正在运行 btrfs。我使用 Docker 的默认存储驱动程序overlay2,以下是有关覆盖文件系统的信息:
% …Run Code Online (Sandbox Code Playgroud)