기타/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 In Docker 가 궁금하신 분
- Docker Out of Docker를 사용 못하시는 분
- K8S 엔진으로 cri-o를 사용하시는 분
목차
- 상황 설명
- 문제 해결
- 참고
내용
상황 설명
- 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
반응형