当我使用 X11 桌面时,我可以通过共享$DISPLAY变量和/tmp/X11-unix目录在 docker 容器中运行图形应用程序。例如:
docker run -ti -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix some:ubuntu xclock
Run Code Online (Sandbox Code Playgroud)
现在,我在 Fedora 25 上运行 Wayland,所以没有 X11 基础设施与容器共享。如何在容器中启动图形应用程序,并让它显示在我的桌面上?有什么办法可以绑定 XWayland 吗?
Podman 手册页解释了卷安装/绑定:
\n\n\n像 SELinux 这样的标签系统要求在装载到容器中的卷\n内容上放置适当的标签。如果没有标签,安全系统可能\n会阻止容器内运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。
\n要更改容器上下文中的标签,您可以将两个后缀\n :z或:Z之一添加到卷装载。这些后缀告诉 Podman 重新标记共享卷上的文件\n对象。z选项告诉 Podman 两个容器共享卷内容。因此,Podman 使用共享\n内容标签来标记内容。共享卷标签允许所有容器读取/写入内容。\nZ选项告诉 Podman 使用私有非共享标签来标记内容。
\n
然而,故障排除页面用几乎相同的词语解释了同样的事情。
\n现在,对于 Podman 和 SELinux 相当陌生,想知道我实际上应该在什么时候使用什么?\n我知道,当我收到权限错误时,它们可能是由 SELinux 引起的,所以两个开关之一可以解决这个问题。但这两个选项(小写 z 和大写 Z)有什么区别呢?
\n它所说的区别是:
\n:z创建共享内容标签:Z创建私人非共享标签这引入了许多新词:
\n那么这些词在这种情况下意味着什么?\n最后一个问题:我什么时候应该使用什么?
\n我有一个 Docker 映像,当发生错误时它会生成类似日志的文件。我已使用绑定安装将其写入的目录安装到我的主机上。但是,创建的文件归root. chown尽管我的用户帐户具有 root 权限,但每次运行容器后chgrp检查文件都非常繁琐。
有没有办法让容器将文件的所有者和组设置为运行容器的用户的所有者和组?
对于某些上下文,这是我创建的一个玩具示例:
Dockerfile
FROM debian
WORKDIR /root
VOLUME /root/output
COPY run.sh /root/
ENTRYPOINT ["./run.sh"]
Run Code Online (Sandbox Code Playgroud)
运行sh
#!/bin/bash
echo hello > output/dump
Run Code Online (Sandbox Code Playgroud)
我的执行命令是
docker run -v $PWD/output:/root/output test
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Jenkins 在 Docker 容器中构建 C++ 项目。我在 Jenkins 中构建或在 Jenkins 之外的容器中构建都没有问题。
以下是我尝试过的。为清楚起见,我省略了卷映射。
情况1
以下命令在 shell 中成功运行构建。
docker run --rm --interactive=true --tty=true $IMAGE make
Run Code Online (Sandbox Code Playgroud)
但是,当在 Jenkins 中作为“执行 shell”步骤运行时,Docker 会返回以下错误。
cannot enable tty mode on non tty input
Run Code Online (Sandbox Code Playgroud)
案例二
以下命令与前一个命令类似,但禁用交互性。
docker run --rm $IMAGE make
Run Code Online (Sandbox Code Playgroud)
Jenkins 可以成功运行构建。但是,在中止构建时会出现严重的问题。构建会立即标记为中止,但容器会继续运行,直到构建完成。退出后容器也不会被移除。
在 shell 中运行时,命令会成功构建,但无法中断它。退出后容器也会被移除。
题
有谁知道如何在 Jenkins 的 Docker 容器中干净地运行构建并保留中止构建的能力?
使用任何 Jenkins 插件都不是一种选择,因为 Docker 调用在脚本内部并且无法轻松提取。
我想通过 ssh 进入我的 linux mint 18 服务器(运行 X11)并登录到 docker 容器并将 iPython matplotlib 图转发到本地客户端(也是 mint)。都在局域网内。
我发现的最接近的问题是:https : //stackoverflow.com/questions/25281992/alternatives-to-ssh-x11-forwarding-for-docker-containers
在此之后,我可以-e DISPLAY=$DISPLAY通过传递给docker run命令的选项从 docker 获取绘图 GUI 到本地机器的显示器(即 mint 服务器)。我还可以通过 ssh-X选项连接到服务器以获取xeyes客户端的窗口。
但是,如果我使用-X选项SSH 进入服务器并登录到使用 运行的容器-DISPLAY=localhost or client IP,我仍然无法获得客户端计算机的绘图。
我知道我可以使用 VNC 来解决它。但是,如何正确使用 X11 转发来做到这一点?
我对 Docker 容器内部lsof -i不产生任何输出感到有些困惑。
示例(来自容器内部的所有命令/输出):
[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
Run Code Online (Sandbox Code Playgroud)
还请注意如何不显示 PID 或程序名称netstat。fuser也给出了一些令人困惑的输出,并且也无法确定 PID。
任何人都可以对此有所了解吗?
lsof -i(还要查看进程名称!)netstat瘫痪了?注意:容器使用 运行"ExecDriver": "native-0.1",即 Docker 自己的执行层,而不是 LXC。
[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file …Run Code Online (Sandbox Code Playgroud) 在我的裸 centos6.5 系统中,它是一个docker容器,en_US.utf-8缺少语言环境:
bash-4.1# locale -a
C
POSIX
Run Code Online (Sandbox Code Playgroud)
通常在 Ubuntu 中有locale-gen执行此操作的命令:
# locale-gen en_US.UTF-8
# echo 'LANG="en_US.UTF-8"' > /etc/default/locale
Run Code Online (Sandbox Code Playgroud)
我怎么能在centos 6.5中做到这一点?
在 Docker 文档中讨论了本机 execdriver ( https://docs.docker.com/engine/reference/commandline/daemon/ )的选项。文档说
native.cgroupdriver 选项指定容器的 cgroup 的管理。您可以指定 cgroupfs 或 systemd。如果指定 systemd 并且它不可用,则系统使用 cgroupfs。默认情况下,如果没有指定选项,execdriver 首先尝试 systemd 并回退到 cgroupfs。此示例将 execdriver 设置为 cgroupfs:
我的问题是在这种情况下cgroupfs它是什么以及它如何比较systemd?谷歌搜索信息cgroupfs导致了一条推文:
--exec-opt native.cgroupdriver=cgroupfs FTW。认真的@docker,放弃对由 systemd 管理的 cgroup 的支持,这是一场灾难
但我希望有人可以提供更多关于它实际作用的详细信息,而不是仅仅说使用与默认设置不同的设置。
这就是我的 docker-compose.yml 的样子。
nginx:
container_name: 'nginx'
image: 'nginx:1.11'
restart: 'always'
ports:
- '80:80'
- '443:443'
volumes:
- '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
links:
- 'anything'
Run Code Online (Sandbox Code Playgroud)
现在我需要通过 shell 脚本(在 ubuntu 服务器上)添加一些内容。我不太确定是否有可能:
nginx/links,如果它不存在newthing如果不存在 newthing-block 则追加块新内容应如下所示:
nginx:
container_name: 'nginx'
image: 'nginx:1.11'
restart: 'always'
ports:
- '80:80'
- '443:443'
volumes:
- '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
- '/etc/letsencrypt:/etc/letsencrypt'
links:
- 'anything'
- 'newthing'
newthing:
container_name: foo
image: 'newthing:1.2.3'
restart: always
hostname: 'example.com'
Run Code Online (Sandbox Code Playgroud) 我想iptables在 Ubuntu 16.04 Docker 容器中运行该命令。我创建了一个用户,赋予该用户 root 权限,将它们添加到sudo组中,但我仍然被告知我没有iptables以 root 身份运行。
$ groups
stack root sudo
$ sudo whoami
root
$ sudo iptables --list
iptables v1.6.0: can't initialize iptables table `filter': Permission
denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
Run Code Online (Sandbox Code Playgroud)
在我的/etc/sudoers文件中,我有一行:%sudo ALL=(ALL:ALL) ALL,我相信它应该允许sudo组中的任何用户(我是)运行任何命令,但我仍然收到权限被拒绝的错误。
我如何iptables以该用户身份成功运行命令?
请注意,我在带有图像的 Docker 容器中执行此操作: ubuntu:16.04