루스트어바웃

루스트어바웃

100개의 가상 서버를 만들고 싶습니다. 테스트용으로 사용되므로 생성 및 삭제가 쉬워야 합니다.

  • 다른 물리적 시스템에서 SSH를 통해 액세스할 수 있어야 합니다(공개 SSH 키 제공).
  • 자체 IP 주소가 있어야 하며 다른 물리적 호스트에서 액세스할 수 있어야 합니다 ssh I.P.n.o( 예: ssh 10.0.0.99IPv4 또는 IPv6, 개인 주소 공간은 허용, 포트 전달은 불가능하므로 브리지 설정이 필요할 수 있음).
  • 기본 UNIX 도구가 설치되어 있어야 합니다(전체 배포 권장).
  • /proc/cpuinfo, 루트 사용자 및 네트워크 카드가 있어야 합니다(머신이 완전히 가상화되지 않은 경우에만 관련될 수 있음).
  • 원격으로 연결할 수 있는 X 서버를 실행하도록 할 수 있는 경우(VNC 또는 이와 유사한 사용) 보너스

주어진 가장 빠른 방법(벽시계 시간)은 무엇입니까?

  • 호스트 시스템은 Ubuntu 20.04를 실행하며 충분한 RAM과 CPU를 갖추고 있습니다.
  • LAN에는 DHCP 서버가 있습니다(미리 정의된 IP 범위도 사용할 수 있음).
  • 어떤 무료 가상화 기술을 사용하든 상관없습니다(다른 요구사항만 충족하면 컨테이너화도 괜찮습니다)

어떤 실제 명령을 실행해야 하며 어떤 파일을 생성해야 합니까?

제 생각에는 올바른 기술을 사용하면 이 50라인 작업을 몇 분 안에 완료할 수 있을 것 같습니다.

이 줄은 아마도 여러 bash 함수로 나눌 수 있습니다:

install() {
  # Install needed software once
}
setup() {
  # Configure the virtual servers
}
start() {
  # Start the virtual servers
  # After this it is possible to do:
  #   ssh 10.0.0.99
  # from another physical server
}
stop() {
  # Stop the virtual servers
  # After there is no running processes on the host server
  # and after this it is no longer possible to do:
  #   ssh 10.0.0.99
  # from another physical server
  # The host server returns to the state before running `start`
}
destroy() {
  # Remove the setup
  # After this the host server returns to the state before running `setup`
}

배경

GNU Parallel을 개발하려면 100대의 컴퓨터에서 병렬로 실행을 테스트할 수 있는 간단한 방법이 필요했습니다.

다른 프로젝트의 경우 여러 개의 가상 머신을 생성하고 일부 경쟁 조건을 테스트한 다음 머신을 다시 파괴할 수 있으면 편리할 것입니다.

즉, 이는 프로덕션 환경에 적합하지 않으며 보안은 문제가 되지 않습니다.

루스트어바웃

@danielleontiev의 다음 의견을 바탕으로 합니다.

install() {
    # Install needed software once
    sudo apt -y install docker.io
    sudo groupadd docker
    sudo usermod -aG docker $USER
    # Logout and login if you were not in group 'docker' before
    docker run hello-world
}

setup() {
    # Configure the virtual servers
    mkdir -p my-ubuntu/ ssh/
    cp ~/.ssh/id_rsa.pub ssh/
    cat ssh/*.pub > my-ubuntu/authorized_keys
    cat >my-ubuntu/Dockerfile <<EOF
FROM ubuntu:bionic
RUN apt update && \
    apt install -y openssh-server
RUN mkdir /root/.ssh
COPY authorized_keys /root/.ssh/authorized_keys
# run blocking command which prevents container to exit immediately after start.
CMD service ssh start && tail -f /dev/null
EOF
    docker build my-ubuntu -t my-ubuntu
}

start() {
    # start container number x..y
    servers_min=$1
    servers_max=$2
    
    testssh() {
        ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/tmp/known root@"$1" echo "'$1'" '`uptime`'
    }
    export -f testssh
    setup_bridge() {
    # OMG why is this so hard
    # Default interface must have IP-addr removed
    # bridge must have IP-addr + routing copied from $dif, so it takes over default interface
    # Why on earth could we not just: brctl addif dock0 $dif - and be done?
    default_interface=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
    dif=$default_interface
    gw=$(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')
    dif_ip=$(ip -4 route ls | grep default | grep -Po '(?<=src )(\S+)')
    echo Add bridge
    docker network create --driver bridge --subnet=172.20.0.0/16 --opt com.docker.network.bridge.name=dock0 net0
    # $dif must be up, but with no ip addr
    sudo ip addr flush dev $dif
    sudo brctl addif dock0 $dif
    sudo ifconfig dock0:ext $dif_ip
    sudo route add -net 0.0.0.0 gw $gw
    }
    # Start the containers
    startone() {
    id=$1
    net=$2
        docker run -d --rm --name ubuntu-$id-$net --network $net my-ubuntu
    docker inspect ubuntu-$id-$net
    }
    export -f startone

    setup_bridge
    echo Start containers
    seq $servers_min $servers_max | parallel startone {} net0 |
        # After this it is possible to do:
        #   ssh 10.0.0.99
        # from another physical server
        perl -nE '/"IPAddress": "(\S+)"/ and not $seen{$1}++ and say $1' |
    # Keep a list of the IP addresses in /tmp/ipaddr
    tee /tmp/ipaddr |
        parallel testssh
    docker ps
    route -n
}

stop() {
    # Stop the virtual servers
    # After there is no running processes on the host server
    # and after this it is no longer possible to do:
    #   ssh 10.0.0.99
    # from another physical server
    # The host server returns to the state before running `start`
    echo Stop containers
    docker ps -q | parallel docker stop {} |
    perl -pe '$|=1; s/^............\n$/./'
    echo
    echo If any containers are remaining it is an error
    docker ps
    # Take down bridge
    docker network ls|G bridge net|field 1| sudo parallel docker network rm
    # Re-establish default interface
    dif=$default_interface
    sudo ifconfig $dif $dif_ip
    # Routing takes a while to be updated
    sleep 2
    route -n
}

destroy() {
    # Remove the setup
    # After this the host server returns to the state before running `setup`
    rm -rf my-ubuntu/
    docker rmi my-ubuntu
}

full() {
    install
    setup
    start
    stop
    destroy
}

$ time full
real    2m21.611s
user    0m47.337s
sys     0m31.882s

이는 7GB RAM을 차지합니다.모두100개의 가상 서버를 실행하는 경우. 따라서 이 작업을 수행하는 데 충분한 RAM이 필요하지 않습니다.

1024개의 서버로 확장되고 그 후에는 도커 브리지가 불평합니다(아마도 다음과 같은 이유로 인해).각 브리지 장치에는 최대 1024개의 포트가 있을 수 있습니다.).

이 스크립트는 6000개의 컨테이너를 실행하도록 조정할 수 있습니다(1024개 이상의 도커 컨테이너 실행 중), 그러나 6055에서는 차단됩니다(https://serverfault.com/questions/1091520/docker-blocks-when-running-multiple-containers).

도보 여행가

아래 @Martin의 의견을 바탕으로 :

install() {
    # Install needed software once
    sudo apt install -y vagrant virtualbox
}
setup() {
    # Configure the virtual servers
    mkdir -p ssh/
    cp ~/.ssh/id_rsa.pub ssh/
    cat ssh/*.pub > authorized_keys
    cat >Vagrantfile <<'EOF'
Vagrant.configure("2") do |config|
  config.vm.box = "debian/buster64"
  (1..100).each do |i|
    config.vm.define "vm%d" % i do |node|
      node.vm.hostname = "vm%d" % i
      node.vm.network "public_network", ip: "192.168.1.%d" % (100+i)
    end
  end

  config.vm.provision "shell" do |s|
    ssh_pub_key = File.readlines("authorized_keys").first.strip
    s.inline = <<-SHELL
      mkdir /root/.ssh
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
      apt-get update
      apt-get install -y parallel
    SHELL
  end
end
EOF
}
start() {
    testssh() {
        ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@"$1" echo "'$1'" '`uptime`'
    }
    export -f testssh
    # Start the virtual servers
    seq 100 | parallel --lb vagrant up vm{}
    # After this it is possible to do:
    #   ssh 192.168.1.111
    # from another physical server
    parallel testssh ::: 192.168.1.{101..200}
}
stop() {
    # Stop the virtual servers
    # After there is no running processes on the host server
    # and after this it is no longer possible to do:
    #   ssh 10.0.0.99
    # from another physical server
    # The host server returns to the state before running `start`
    seq 100 | parallel vagrant halt vm{}
}
destroy() {
    # Remove the setup
    # After this the host server returns to the state before running `setup`
    seq 100 | parallel vagrant destroy -f vm{}
    rm -r Vagrantfile .vagrant/
}

full() {
    install
    setup
    start
    stop
    destroy
}

start많은 경고가 제공됩니다.

NOTE: Gem::Specification.default_specifications_dir is deprecated; use Gem.default_specifications_dir instead. It will be removed on or after 2020-02-01.

stop다음과 같이 경고합니다.

NOTE: Gem::Specification.default_specifications_dir is deprecated; use Gem.default_specifications_dir instead. It will be removed on or after 2020-02-01.
Gem::Specification.default_specifications_dir called from /usr/share/rubygems-integration/all/gems/vagrant-2.2.6/lib/vagrant/bundler.rb:428.
NOTE: Gem::Specification.default_specifications_dir is deprecated; use Gem.default_specifications_dir instead. It will be removed on or after 2020-02-01.
Gem::Specification.default_specifications_dir called from /usr/share/rubygems-integration/all/gems/vagrant-2.2.6/lib/vagrant/bundler.rb:428.
/usr/share/rubygems-integration/all/gems/vagrant-2.2.6/plugins/kernel_v2/config/vm.rb:354: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
/usr/share/rubygems-integration/all/gems/vagrant-2.2.6/plugins/kernel_v2/config/vm_provisioner.rb:92: warning: The called method `add_config' is defined here
/usr/share/rubygems-integration/all/gems/vagrant-2.2.6/lib/vagrant/errors.rb:103: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
/usr/share/rubygems-integration/all/gems/i18n-1.8.2/lib/i18n.rb:195: warning: The called method `t' is defined here

각 가상 머신은 호스트 시스템에서 0.5GB의 RAM을 사용합니다.

시작은 위의 Docker 머신보다 훨씬 느립니다. 가장 큰 차이점은 Vagrant 머신이 호스트 머신과 동일한 커널을 실행할 필요가 없고 전체 가상 머신을 실행할 필요가 없다는 것입니다.

답변1

나는 docker가 귀하의 요구 사항을 충족한다고 생각합니다.

1) 도커 설치(https://docs.docker.com/engine/install/) Linux 설치 후 단계를 완료했는지 확인하십시오(https://docs.docker.com/engine/install/linux-postinstall/)

2) 다음과 같은 디렉토리 구조가 있다고 가정합니다.

.
└── my-ubuntu
    ├── Dockerfile
    └── id_rsa.pub

1 directory, 2 files

id_rsa.pub공개 키입니다. 이에 대해서는 Dockerfile아래에서 설명하겠습니다.

3) 먼저, 구축해야 합니다.부두 작업자 이미지. 템플릿 같아요컨테이너우리는 달려야 해요. 모든 컨테이너는 다음과 같습니다.구체화하다우리의영상.

4) 이미지를 구축하려면 템플릿이 필요합니다. 그것은 Dockerfile:

FROM ubuntu:bionic
RUN apt update && \
    apt install -y openssh-server
RUN mkdir /root/.ssh
COPY id_rsa.pub /root/.ssh/authorized_keys

CMD service ssh start && tail -f /dev/null

  • FROM ubuntu:bionic우리를 정의하다기본 이미지. Hub.docker.com에서 Arch, Debian, Apline, Ubuntu 등에 대한 기본 사항을 찾을 수 있습니다.
  • apt install부분적으로 SSH 서버 설치
  • COPY from to공개 키를 컨테이너의 위치에 복사하세요.
  • RUN여기에 다른 작업(소프트웨어 설치, 파일 생성 등)을 수행하기 위한 더 많은 명령문을 추가할 수 있습니다 .
  • 마지막은 까다 롭습니다. 1부 SSH 서버 시작컨테이너를 시작할 때이는 명백하지만 두 번째는 중요합니다. 컨테이너가 시작 후 즉시 종료되는 것을 방지하는 차단 명령을 실행합니다.

5) docker build my-ubuntu -t my-ubuntu- 빌드영상. 이 명령의 출력은 다음과 같습니다.

Sending build context to Docker daemon  3.584kB
Step 1/5 : FROM ubuntu:bionic
 ---> c3c304cb4f22
Step 2/5 : RUN apt update &&     apt install -y openssh-server
 ---> Using cache
 ---> 40c56d549c0e
Step 3/5 : RUN mkdir /root/.ssh
 ---> Using cache
 ---> c50d8b614b21
Step 4/5 : COPY id_rsa.pub /root/.ssh/authorized_keys
 ---> Using cache
 ---> 34d1cf4e9f69
Step 5/5 : CMD service ssh start && tail -f /dev/null
 ---> Using cache
 ---> a442db47bf6b
Successfully built a442db47bf6b
Successfully tagged my-ubuntu:latest

6) 달리자 my-ubuntu. ( my-ubuntu이름을 다시영상). my-ubuntu-1이미지에서 파생된 이름 으로 컨테이너를 시작합니다 my-ubuntu.

docker run -d --rm --name my-ubuntu-1 my-ubuntu

옵션:

  • -d 악마화하다bg에서 컨테이너를 실행하는 경우
  • --rm중지된 후 용기를 닦으십시오. 많은 수의 컨테이너를 다룰 때 하드 드라이브가 빠르게 오염될 수 있으므로 이는 중요합니다.
  • --name컨테이너 이름
  • my-ubuntu이미지부터 시작해 보겠습니다.

7) 이미지가 실행 중입니다. docker ps이는 다음과 같이 입증될 수 있습니다.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
ee6bc20fd820        my-ubuntu           "/bin/sh -c 'service…"   5 minutes ago       Up 5 minutes         my-ubuntu-1

8) 컨테이너에서 명령을 실행합니다.

docker exec -it my-ubuntu-1 bash- 컨테이너를 입력하세요 bash. 어떤 명령이라도 입력할 수 있습니다.

9) 위의 방법으로 명령을 실행하는 것만으로는 충분하지 않은 경우 해당 필드를 실행 docker inspect my-ubuntu-1하고 grep하십시오 IPAddress. 나에게는 그렇습니다 172.17.0.2.

ssh [email protected]
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.6.15-arch1-1 x86_64)

10) 컨테이너를 중지합니다.docker stop my-ubuntu-1

11) 이제 100개의 컨테이너를 실행할 수 있습니다.

#!/bin/bash

for i in $(seq 1 100); do
    docker run -d --rm --name my-ubuntu-$i my-ubuntu
done

내 거 docker ps:

... and so on ...
ee2ccce7f642        my-ubuntu           "/bin/sh -c 'service…"   46 seconds ago      Up 45 seconds                            my-ubuntu-20
9fb0bfb0d6ec        my-ubuntu           "/bin/sh -c 'service…"   47 seconds ago      Up 45 seconds                            my-ubuntu-19
ee636409a8f8        my-ubuntu           "/bin/sh -c 'service…"   47 seconds ago      Up 46 seconds                            my-ubuntu-18
9c146ca30c9b        my-ubuntu           "/bin/sh -c 'service…"   48 seconds ago      Up 46 seconds                            my-ubuntu-17
2dbda323d57c        my-ubuntu           "/bin/sh -c 'service…"   48 seconds ago      Up 47 seconds                            my-ubuntu-16
3c349f1ff11a        my-ubuntu           "/bin/sh -c 'service…"   49 seconds ago      Up 47 seconds                            my-ubuntu-15
19741651df12        my-ubuntu           "/bin/sh -c 'service…"   49 seconds ago      Up 48 seconds                            my-ubuntu-14
7a39aaf669ba        my-ubuntu           "/bin/sh -c 'service…"   50 seconds ago      Up 48 seconds                            my-ubuntu-13
8c8261b92137        my-ubuntu           "/bin/sh -c 'service…"   50 seconds ago      Up 49 seconds                            my-ubuntu-12
f8eec379ee9c        my-ubuntu           "/bin/sh -c 'service…"   51 seconds ago      Up 49 seconds                            my-ubuntu-11
128894393dcd        my-ubuntu           "/bin/sh -c 'service…"   51 seconds ago      Up 50 seconds                            my-ubuntu-10
81944fdde768        my-ubuntu           "/bin/sh -c 'service…"   52 seconds ago      Up 50 seconds                            my-ubuntu-9
cfa7c259426a        my-ubuntu           "/bin/sh -c 'service…"   52 seconds ago      Up 51 seconds                            my-ubuntu-8
bff538085a3a        my-ubuntu           "/bin/sh -c 'service…"   52 seconds ago      Up 51 seconds                            my-ubuntu-7
1a50a64eb82c        my-ubuntu           "/bin/sh -c 'service…"   53 seconds ago      Up 51 seconds                            my-ubuntu-6
88c2e538e578        my-ubuntu           "/bin/sh -c 'service…"   53 seconds ago      Up 52 seconds                            my-ubuntu-5
1d10f232e7b6        my-ubuntu           "/bin/sh -c 'service…"   54 seconds ago      Up 52 seconds                            my-ubuntu-4
e827296b00ac        my-ubuntu           "/bin/sh -c 'service…"   54 seconds ago      Up 53 seconds                            my-ubuntu-3
91fce445b706        my-ubuntu           "/bin/sh -c 'service…"   55 seconds ago      Up 53 seconds                            my-ubuntu-2
54c70789d1ff        my-ubuntu           "/bin/sh -c 'service…"   2 minutes ago       Up 2 minutes         my-ubuntu-1

fe 를 실행 docker inspect my-ubuntu-15하고 해당 IP를 가져와 ssh에 연결하거나 docker exec를 사용할 수 있습니다.

ping컨테이너에서 컨테이너로 이동할 수 있습니다 ( iputils-ping재현을 위해 설치).

root@5cacaf03bf89:~# ping 172.17.0.2 
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=1.19 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.158 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.160 ms
^C
--- 172.17.0.2 ping statistics ---

Bash에서 컨테이너를 실행하는 것은빠른해결책. 확장 가능한 접근 방식을 원한다면 kubernetes또는swarm

PS 유용한 명령:

  • docker ps
  • docker stats
  • docker container ls
  • docker image ls

  • docker stop $(docker ps -aq)- 실행 중인 모든 컨테이너를 중지합니다.

또한 docs.docker.com의 기본 사항을 따르세요. 컨테이너에 대한 더 나은 경험을 얻으려면 1시간을 투자하세요.

추가의:

예제의 기본 이미지는 실제로 가장 작은 이미지입니다. DE도 없고 xorg도 없습니다. 수동으로 설치하거나( RUN apt install ...섹션에 패키지 추가) 필요한 소프트웨어가 이미 포함된 이미지를 사용할 수 있습니다. 빠른 Google 검색을 통해 이 정보를 얻었습니다(https://github.com/fcwu/docker-ubuntu-vnc-desktop). 나는 그것을 시도한 적이 없지만 효과가 있다고 생각합니다. VNC 액세스가 필요하다면 시도해 보고 답변에 정보를 추가해야 합니다.

로컬 네트워크에 노출됨:

이것은 까다로울 수 있습니다. 모호한 포트 전달을 사용하여 수행할 수 있다고 확신하지만 간단한 해결책은 실행 스크립트를 다음과 같이 변경하는 것입니다.

#!/bin/bash

for i in $(seq 1 100); do
    docker run -d --rm -p $((10000 + i)):22 --name my-ubuntu-$i my-ubuntu
done

그런 다음 호스트 IP를 사용하여 컨테이너에 액세스할 수 있습니다.

ssh root@localhost -p 10001
The authenticity of host '[localhost]:10001 ([::1]:10001)' can't be established.
ECDSA key fingerprint is SHA256:erW9kguSvn1k84VzKHrHefdnK04YFg8eE6QEH33HmPY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:10001' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.6.15-arch1-1 x86_64)

답변2

  • 가상 네트워크 만들기

    (virtualbox를 사용하거나

    또는사용하여도커,예를 들어 docker network create --driver=bridge --ip-range=10.0.190.0/24 --subnet=10.0.0.0/16 --aux-address='ip1=10.0.190.1' --aux-address='ip2=10.0.190.2' --aux-address='ip3=10.0.190.3' -o "com.docker.network.bridge.name=br0" br0:)

  • virtualbox/kvm을 원하는 경우:

    하나 준비하다pxe/http서버 및 유사한 배포판 슬랙스또는알파인 리눅스, 사전 패키지된 모든 소프트웨어를 사용하여 slax와 클라우드로 시스템을 구축하면 savechanges많은 오버헤드가 발생하지만 이와 같은 도구를 사용하면클러스터 SSH다음을 실행하여 동시에 명령을 실행할 수 있습니다.

    cssh [email protected].{04..254} -p 22

  • dropbeardocker를 사용하는 경우: docker-compose를 통해 또는 수동으로 모든 컨테이너를 지정된 네트워크에 연결합니다. SSH 액세스를 원할 경우 CMD를 수정하여 실행할 수도 있습니다.

답변3

당신이 사용할 수있는도보 여행가테스트 환경을 시작하는 데 사용됩니다. 실행하도록 정의한 배포, 네트워크 구성 등을 작성한 후에는 실행하거나 부팅하여 Vagrantfile머신을 시작할 수 있습니다.vagrant up <vmname>vagrant up그들 모두위로. Vagrant는 다양한 기능을 지원합니다.가상화 제공업체Virtual Box, VMware, KVM, AWS, Docker 등... Vagrant는 다음을 사용하므로 개발 환경을 빠르게 시작할 수 있습니다.사전 구축된 "박스" 파일각 시스템을 처음부터 설치하는 대신. 동시에 Vagrant를 사용하면 사용자 정의된 작업을 실행할 수 있습니다.공급각 가상 머신 사용에 대해안시푸르, 꼭두각시,요리사,CF 엔진아니면 짧은 쉘 스크립트일 수도 있습니다. 동일한 Vagrantfile에서 다양한 배포판을 혼합하고 일치시킬 수 있습니다. SSH 액세스는 자동으로 설정됩니다. 을 실행하여 머신에 액세스할 수 있습니다 vagrant ssh <vmname>.폴더 동기화호스트 시스템에서 테스트 환경으로 파일을 쉽게 가져올 수 있습니다.


자세한 단계는 다음과 같습니다.

  1. Vagrant와 원하는 가상화 제공업체를 다운로드하여 설치하세요.

    $ sudo apt install -y vagrant virtualbox
    
  2. 다음 내용으로 Vagrantfile을 생성합니다.

    Vagrant.configure("2") do |config|
      config.vm.box = "debian/buster64"
      (1..100).each do |i|
        config.vm.define "vm%03d" % i do |node|
          node.vm.hostname = "vm%03d" % i
          node.vm.network "public_network", ip: "192.168.1.%d" % (99 + i)
        end
      end
    
      config.vm.provision "shell" do |s|
        ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
        s.inline = <<-SHELL
          mkdir /root/.ssh
          echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
          echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
          apt-get update
          apt-get install -y parallel
        SHELL
      end
    end
    
  3. 가상 머신을 시작합니다.

    $ parallel vagrant up ::: vm{001..100}
    
  4. SSH를 통해 가상 머신에 연결: Vagrant 방식(Vagrant 생성 키 사용):

    $ vagrant ssh vm001
    

    자체 키를 사용합니다(구성 단계에서 가상 머신에 설치합니다).

    $ ssh vagrant@<IP>
    

    또는 루트 액세스 권한을 얻으세요:

    $ ssh root@<IP>
    
  5. 가상 머신을 실행하여 일시 중지 vagrant suspend하고 며칠 후에 시작하여 테스트를 계속할 수 있습니다( vagrant up). 테스트 환경은 많지만 디스크 공간이 제한된 경우 일부 가상 머신을 제거하고 나중에 다시 생성할 수 있습니다.

  6. 가상 머신을 삭제하고 구성을 삭제합니다.

    vagrant destroy -f
    rm -rf Vagrantfile .vagrant
    

답변4

자체 호스팅 Gitlab을 추천합니다. Kubernetes와 Docker를 즉시 통합하고 수행해야 하는 거의 모든 작업을 자동화할 수 있습니다.

관련 정보