Docker 컨테이너에서 Docker 명령 사용
소개
컨테이너를 통해 컨테이너를 만드는 데 크게 두 가지 패턴이 있습니다.
이하에서는, 각각이 어떻게 동작하는지와, 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 명령이 내부에서 무엇을 하고 있는지, 이미지가 어떻게 구성되어 있는지, 라고 하는 것도 최근 조사했으므로 어쨌든 쓰고 싶다.
Reference
이 문제에 관하여(Docker 컨테이너에서 Docker 명령 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoyamachi/items/b6a8507fa7575e816d96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
docker run -v /var/run/docker.sock:/var/run/docker.sock container
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 명령이 내부에서 무엇을 하고 있는지, 이미지가 어떻게 구성되어 있는지, 라고 하는 것도 최근 조사했으므로 어쨌든 쓰고 싶다.
Reference
이 문제에 관하여(Docker 컨테이너에서 Docker 명령 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoyamachi/items/b6a8507fa7575e816d96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Docker 컨테이너에서 Docker 명령 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoyamachi/items/b6a8507fa7575e816d96텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)