有没有办法授予用户(确切地说是www-data)访问权限以仅访问“docker检查”?任何可行的解决方案都是可以接受的
通过/etc/docker/daemon.json
,我使用配置了用户命名空间userns-remap
。我正在尝试启动一个nginx-proxy
容器,但它需要访问 Docker 套接字,这要求它是真正的root。命名空间破坏了这一点,导致"operation not permitted"
错误。
有没有一种方法可以告诉 Docker 不要将这个单独的容器放在命名空间中?如果可以通过 docker-compose 实现,那就更好了。
在 Centos 7.4 上,我正在设置一个群,我想在其中运行多个可在端口 80/443 上访问的路由器。
目的是在单个集群上托管多个环境(测试/登台...),所有环境都是对称的。
我使用 Docker 17.12.0-ce 和 Traefik v1.4.6 作为路由器。
基本思想是每个环境都有一个虚拟 IP 地址,并仅在该地址上发布 Traefik 端口。这对于 Docker swarm 来说是不可能的,所以我必须让 Traefik 实例监听端口 81/82 等,并以某种方式将流量从 VIP:80 带到 :81/:82。
集群管理器中所有环境的虚拟 IP 地址均由 Keepalived 处理。
Traefik 的相关 docker 服务配置:
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 81,
"PublishMode": "ingress"
},
# netstat -anp|grep 81
tcp6 7 0 :::81 :::* LISTEN 4578/dockerd
Run Code Online (Sandbox Code Playgroud)
firewalld 设置为允许流量到达端口 80、81、82 等
直接在 VIP 上的 81 端口访问 Traefik 公开的后端服务是可行的。
在未正确配置任何内容的情况下访问 VIP 上的 80 端口会导致连接被拒绝
Traefik docker 实例运行在我用于以下测试的同一主机上。 …
我们正在为 jenkins master 运行一个 docker 容器,它每 3 天就会以“exitcode 137”退出。我们必须重新启动 EC2 并启动映像才能使其再次运行。仅仅重新启动容器是行不通的。
退出容器上的 docker 检查为我们提供了以下信息: "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead":假,“Pid”:0,“退出代码”:137,“错误”:“”,“开始时间”:“2019-09-05T11:00:29.683406065Z”,“完成时间”:“2019-09-05T13:24 :26.336749715Z”
EC2 是一个 m5a.large 实例,具有 8GB 内存,正在运行的容器上的 docker stats 给了我这样的信息: CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 88530703bf01 xenodochial_chandrasekhar 0.58% 1.092GiB / 7.546 GiB 14.47% 3.12MB / 6.67MB 368MB / 11.3MB 0
内存使用量显示为 1.092GiB / 7.546GiB,这意味着内存上限是主机内存 8GB,并且 oomkilled 为 false。
docker log 命令不显示太多信息。
还有其他人遇到过这个问题吗?我们如何知道容器退出的原因呢?
我的团队一直在运行在 VirtualBox 上的 Ubuntu 16.04 服务器上开发我们的项目。当新开发人员加入我们的项目时,帮助他们在 VirtualBox 上创建新的 Ubuntu 服务器并安装所有依赖项只是为了每次启动项目,这对我们来说是一个很大的麻烦。
我们决定用 Docker 解决这个麻烦。因此,我正在尝试使用以下Dockerfile
和docker-compose.yml
,在 Docker 上的 Ubuntu 上运行我们的项目,但我找不到很多资源,例如how to run Ubuntu on Docker
. 我是否会按照以下方式在 Docker 上运行 Ubuntu 的正确方向?
我感到困惑的一件事是为什么当我ifconfig
在 Docker 上运行的 Ubuntu 服务器上运行时无法获取 IP 地址?
文件
FROM ubuntu:16.04
RUN sudo apt-get update
RUN sudo apt-get install -y build-essential autoconf libtool
RUN sudo apt-get install -y python-setuptools python-dev python3-dev
RUN sudo apt-get install -y python-pip python3-pip
RUN sudo apt-get install -y python-virtualenv unixodbc-dev libffi-dev …
Run Code Online (Sandbox Code Playgroud) 我有一个通过 docker-compose 文件创建的新应用程序。该文件包含2个网络:
version: '2.1'
# ----------------------------------
# Services
# ----------------------------------
services:
application:
image: tianon/true
volumes:
- ${APPLICATION_PATH}:/var/www
nginx:
build:
context: ./docker/nginx
volumes_from:
- application
volumes:
- ${DOCKER_STORAGE}/nginx-logs:/var/log/nginx
- ${NGINX_SITES_PATH}:/etc/nginx/sites-available
ports:
- "${NGINX_HTTP_PORT}:80"
- "${NGINX_HTTPS_PORT}:443"
networks:
- frontend
- backend
redis:
build:
context: ./docker/redis
volumes:
- ${DOCKER_STORAGE}/redis:/data
ports:
- "${REDIS_PORT}:6379"
networks:
- backend
# ----------------------------------
# Networks
# ----------------------------------
networks:
frontend:
driver: "bridge"
backend:
driver: "bridge"
# ----------------------------------
# Volumes
# ----------------------------------
volumes:
redis:
driver: "local"
Run Code Online (Sandbox Code Playgroud)
您会注意到我这里有 2 个网络,frontend …
我的 docker 安装有问题。出于某些安全原因,我配置了我的“daemon.json”,将命名空间切换到另一个用户 ( userns-remap
)。现在我遇到的问题是,如果我运行一个容器(使用切换的用户上下文 ( USER containeruser
) 并尝试 ping 同一个容器网络中的另一个容器,我会收到以下错误:
$ ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3): 56 data bytes
ping: permission denied (are you root?)
Run Code Online (Sandbox Code Playgroud)
我已经用 AppArmor 尝试了一些东西,分配更多的功能等等。但没有任何帮助来解决这个问题。
运行镜像是一个没有任何修改的 alpine linux。
你有解决我的问题的方法吗?
我正在尝试为我们创建的 centos 服务之一创建 docker 容器。
我们有 2 个 rpm 文件。
在 centos 8 的基础镜像上安装后。
我在其中安装了这 2 个 rpm 文件。
但是,当我尝试启动该服务时,出现此错误。当我运行 systemctl start <service_name> 时
系统尚未使用 systemd 作为 init 系统 (PID 1) 进行引导。无法操作
无法连接到总线:主机已关闭
根据不同帖子的反馈,我尝试通过以下步骤创建容器。
docker run -it -p 8080:80 -p 16700:16700 centos
docker run -it -p 8080:80 -p 16700:16700 --privileged=true centos
两者相同的问题。请建议。
在我连接到docker exec -ti
的 docker 退出后,如何优雅地退出我已经连接到的 docker 容器?
如果我退出原始容器,则运行该docker exec
命令的 shell会挂起,我能找到退出回其 shell 的唯一方法是docker exec
从另一个终端终止该命令。
有没有更优雅的方式?
无论我是否启动容器,都会发生这种情况--rm
。
我在 Ubuntu 20.04 的 gnome-terminal 3.26.3 中的 bash 5.0.16 下运行 docker 19.03.12。
我已经在 Amazon Linux 2 上设置了 Fail2Ban,使用nginx-http-auth
以下覆盖配置启用内置监狱:
[nginx-http-auth]
enabled = true
action = iptables[name=HTTPS, port=https, protocol=tcp]
logpath = <snip>/logs/*error*.log
findtime = 15m
bantime = 15m
maxretry = 5
Run Code Online (Sandbox Code Playgroud)
该操作正在触发,我收到以下条目iptables -S
:
-A f2b-HTTPS -s 120.<snip>.122/32 -j REJECT --reject-with icmp-port-unreachable
Run Code Online (Sandbox Code Playgroud)
但是,我可以继续从被禁止的 IP 发出新的 HTTPS 请求,这些请求正在接收来自 Nginx 的 401 响应。我从两个 IP 地址进行复制 - 我的手机和另一个 EC2 主机。
以下是完整输出iptables -L
:(注意:Nginx 在 Docker 内部运行,另外两个与本地网络隔离的容器也是如此)
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-HTTPS tcp -- anywhere anywhere tcp dpt:https
Chain …
Run Code Online (Sandbox Code Playgroud)