기타/K8S

Kubernetes) Container안에서, Image 빌드 가능한가요? (Part 1: docker in docker)

MightyTedKim 2023. 9. 23. 22:13
728x90
반응형

항상 Docker build는 Jenkins나 Git Action을 사용해왔어요.

그런데 권한 이슈 때문에 이걸 사용하지 못하는 상황을 마주쳤습니다.

Docker In Docker로 이 상황을 어떻게 우회했는지 정리해보았습니다

Docker 없이 Docker 사용하기

예상 독자는 아래와 같습니다.

  1. Docker In Docker 가 궁금하신 분
  2. Docker Out of Docker를 사용 못하시는 분
  3. K8S 엔진으로 cri-o를 사용하시는 분

목차

  • 상황 설명
  • 문제 해결
  • 참고

내용

상황 설명

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=isc0304&logNo=222274955992

  • Server의 Docker 사용이 안됨 (보안상의 이유로)
  • Docker out of Docker는 docker.sock 권한 이슈로 사용 못함
  • Image는 Build하고 repository에 Push 해야함
  • Nuclio의 nuctl의 경우 default가 docker가 있어야 deploy 명령어가 가능함 (kaniko 안되는 상황 ㅜ)

문제 해결

여러가지 방법이 있지만, Docker In Docker를 사용했어요.

pod안에 2개의 container를 띄우는 무식한 방법이에요.

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp
spec:
  volumes:
  - name: docker-tls-certdir
    emptyDir: {}
  containers:
    - name: docker-private
      image: docker:20.10
      command: ['docker', 'run', '-p', '80:8000', 'nginx' ]
      env:
        - name: DOCKER_HOST
          value: tcp://localhost:2375
      volumeMounts:
        - name: docker-tls-certdir
          mountPath: /certs
    - name: dind-daemon
      image: docker:20.10-dind
      command: ["dockerd", "--host", "tcp://127.0.0.1:2375", "insecure-registries", "***.docker-registry:31500"]
      securityContext:
        privileged: true
      volumeMounts:
        - name: docker-tls-certdir
          mountPath: /certs

장점

  • docker 환경이 아닌 k8s에서도 docker를 사용할 수 있다.

단점

  • 보안에 취약하다. (다른 pod에서도 접근할 수 있기 때문)

 

일단 문제는 해결했습니다

login문제는 ~/.docker/config.json을 설정해주었고

nuctl deploy를 통해 image build/push가 가능해졌습니다.

 

하지만 OCI Image 빌드하는데 꼭 docker가 필요하지는 않아요.

다음 글은 Kaniko를 이용해서 image를 build/push 해보도록 하겠습니다.

 

참고

https://stackoverflow.com/questions/73606795/run-private-repository-with-dind-in-kubernetes

https://applatix.com/case-docker-docker-kubernetes-part/

 

728x90
반응형