标签: docker

限制Docker容器的网络访问

我正在创建一个仅限 SFTP 的Docker容器,该容器将由多人使用,其唯一目的是在他们自己的chrooted 环境中上传和管理文件。

从理论上讲,它非常安全:我将禁用所有形式的bash登录,并且不会在其中运行任何其他进程。但是,我想再加强一点:

我想阻止这个容器从内部访问 Internet,除了它作为 SFTP 服务器的目的。

澄清一下:我知道如何防止外部世界访问我的容器——我可以设置传入iptables规则,并且我只能在我的 docker run 命令中公开 SFTP 端口。

但是,当容器运行时,我想让以下命令(作为示例)失败:

curl google.com
Run Code Online (Sandbox Code Playgroud)

我的目的是减少被黑容器可能造成的损害(不能用于发送垃圾邮件等)。

security ssh sftp docker

15
推荐指数
1
解决办法
1万
查看次数

Docker - 可从外部访问的暴露端口 - iptables 规则被忽略

我有一个 docker 容器运行如下:

 docker run --name some_container_1 -p 8080:80 -d some_image
Run Code Online (Sandbox Code Playgroud)

哪个工作正常。容器将它的端口 80 公开到 8080,并且可以从本地主机访问。

然而,出于某种原因,它完全忽略了 INPUT iptables 规则,并且也可以从外部访问。

如何限制对我的 Docker 容器的访问,只允许 ie IP 123.456.789.0 从外部访问它?

谢谢。


须藤 iptables -L -n -v --line-numbers

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2      365 23380 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     tcp  --  * …
Run Code Online (Sandbox Code Playgroud)

iptables docker

15
推荐指数
2
解决办法
2万
查看次数

计算 Docker 容器中允许的 CPU 数量

我的具体情况如下。我使用特定的cpuset启动一个docker容器:

docker run --cpuset-cpus="0-2" # ...
Run Code Online (Sandbox Code Playgroud)

在该容器内,我运行一个 shell 脚本作为入口点,该 shell 脚本将make在某个时候运行。我想弄清楚有多少工作(-j)。我当然可以通过环境传递已分配 CPU 的数量,但更喜欢自动检测它的方法。

我知道我可以使用taskset -c -p $$cat /proc/self/status | grep Cpus_allowed_list检索Cpus_allowed当前进程的 ,但我不知道如何检索允许的 CPU 的实际数量。我想避免解析这些命令的输出或摆弄Cpus_allowed掩码,但会在没有选项时这样做。

virtualization linux scheduling docker

15
推荐指数
1
解决办法
1万
查看次数

使用不同的物理网络接口和默认网关从 docker 容器路由

背景资料

我有一个带有两个运行 Docker 的网络接口的服务器。Docker 和一些虚拟化工具一样,创建了一个名为docker0. 默认情况下,此接口配置了一个 IP,172.17.42.1所有 Docker 容器都使用此接口作为网关进行通信,并分配了相同/16范围内的IP 地址。据我了解,所有进出容器的网络流量都经过 NAT,因此出站流量似乎来自172.17.42.1,入站流量则发送到172.17.42.1.

我的设置看起来像这样:

                                          +------------+        /
                                          |            |       |
                            +-------------+ Gateway 1  +-------
                            |             | 10.1.1.1   |     /
                     +------+-------+     +------------+    |
                     |     eth0     |                      /
                     |   10.1.1.2   |                      |
                     |              |                      |
                     | DOCKER HOST  |                      |
                     |              |                      | Internet
                     |   docker0    |                      |
                     |   (bridge)   |                      |
                     |  172.17.42.1 |                      |
                     |              |                      |
                     |     eth1     |                      |
                     |  192.168.1.2 …
Run Code Online (Sandbox Code Playgroud)

route gateway source bridge docker

15
推荐指数
2
解决办法
2万
查看次数

在 docker 容器内运行 systemd (arch linux)

我正在尝试查看是否可以在 docker 容器(在容器中运行 arch linux)中运行 systemd。

我启动 docker 的所有功能,并在 cgroups 中绑定 mount:

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试运行 systemd 二进制文件:

Trying to run as user instance, but the system has not been booted with systemd.
Run Code Online (Sandbox Code Playgroud)

试图找出如何正确地将东西初始化到 systemd 开始。

arch-linux systemd docker

14
推荐指数
2
解决办法
4万
查看次数

Docker 运行不将参数附加到图像入口点

我有一个 Dockerfile:

ENTRYPOINT ["uwsgi", "--ini /home/docker/app/uwsgi_app.ini"]
Run Code Online (Sandbox Code Playgroud)

(没有CMD

当我运行时 uwsgi 正确地抱怨:

uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
Run Code Online (Sandbox Code Playgroud)

现在,我认为我可以通过docker run如下方式将参数附加到入口点:

$ docker run -itP uwsgi_app:0.1 --uid=docker
Run Code Online (Sandbox Code Playgroud)

然而 uwsgi 仍然抱怨同样的错误,似乎没有附加 arg。

如果我覆盖入口点,则添加 arg:

$ docker run -itP --entrypoint bash uwsgi_app:0.1 --uid=docker
bash: --uid=docker: invalid option
Run Code Online (Sandbox Code Playgroud)

...我想知道这是否是 uwsgi--ini忽略其他参数的选项,但事实并非如此:

$ docker run -itP --entrypoint bash uwsgi_app:0.1
[ root@88941de25b1f:/home/docker ]$ uwsgi --ini /home/docker/app/uwsgi_app.ini …
Run Code Online (Sandbox Code Playgroud)

docker

14
推荐指数
1
解决办法
3万
查看次数

Docker下的api-get“从服务器读取错误”

我在 Bash 中运行以下命令:

DEBIAN_FRONTEND=noninteractive apt-get update -qq \
  && apt-get install -y build-essential git libncurses5-dev openssl \
     libssl-dev  fop xsltproc unixodbc-dev curl
Run Code Online (Sandbox Code Playgroud)

它运行,但在中间失败:

Get:96 http://security.debian.org/ jessie/updates/main linux-libc-dev amd64 3.16.7-ckt9-3~deb8u1 [991 kB]
Get:97 http://security.debian.org/ jessie/updates/main curl amd64 7.38.0-4+deb8u2 [200 kB]
Get:98 http://security.debian.org/ jessie/updates/main openjdk-7-jre amd64 7u79-2.5.5-1~deb8u1 [176 kB]
Get:99 http://http.debian.net/debian/ jessie/main libgtk2.0-0 amd64 2.24.25-3 [2301 kB]
Err http://http.debian.net/debian/ jessie/main dpkg-dev all 1.17.25
  Error reading from server. Remote end closed connection [IP: 176.9.184.93 80]
Get:100 http://http.debian.net/debian/ jessie/main libatk-wrapper-java all 0.30.5-1 [30.3 kB] …
Run Code Online (Sandbox Code Playgroud)

debian docker

14
推荐指数
1
解决办法
4365
查看次数

没有来自 docker 容器的 IPv6 连接

我在 docker 中启用 IPv6 时遇到了严重的问题。

环境

  • 主机正在运行 Debian Jessie。
  • 它是一个虚拟服务器 (KVM)。
  • eth0 在像 w:xy:z::/64 这样的网络中有一个像 w:x:y:z::1 这样的静态配置地址,它是由我的托管公司分配给我的。
  • 我的主机能够毫无问题地使用 IPv6:Ping 外部世界有效,可以通过 ipv6 访问在容器上运行的网站(端口 80 绑定到主机:80)。

问题

但是,我无法从容器内访问外部世界!使用以下参数重新启动 docker 后,我的 docker0 网桥没有 IPv6 地址。也没有路由,也没有网关(没有 ipv6 地址就没有意义)。

我的 Docker 设置:Docker 是使用 DOCKER_OPTS 中的这些参数启动的

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=w:x:y:z:a::/80"
Run Code Online (Sandbox Code Playgroud)

一些 ipv6 主机配置参数:

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
Run Code Online (Sandbox Code Playgroud)

这是我自己创建的网络之一:

root@wopr:~# docker network inspect wopr6
[
    {
        "Name": "wopr6",
        "Id": "ddc192d4af2a8edc809975e84cf3e4cb82c24d4cfe970dd8e3fc7d6ff31e20ee",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": …
Run Code Online (Sandbox Code Playgroud)

networking debian ipv6 docker

14
推荐指数
1
解决办法
6800
查看次数

AWS ECS 上的CannotPullContainerError

编辑容器图像

我无法完全理解的 AWS ECS Docker Hub 映像的映像[registry-url]/[namespace]/[image]:[tag]URL 。

使用 Docker 客户端,它只是docker run -it hendry/count.

那么 Docker Hub 的镜像 URL 是什么?

docker amazon-ecs

14
推荐指数
2
解决办法
4949
查看次数

如何将 docker 图像移动到 Windows 中的其他驱动器

我尝试运行以下脚本,dockerd在我的工作站中无法识别。

我的操作系统是 windows 10。刚刚安装了最新版本的 docker,即 18.09.2

这是我第一次使用 docker。

windows docker

14
推荐指数
3
解决办法
2万
查看次数