我正在尝试创建一个
docker
容器,让我运行 firefox
,这样我最终就可以使用 jupyter notebook
。现在,虽然我已经成功安装了firefox
,但是我无法打开窗口。
按照 running-gui-apps-within-docker 的说明,我使用
Firefox
创建了一个图像(即“样本”),然后尝试使用 运行它
$ docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --net=host sample
当我这样做时,我收到以下错误:
root@machine:~# firefox
No protocol specified
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :1
使用
man docker run
来理解标志,我无法找到 --net
标志,尽管我确实看到了 --network
标志。然而,用 --net
替换 --network
并没有改变任何东西。如何指定一个协议,让我创建一个可以在其容器中运行的映像firefox
?
PS - 就其价值而言,当我检查 DISPLAY 的值时,我得到了可预测的结果:
~# echo $DISPLAY
:1
我已经在 docker 中运行 firefox 有一段时间了,所以这是可能的。关于安全方面,我认为以下是相关部分:
构建需要将 uid/gid 值与运行容器的用户进行匹配。我使用
UID
和 GID
构建参数来做到这一点:
...
FROM fedora:35 as runtime
ENV DISPLAY=:0
# uid and gid in container needs to match host owner of
# /tmp/.docker.xauth, so they must be passed as build arguments.
ARG UID
ARG GID
RUN \
groupadd -g ${GID} firefox && \
useradd --create-home --uid ${UID} --gid ${GID} --comment="Firefox User" firefox && \
true
...
ENTRYPOINT [ "/entrypoint.sh" ]
build:
docker pull $$(awk '/^FROM/{print $$2}' Dockerfile | sort -u)
docker build \
-t $(USER)/firefox:latest \
-t $(USER)/firefox:`date +%Y-%m-%d_%H-%M` \
--build-arg UID=`id -u` \
--build-arg GID=`id -g` \
.
#!/bin/sh
# Assumes you have run
# pactl load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
# on the host system.
PULSE_SERVER=tcp:127.0.0.1:4713
export PULSE_SERVER
if [ "$1" = /bin/bash ]
then
exec "$@"
fi
exec /usr/local/bin/su-exec firefox:firefox \
/usr/bin/xterm \
-geometry 160x15 \
/usr/bin/firefox --no-remote "$@"
所以我以专用的非root用户身份运行firefox,并通过xterm将其包装起来,这样如果firefox意外退出或想要重新启动,容器就不会死掉。拥有所有这些额外的 xterm 窗口有点烦人,但我还没有找到任何其他方法来防止意外丢失
.mozilla
目录内容(映射到一个卷将阻止运行我绝对想要的多个独立的 docker 实例,并且另外,从隐私的角度来看,我希望不拖拉很长的历史记录。每当我确实想保存某些内容时,我都会复制 .mozilla
目录并将其保存在主机上(稍后在新容器中恢复)。 )).
#!/bin/bash
export XSOCK=/tmp/.X11-unix
export XAUTH=/tmp/.docker.xauth
touch ${XAUTH}
xauth nlist ${DISPLAY} | sed -e 's/^..../ffff/' | uniq | xauth -f ${XAUTH} nmerge -
DISPLAY2=$(echo $DISPLAY | sed s/localhost//)
if [ $DISPLAY2 != $DISPLAY ]
then
export DISPLAY=$DISPLAY2
xauth nlist ${DISPLAY} | sed -e 's/^..../ffff/' | uniq | xauth -f ${XAUTH} nmerge -
fi
ARGS=$(echo $@ | sed 's/[^a-zA-Z0-9_.-]//g')
docker run -ti --rm \
--user root \
--name firefox-"$ARGS" \
--network=host \
--memory "16g" --shm-size "1g" \
--mount "type=bind,target=/home/firefox/Downloads,src=$HOME/firefox_downloads" \
-v ${XSOCK}:${XSOCK} \
-v ${XAUTH}:${XAUTH} \
-e XAUTHORITY=${XAUTH} \
-e DISPLAY=${DISPLAY} \
${USER}/firefox "$@"
有了这个,您可以运行
./run.sh https://stackoverflow.com/
并获得一个名为 firefox-httpsstackoverflow.com
的容器。如果您想登录到您的银行,与所有其他 Firefox 实例完全隔离(受操作系统进程边界保护,而不仅仅是某些内部浏览器隔离),您可以运行 ./run.sh https://yourbank.example.com/
。
尝试在 docker 主机中运行
xhost +
以允许与 X 服务器连接。
2024 年,我还想在 Docker 中做一些事情,从运行 Firefox 开始。我正准备着手创建自己的 DockerFile 来设置 Firefox 和 VNC,但幸运的是发现Jocelyn Le Sage 已经使用 Linux、Firefox 和 VNC 创建了一个非常流行的 Docker 镜像。它满足了我目前为止的所有需求,让我能够快速上手。 (甚至不需要 VNC 客户端)。
GitHub 项目: jlesage/docker-firefox
我不是专家,但它的 DockerFile 看起来具有工业实力和高品质。图像保持最新。该图像在 GitHub 上有极其的详细记录。
要运行它,我唯一要做的就是为容器化的 Firefox 创建一个本地目录来存储其配置文件。将此目录作为启动命令中的
-v
参数传递。
启动命令:
docker run -d \
--name=firefox \
-p 5800:5800 \
-v /local/path/to/dir/for/firefox:/config:rw \
jlesage/firefox
从我的浏览器访问容器化的 Firefox,网址为:
localhost:5800