补充说明readme

&textColor=rgba(121,121,121,1))
Mozilla Firefox 是一款由 Mozilla 基金会及其子公司 Mozilla Corporation 开发的免费开源网页浏览器。
环境变量
为了自定义容器的某些属性,可以通过 -e
参数传递以下环境变量(每个变量一个参数)。此参数的值格式为 <VARIABLE_NAME>=<VALUE>
。
变量 |
描述 |
默认值 |
USER_ID |
应用程序运行的用户 ID。请参阅用户/组 ID以更好地了解何时应设置此值。 |
1000 |
GROUP_ID |
应用程序运行的组 ID。请参阅用户/组 ID以更好地了解何时应设置此值。 |
1000 |
SUP_GROUP_IDS |
应用程序的补充组 ID 列表,以逗号分隔。 |
(无值) |
UMASK |
控制新创建的文件和文件夹权限的掩码。掩码的值为八进制表示。默认情况下,默认 umask 值为 0022 ,意味着新创建的文件和文件夹对所有人都是可读的,但只有所有者可写。请参阅在线 umask 计算器 http://wintelguy.com/umask-calc.pl。 |
0022 |
LANG |
设置区域设置,定义应用程序的语言,如果支持。区域设置的格式为 language[_territory][.codeset] ,其中 language 是 ISO 639 语言代码,territory 是 ISO 3166 国家代码,codeset 是字符集,如 UTF-8 。例如,使用 UTF-8 编码的澳大利亚英语是 en_AU.UTF-8 。 |
en_US.UTF-8 |
TZ |
容器使用的时区。也可以通过在主机和容器之间映射 /etc/localtime 来设置时区。 |
Etc/UTC |
KEEP_APP_RUNNING |
设置为 1 时,应用程序在崩溃或终止时将自动重启。 |
0 |
APP_NICENESS |
应用程序应运行的优先级。-20 的友好值是最高优先级,19 是最低优先级。默认的友好值为 0。注意:负友好值(优先级增加)需要额外的权限。在这种情况下,容器应使用 docker 选项 --cap-add=SYS_NICE 运行。 |
0 |
INSTALL_PACKAGES |
在容器启动时要安装的软件包的空格分隔列表。可用软件包列表可在 https://pkgs.alpinelinux.org 找到。注意:安装覆盖现有容器文件(例如二进制文件)的软件包可能会影响容器的功能。 |
(无值) |
PACKAGES_MIRROR |
安装软件包时使用的存储库镜像。镜像列表可在 https://mirrors.alpinelinux.org 找到。 |
(无值) |
CONTAINER_DEBUG |
设置为 1 以启用调试日志。 |
0 |
DISPLAY_WIDTH |
应用程序窗口的宽度(以像素为单位)。 |
1920 |
DISPLAY_HEIGHT |
应用程序窗口的高度(以像素为单位)。 |
1080 |
DARK_MODE |
设置为 1 时,启用应用程序的暗模式。 |
0 |
WEB_AUDIO |
设置为 1 时,启用音频支持,这意味着应用程序产生的任何音频将通过浏览器播放。请注意,VNC 客户端不支持音频。 |
0 |
WEB_AUTHENTICATION |
设置为 1 时,通过登录页面保护应用程序的 GUI,当通过网页浏览器访问时。仅在提供有效凭据时允许访问。注意:此功能需要启用安全连接(SECURE_CONNECTION 环境变量)。 |
0 |
WEB_AUTHENTICATION_TOKEN_VALIDITY_TIME |
令牌的有效期,以小时为单位。在成功登录后为用户分配令牌。只要令牌有效,用户就可以在不需要再次登录的情况下访问应用程序的 GUI。一旦令牌过期,将再次提示登录页面。 |
24 |
WEB_AUTHENTICATION_USERNAME |
为网页身份验证配置的可选用户名。这是一种为单个用户快速配置凭据的简单方法。要以更安全的方式配置凭据,或者添加更多用户,请参阅网页身份验证部分。 |
(无值) |
WEB_AUTHENTICATION_PASSWORD |
为网页身份验证配置的可选密码。这是一种为单个用户快速配置凭据的简单方法。要以更安全的方式配置凭据,或者添加更多用户,请参阅网页身份验证部分。 |
(无值) |
SECURE_CONNECTION |
设置为 1 时,使用加密连接访问应用程序的 GUI(通过网页浏览器或 VNC 客户端)。有关更多详细信息,请参阅安全部分。 |
0 |
SECURE_CONNECTION_VNC_METHOD |
执行安全 VNC 连接所使用的方法。可能的值为 SSL 或 TLS 。有关更多详细信息,请参阅安全部分。 |
SSL |
SECURE_CONNECTION_CERTS_CHECK_INTERVAL |
系统验证网页或 VNC 证书是否更改的间隔,以秒为单位。当检测到更改时,将自动重启受影响的服务。值为 0 禁用检查。 |
60 |
WEB_LISTENING_PORT |
网页服务器用于提供应用程序 UI 的端口。此端口在容器内部使用,通常不需要更改。默认情况下,使用默认桥接网络创建容器,这意味着必须将每个内部容器端口映射到外部端口(使用 -p 或 --publish 参数)。但是,如果使用其他网络类型创建容器,更改容器使用的端口可能有助于防止与其他服务/容器的冲突。注意:值为 -1 禁用监听,意味着应用程序的 UI 将无法通过 HTTP/HTTPs 访问。 |
5800 |
VNC_LISTENING_PORT |
VNC 服务器用于提供应用程序 UI 的端口。此端口在容器内部使用,通常不需要更改。默认情况下,使用默认桥接网络创建容器,这意味着必须将每个内部容器端口映射到外部端口(使用 -p 或 --publish 参数)。但是,如果使用其他网络类型创建容器,更改容器使用的端口可能有助于防止与其他服务/容器的冲突。注意:值为 -1 禁用监听,意味着应用程序的 UI 将无法通过 VNC 访问。 |
5900 |
VNC_PASSWORD |
连接到应用程序 GUI 所需的密码。有关更多详细信息,请参阅VNC 密码部分。 |
(无值) |
ENABLE_CJK_FONT |
设置为 1 时,安装开源计算机字体 WenQuanYi Zen Hei 。此字体包含大量中文/日文/韩文字体。 |
0 |
FF_OPEN_URL |
Firefox 启动时要打开的 URL。 |
(无值) |
FF_KIOSK |
设置为 1 以启用 kiosk 模式。此模式以非常受限且有限的方式启动 Firefox,最适合公共区域或面向客户的显示。 |
0 |
FF_CUSTOM_ARGS |
启动 Firefox 时传递的自定义参数。 |
0 |
部署考虑
许多用于管理 Docker 容器的工具会提取 Docker 镜像中定义的环境变量,并使用它们来创建/部署容器。例如,这样做的工具包括:
- Synology NAS 上的 Docker 应用程序
- QNAP NAS 上的容器站
- Portainer
- 等。
虽然这可以帮助用户调整环境变量的值以满足其需求,但保留所有这些变量也可能引起混淆和危险。
一个好的做法是只设置/保留那些在特定设置中使容器按预期行为所需的变量。如果变量的值保持为其默认值,则意味着它可以被移除。请记住,所有变量都是可选的,这意味着容器启动不需要它们。
移除不需要的环境变量可以带来一些优势:
- 防止保留容器不再使用的变量。随着时间的推移,随着镜像更新,某些变量可能会被移除。
- 允许 Docker 镜像更改/修复默认值。同样,随着镜像更新,某个变量的默认值可能会被更改以修复问题,或更好地支持新功能。
- 防止更改可能影响容器正确功能的变量。一些未记录的变量,如
PATH
或 ENV
,需要被暴露,但不是让用户更改的。然而,容器管理工具仍然向用户展示这些变量。
- QNAP 上的容器站和 Synology 上的 Docker 应用程序存在一个错误,其中没有值的环境变量可能不被允许。这种行为是错误的:没有值的变量绝对是可以的。事实上,这个容器默认就有没有值的变量。因此,移除不需要的变量是防止在这些设备上部署问题的有效方法。
数据卷
下表描述了容器使用的各种数据卷。映射通过 -v
参数设置。每个映射使用以下格式指定:<HOST_DIR>:<CONTAINER_DIR>[:PERMISSIONS]
。
容器路径 |
权限 |
描述 |
/config |
rw |
这是应用程序存储其配置、状态、日志以及任何需要持久性的文件的地方。 |
端口
以下是容器使用的端口列表。
当使用默认桥接网络时,可以通过 -p
参数将端口映射到主机(每个端口映射一个参数)。每个映射以以下格式定义:<HOST_PORT>:<CONTAINER_PORT>
。容器内部使用的端口号可能无法更改,但您可以在主机端使用任何端口。
有关更多详细信息,请参阅 Docker 容器网络 文档。
端口 |
协议 |
映射到主机 |
描述 |
5800 |
TCP |
可选 |
通过网页接口访问应用程序 GUI 的端口。如果不需要通过网页接口访问,则映射到主机是可选的。对于不使用默认桥接网络的容器,可以使用 WEB_LISTENING_PORT 环境变量更改端口。 |
5900 |
TCP |
可选 |
通过 VNC 协议访问应用程序 GUI 的端口。如果不需要通过 VNC 协议访问,则映射到主机是可选的。对于不使用默认桥接网络的容器,可以使用 VNC_LISTENING_PORT 环境变量更改端口。 |
访问 GUI
假设容器的端口映射到相同的主机端口,应用程序的图形界面可以通过以下方式访问:
http://<HOST IP ADDR>:5800
<HOST IP ADDR>:5900
安全性
默认情况下,访问应用程序的 GUI 是通过未加密的连接(HTTP 或 VNC)进行的。
可以通过 SECURE_CONNECTION
环境变量启用安全连接。有关如何设置环境变量的更多详细信息,请参阅环境变量部分。
启用后,通过浏览器访问时,应用程序的 GUI 将通过 HTTPs 连接进行。所有 HTTP 访问将自动重定向到 HTTPs。
当使用 VNC 客户端时,VNC 连接将通过 SSL 进行。请注意,支持此方法的 VNC 客户端很少。SSVNC 是其中之一。
SSVNC
SSVNC 是一个为 VNC 连接添加加密安全性的 VNC 查看器。
虽然 Linux 版本的 SSVNC 运行良好,但 Windows 版本存在一些问题。在撰写本文时,最新版本 1.0.30
无法正常工作,连接时会出现以下错误:
ReadExact: Socket error while reading
然而,为了方便起见,这里提供了一个非官方但可用的版本:
https://github.com/jlesage/docker-baseimage-gui/raw/master/tools/ssvnc_windows_only-1.0.30-r1.zip
与官方版本的唯一区别是,捆绑的 stunnel
版本已升级到 5.49
,这修复了连接问题。
证书
以下是容器所需的证书文件。默认情况下,如果这些文件缺失,将生成并使用自签名证书。所有文件均为 PEM 编码的 x509 证书。
容器路径 |
用途 |
内容 |
/config/certs/vnc-server.pem |
VNC 连接加密。 |
VNC 服务器的私钥和证书,捆绑了任何根证书和中间证书。 |
/config/certs/web-privkey.pem |
HTTPs 连接加密。 |
网页服务器的私钥。 |
/config/certs/web-fullchain.pem |
HTTPs 连接加密。 |
网页服务器的证书,捆绑了任何根证书和中间证书。 |
[!TIP]
为了防止浏览器或 VNC 客户端的证书有效性警告/错误,请确保提供您自己的有效证书。
[!NOTE]
证书文件会被监控,一旦检测到更改,相关守护进程将自动重启。
VNC 密码
为了限制对应用程序的访问,可以指定一个密码。这可以通过两种方法来实现:
- 使用
VNC_PASSWORD
环境变量。
- 在
/config
卷的根目录下创建一个 .vncpass_clear
文件。该文件应包含明文密码。在容器启动期间,文件内容将被混淆并移动到 .vncpass
。
VNC 密码提供的安全级别取决于两个因素:
- 通信通道类型(加密/未加密)。
- 主机访问的安全性。
使用 VNC 密码时,强烈建议启用安全连接,以防止通过未加密通道发送明文密码。
[!CAUTION]
密码限制为 8 个字符。此限制来自远程帧缓冲协议 RFC(参见 7.2.2 节)。超出限制的任何字符都将被忽略。
Web 身份验证
可以通过登录页面保护通过 web 浏览器访问应用程序的 GUI。当启用 web 身份验证时,用户必须提供有效的凭据,否则将被拒绝访问。
可以通过将 WEB_AUTHENTICATION
环境变量设置为 1
来启用 web 身份验证。
有关如何设置环境变量的更多详细信息,请参阅 环境变量 部分。
[!IMPORTANT]
要使用 web 身份验证,必须启用安全连接。有关更多详细信息,请参阅 安全 部分。
配置用户凭据
可以使用以下两种方法来配置用户凭据:
- 通过容器环境变量。
- 通过密码数据库。
容器环境变量可用于快速且轻松地配置单个用户。用户名和密码通过以下环境变量定义:
WEB_AUTHENTICATION_USERNAME
WEB_AUTHENTICATION_PASSWORD
有关如何设置环境变量的更多详细信息,请参阅 环境变量 部分。
第二种方法更加安全,并允许配置多个用户。用户名和密码哈希被保存到位于容器内的 /config/webauth-htpasswd
的密码数据库中。此数据库文件的格式与 Apache HTTP 服务器的 htpasswd 文件相同。请注意,密码本身不会被保存到数据库中,而是只保存它们的哈希。使用 bcrypt 密码哈希函数生成哈希。
用户通过容器中包含的 webauth-user
工具进行管理:
- 添加用户密码:
docker exec -ti <容器名称或ID> webauth-user add <用户名>
。
- 更新用户密码:
docker exec -ti <容器名称或ID> webauth-user update <用户名>
。
- 删除用户:
docker exec <容器名称或ID> webauth-user del <用户名>
。
- 列出用户:
docker exec <容器名称或ID> webauth-user user
。
反向代理
以下部分包含需要添加的 NGINX 配置,以便反向代理到此容器。
反向代理服务器可以根据主机名或 URL 路径路由 HTTP 请求。
基于主机名的路由
在这种情况下,每个主机名都路由到不同的应用程序/容器。
例如,假设反向代理服务器与此容器在同一台机器上运行。服务器将所有发送到 firefox.domain.tld
的 HTTP 请求代理到容器的 127.0.0.1:5800
。
以下是需要添加到 NGINX 配置中的相关配置元素:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream docker-firefox {
# 如果反向代理服务器与 Docker 容器不在同一台机器上运行,请在此处使用 Docker 主机的 IP。
# 请确保根据容器的端口 5800 在主机上的映射情况调整端口。
server 127.0.0.1:5800;
}
server {
[...]
server_name firefox.domain.tld;
location / {
proxy_pass http://docker-firefox;
}
location /websockify {
proxy_pass http://docker-firefox;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 86400;
}
# 当启用音频支持时需要。
location /websockify-audio {
proxy_pass http://docker-firefox;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 86400;
}
}
基于 URL 路径的路由
在这种情况下,主机名相同,但使用不同的 URL 路径来路由到不同的应用程序/容器。
例如,假设反向代理服务器与此容器在同一台机器上运行。服务器将所有发送到 server.domain.tld/firefox
的 HTTP 请求代理到容器的 127.0.0.1:5800
。
以下是需要添加到 NGINX 配置中的相关配置元素:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream docker-firefox {
# 如果反向代理服务器与 Docker 容器不在同一台机器上运行,请在此处使用 Docker 主机的 IP。
# 请确保根据容器的端口 5800 在主机上的映射情况调整端口。
server 127.0.0.1:5800;
}
server {
[...]
location = /firefox {return 301 $scheme://$http_host/firefox/;}
location /firefox/ {
proxy_pass http://docker-firefox/;
# 如果您的 Nginx 服务器运行在与外部客户端看到的端口不同的端口上,请取消注释以下行。
#port_in_redirect off;
location /firefox/websockify {
proxy_pass http://docker-firefox/websockify/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 86400;
}
}
}
访问 Shell
要访问正在运行的容器的 Shell,请执行以下命令:
docker exec -ti CONTAINER sh
其中 CONTAINER
是创建容器时使用的 ID 或名称。
允许 membarrier 系统调用
为了正常工作,近期版本的 Firefox 需要 membarrier
系统调用。没有它,标签页会频繁崩溃。
Docker 使用 seccomp 配置文件 来限制容器可用的系统调用。在 Docker 版本 20.10.0
之前,默认配置文件中不允许 membarrier
系统调用。如果您运行的是这样的版本,可以使用以下解决方案之一,从最安全到最不安全,为容器提供使用此系统调用的权限:
- 使用自定义 seccomp 配置文件运行容器,允许
membarrier
系统调用。可以使用 最新的官方 seccomp 配置文件。下载该文件,然后在创建容器时添加以下参数:--security-opt seccomp=/path/to/seccomp_profile.json
。
- 运行容器时不使用默认 seccomp 配置文件(从而允许所有系统调用)。在创建容器时使用以下参数:
--security-opt seccomp=unconfined
。
- 在特权模式下运行容器。这实际上禁用了 seccomp 的使用。在创建容器时添加
--privileged
参数。
声音支持
为了让 Firefox 能够使用主机上的音频设备,必须通过在 docker run
命令中添加 --device /dev/snd
参数,将 /dev/snd
暴露给容器。
通过环境变量设置 Firefox 首选项
可以使用传递给容器的环境变量来设置 Firefox 首选项。在启动过程中,一个脚本会处理所有这些变量,并相应地修改首选项文件。
环境变量的名称必须以 FF_PREF_
开头,后跟您选择的字符串。例如,FF_PREF_MY_PREF
是一个有效的名称。
变量的内容应采用 NAME=VAL
格式,其中 NAME
是首选项的名称(如 about:config
页面中所示),VAL
是其值。值可以是以下类型之一:
请注意,类型为 字符串
的值应使用双引号括起来。其他类型不需要双引号。
例如,要设置 network.proxy.http
首选项,可以通过向 docker run
命令添加以下参数,将环境变量传递给容器:
-e "FF_PREF_HTTP_PROXY=network.proxy.http=\"proxy.example.com\""
如果需要删除某个首选项,其值应设置为 UNSET
。例如:
-e "FF_PREF_HTTP_PROXY=network.proxy.http=UNSET"
注意:这是高级用法,建议通过 Firefox 直接设置首选项。
故障排除
崩溃
如果 Firefox 频繁崩溃,请确保: