Docker 컨테이너에서 Docker 명령 사용

3954 단어 도커GitLab

소개



컨테이너를 통해 컨테이너를 만드는 데 크게 두 가지 패턴이 있습니다.
  • 호스트 Docker 프로세스를 사용하는 경우
  • Docker 프로세스 내에서 컨테이너 추가 (DinD)

  • 이하에서는, 각각이 어떻게 동작하는지와, CI 서버를 작성하는 것으로 실제의 이용 씬을 확인해 간다.

    CI의 일반적인 패턴으로 설명



    GitlabCI나 Jenkins 등, 스스로 실행 환경을 용이하게 하는 경우, 위의 2패턴을 병용하므로 차이를 알기 쉽다. 구성으로서는 ↓와 같이 된다.



    1. 호스트 Docker 프로세스 사용



    이것은 socket 경유로 Docker 데몬에게 명령한다.
    아래와 같이 socket 파일을 마운트하면, socket 경유로 Docker 파일을 기동할 수 있다.
    docker run -v /var/run/docker.sock:/var/run/docker.sock container
    

    2. DinD의 경우



    Docker 컨테이너 내에서 새로운 Docker 명령을 호출할 수 있다.
    파일 시스템에 액세스하기 위해, privileged 모드로 실행할 필요가 있다.

    다만, 내부에서 실제로 하고 있는 것은, 1과 크게 변하지 않았다. socket을 통해 DinD 컨테이너의 Docker 데몬에 액세스하고 있습니다. .

    실제로 GitlabCI를 컨테이너로만 이동



    GCP의 Container-Optimized OS를 이용하여 GitlabCI를 컨테이너만으로 GitlabRunner(CI를 실행하는 서버)를 이동하는 것으로 이해한다.
    Container-Optimized OS란 Docker 컨테이너의 실행에 최적화된 OS로 최근에는 이것을 많이 사용하고 있다.

    서버 생성



    Compute Engine > VM instances에서 인스턴스 생성

    Container image : gitlab/gitlab-runner:latest
    Directory mount:


    Mount path
    Host path
    모드


    /var/run/docker.sock
    /var/run/docker.sock
    Read/write

    /etc/gitlab-runner
    /var/gitlab-runner/config
    Read/write


    이 gitlab-runner 컨테이너에서는, privileged일 필요는 없기 때문에, Run as privileged는 false로 좋다.

    gitlab-runner 서버 등록



    서버를 만들 때 지정한 config 파일의 경로를 Volume mount하여 구성 파일을 저장합니다.
    $ sudo docker run --rm -t -i -v /var/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
    

    여기서, gitlab 서버가 호스팅되는 도메인, 프로젝트 설정 화면에 표시되는 토큰 등을 입력한다.
    입력이 완료되면/var/gitlab/runner/config에 toml 파일이 생성됩니다. 이대로라면 DinD를 할 수 없기 때문에, 출력된 파일을 편집할 필요가 있다.
    [[runners]]
      name = "sample"
      url = "<url>"
      token = "<token>"
      executor = "docker"
      [runners.docker]
        tls_verify = false
        image = "alpine:latest"
        privileged = true  // ここをtrueに変更
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = true // ここをtrueに変更
    
    disable_cache=false 그러면 컨테이너 작성시의 데이터가 캐쉬되어, 대량으로 쓰레기 데이터가 남아 버린다.

    .gitlab-ci.yml 정의



    예를 들어 컨테이너 내에서 Docker 빌드하는 경우는 다음과 같이 한다.
    image: docker:stable
    stages:
    - deploy
    
    variables:
      DOCKER_HOST: tcp://docker:2375/
      DOCKER_DRIVER: overlay2
    
    services:
    - docker:dind
    
    deploy:
      stage: deploy
      script:
      - docker build .  -t sampleregistry.com/container:latest
      - docker push sampleregistry.com/container:latest
    

    이상으로 완료.

    마지막으로



    이번에는 Docker 명령을 컨테이너 내에서 부르는 방법을 썼다.
    Docker 명령이 내부에서 무엇을 하고 있는지, 이미지가 어떻게 구성되어 있는지, 라고 하는 것도 최근 조사했으므로 어쨌든 쓰고 싶다.

    좋은 웹페이지 즐겨찾기