gpt4 book ai didi

docker - 为多个用户实现 Docker 隔离

转载 作者:行者123 更新时间:2023-12-02 11:29:28 26 4
gpt4 key购买 nike

我被要求为多个用户配置一个带有 docker 的 ubuntu 18.04 服务器。
目的:
我们有多个编写测试用例的测试人员。但是我们的笔记本电脑速度不够快,无法在 docker 环境中构建项目和运行 tescase。
我们已经有一个 Jenkins 服务器。但是我们需要在推送到 git 之前构建/测试我们的代码。
我得到了一个高端的 ubuntu 18.04 服务器。
我必须配置服务器,我们所有的测试人员都可以在隔离环境中运行/调试我们的测试用例。
当测试人员将更改推送到远程服务器时,项目应该在隔离的环境中构建和运行。多个用户可以在同一个项目上工作,但一个测试人员构建不得影响另一个。
我已经安装了 Docker 并尝试只更改 docker-compose.yml 并添加不同的网络(当然使用多个帐户)。但这非常痛苦。
我需要有多个 selenoid 服务器(针对不同的用户),使用 docker 进行不同的魅力报告,需要能够使用我们的 docker-compose 文件构建和运行测试,并且需要能够在不同的端口上运行实际项目,这样我们才能通过系统在编写测试用例时。
是否可以在不更改项目 docker-compose.yml 的情况下配置环境?
我应该采取什么方法?

最佳答案

您可以使用 Docker 中的 Docker( docker:dind 图像)在同一主机上运行多个 Docker 守护程序实例,并让每个测试人员使用不同的 DOCKER_HOST运行他们的 Compose 堆栈。每个应用程序实例将部署在单独的 Docker 守护程序上并隔离,无需对 docker-compose.yml 进行任何更改.
Docker 中的 Docker 可用于从另一个 Docker 守护进程运行 Docker 守护进程。 (Docker daemon 是使用 docker 时实际管理容器的进程)。见 Docker architectureDinD original blogpost详情。

示例:运行 2 个暴露应用程序端口的 Docker 守护进程
让我们用这个 docker-compose.yml 来考虑 2 个测试人员:

version: 3
services:
app:
image: my/app:latest
ports:
- 8080:80
  • 运行 2 个 Docker 守护程序实例,暴露守护程序端口 以及将被 Docker Compose 公开的任何端口(见下文)
  • # Run docker dind and map port 23751 on localhost
    # Expose Daemon 8080 on 8081 (port that will be used by Tester1)
    # privileged is required to run dind (see dind-rootless exists but is experimental)
    # DOCKER_TLS_CERTDIR="" is to deploy an unsecure Daemon
    # it's easier to use but should only be used for testing/dev purposes
    docker run -d \
    -p 23751:2375 \
    -p 8081:8080 \
    --privileged \
    --name dockerd-tester1 \
    -e DOCKER_TLS_CERTDIR=""
    docker:dind

    # Second Daemon using port 23752
    docker run -d \
    -p 23752:2375 \
    -p 8082:8080 \
    --privileged \
    --name dockerd-tester2 \
    -e DOCKER_TLS_CERTDIR=""
    docker:dind
  • 每个测试人员可以通过设置 DOCKER_HOST 在他们的 Docker 守护进程上运行他们自己的堆栈。环境变量:
  • # Tester 1 shell
    # use dockerd-tester1 daemon on port 23751
    export DOCKER_HOST=tcp://localhost:23751

    # run our stack
    docker-compose up -d
    dockerd-tester2 上的测试仪 2 相同港口:
    # Tester 2 shell
    export DOCKER_HOST=tcp://localhost:23752
    docker-compose up -d
  • 与测试人员 1 和 2 的堆栈交互

  • Need the ability to build and run tests using our docker-compose files and need the ability to run the actual project on different ports


    每个测试人员的暴露端口 将在 Docker 守护进程主机 上公开可通过 http://$DOCKER_HOST:$APP_PORT 联系而不是 localhost:$APP_PORT (这就是为什么我们还在每个守护进程上暴露了应用程序端口)。
    考虑到我们的 docker-compose.yml ,测试人员将能够访问应用程序,例如:
    # Tester 1
    # port 8081 is linked to port 8080 of Docker daemon running our app container
    # itself redirect on port 8080
    # in short: 8081 -> 8080 -> 80
    curl localhost:8081

    # Tester 2
    # 8082 -> 8080 -> 80
    curl localhost:8082
    我们的部署将如下所示
    enter image description here

    不暴露端口的替代方案,直接使用 Docker 守护进程 IP
    与第一个示例类似,您也可以直接使用 Docker 守护进程 IP 与部署的应用程序进行交互:
    # Run daemon without exposing ports
    docker run -d \
    --privileged \
    --name dockerd-tester1 \
    -e DOCKER_TLS_CERTDIR=""
    docker:dind

    # Retrieve daemon IP
    docker inspect --format '{{ .NetworkSettings.IPAddress }}' dockerd-tester1
    # output like 172.17.0.2

    # use it!
    export DOCKER_HOST=172.17.0.2
    docker-compose up -d

    # our app port are exposed on Daemon
    curl 172.17.0.2:8080
    我们通过它的 IP 直接联系了我们的守护进程,而不是在 localhost 上暴露它的端口。

    您甚至可以在 docker-compose.yml 中使用静态 IP 定义 Docker 守护进程。如:
    version: "3"

    services:
    dockerd-tester1:
    image: docker:dind
    privileged: true
    environment:
    DOCKER_TLS_CERTDIR: ""
    networks:
    dind-net:
    # static IP to set as DOCKER_HOST
    ipv4_address: 10.5.0.6

    # same for dockerd-tester2
    # ...

    networks:
    dind-net:
    driver: bridge
    ipam:
    config:
    - subnet: 10.5.0.0/16
    进而
    export DOCKER_HOST=10.5.0.6
    # ...

    笔记:
  • 这可能会对性能产生一些影响,具体取决于部署守护进程的机器
  • 您可以使用 dind-rootless而不是 dind避免使用 --privileged旗帜
  • 最好避开DOCKER_TLS_CERTDIR: ""出于安全原因,请参阅 TLS instruction on docker image TLS的详细使用
  • 关于docker - 为多个用户实现 Docker 隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62776310/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com