๐ณ DinD vs DooD / Docker ๊ธฐ๋ฐ Jenkins/Argo CI/CD ์ ๋ต ๋ถ์
๐ณ DinD vs DooD: Docker ๊ธฐ๋ฐ Jenkins/Argo CI/CD ์ ๋ต ๋ถ์
Docker ๊ธฐ๋ฐ์ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ ๋, Jenkins๋ Argo ๊ฐ์ ์๋ํ ๋๊ตฌ์์ Docker๋ฅผ ์ด๋ป๊ฒ ์คํํ ์ง์ ๋ฐ๋ผ DinD(Docker-in-Docker) ์ DooD(Docker-outside-of-Docker) ๋ ๊ฐ์ง ๋ฐฉ์ ์ค ์ ํํ๊ฒ ๋๋ค.
DinD (Docker-in-Docker)
graph TD
Host[Host Machine]
subgraph OuterDinD ["Outer ์ปจํ
์ด๋(๋์ปค ๋ฐ๋ชฌ ์คํ ์ค)"]
Inner1["Inner ์ปจํ
์ด๋ 1"]
Inner2["Inner ์ปจํ
์ด๋ 2"]
end
Host --> |previleged ๊ถํ ๋ถ์ฌ| OuterDinD
classDef outer fill:#44f,stroke:#fff,stroke-width:2px;
classDef inner fill:#88f,stroke:#333,stroke-width:1px;
classDef host fill:#000,stroke:#000,stroke-width:2px;
class Host host;
class OuterDinD outer;
class Inner1,Inner2 inner;
์ปจํ ์ด๋ ๋ด๋ถ์์ ์์ฒด์ ์ผ๋ก Docker ๋ฐ๋ชฌ์ ์คํํ์ฌ, ์์ ํ ๊ฒฉ๋ฆฌ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด, Jenkins Job์ด ์คํ๋๋ ์ปจํ ์ด๋ ์์์ ๋ ๋ฆฝ์ ์ธ Docker ๋ฐ๋ชฌ์ ๊ตฌ๋ํ์ฌ, ๊ทธ ์์์ ๋ค์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๊ตฌ์กฐ์ด๋ค. ์ด๋ฌํ ๋ฐฉ์์ ํ ์คํธ ํ๊ฒฝ์ ์์ ํ ๋ถ๋ฆฌํ๊ณ ์ ํ ๋ ์ ์ฉํ๋ค.
๊ทธ๋ฌ๋ โprivileged ๊ถํ์ด ํ์ํ๋ฉฐ, ๋ณด์์ ์ํ์ด ์กด์ฌํ๊ณ ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋ง์ ์ ์๋ค.
DooD (Docker-outside-of-Docker)
graph TD
Host["Host Machine"]
subgraph Group1 [๋ณ๋ ฌ ์คํ]
Pararrel1["Inner ์ปจํ
์ด๋ 1"]
OuterDooD["Outer ์ปจํ
์ด๋ (docker CLI ์ฌ์ฉ, ๋์ปค๋ฐ๋ชฌ ์์)"]
Pararrel2["Inner ์ปจํ
์ด๋ 2"]
end
Host --> |docker.sock๋ง ๊ณต์ | OuterDooD
classDef outer fill:#44f,stroke:#fff,stroke-width:2px;
classDef inner fill:#44f,stroke:#333,stroke-width:1px;
classDef host fill:#000,stroke:#000,stroke-width:2px;
class Host host;
class OuterDooD outer;
class Pararrel1,Pararrel2 inner;
์ปจํ ์ด๋์์ ํธ์คํธ์ Docker ์์ผ(/var/run/docker.sock)์ ๊ณต์ ํ์ฌ Docker ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
์ฆ, Jenkins๋ Argo์ ์ปจํ ์ด๋๊ฐ ํธ์คํธ์ Docker ๋ฐ๋ชฌ์ ์ ๊ทผํ์ฌ ์ง์ Docker ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ฌํ ๋ฐฉ์์ ์ค์ ์ด ๊ฐ๋จํ๊ณ ์ฑ๋ฅ์ด ์ฐ์ํ์ง๋ง, ํธ์คํธ์ Docker ๊ถํ์ ๊ณต์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ฃผ์๊ฐ ํ์ํ๋ค.
๋น๊ต ๋ถ์: DinD vs DooD
๊ตฌ๋ถ | DinD (Docker-in-Docker) | DooD (Docker-outside-of-Docker) |
---|---|---|
์คํ ๋ฐฉ์ | ์ปจํ ์ด๋ ๋ด๋ถ์์ Docker ๋ฐ๋ชฌ ๊ตฌ๋ | ํธ์คํธ Docker ์์ผ์ ๊ณต์ |
๊ถํ ํ์ | โprivileged ๊ถํ ํ์ | ์์ผ ๋ง์ดํธ๋ง์ผ๋ก ๊ฐ๋ฅ |
๊ฒฉ๋ฆฌ์ฑ | ์์ ํ ๊ฒฉ๋ฆฌ (ํ ์คํธ์ฉ ์ ๋ฆฌ) | ํธ์คํธ์ ๊ณต์ (์๋ ๋น ๋ฆ) |
๋ณด์์ฑ | ๋ฎ์ (๊ถํ ๋์) | ์์ผ ๊ณต์ ์ํ ์กด์ฌ |
์ฑ๋ฅ | ๋๋ฆด ์ ์์ (๋ด๋ถ ๋ฐ๋ชฌ) | ๋น ๋ฆ (ํธ์คํธ ์ง์ ์คํ) |
๋ํ ์ฌ์ฉ ์ฌ๋ก | ํ ์คํธ ์ปจํ ์ด๋ ๋ถ๋ฆฌ, Lab ํ๊ฒฝ | ์ค์ ๋ฐฐํฌ, Docker ๋น๋/ํธ์ |
Jenkins์์์ ํ์ฉ
DooD ๋ฐฉ์
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
jenkins/jenkins:lts
- Jenkins ์ปจํ ์ด๋๋ ํธ์คํธ์ Docker ์์ง์ ์ ๊ทผ
- docker build, docker push ๋ฑ ์ฝ๊ฒ ์คํ ๊ฐ๋ฅ
- ์ฃผ์: ํธ์คํธ์ Docker ์ ์ฒด ๊ถํ์ ๊ณต์ ๋ฐ์ โ ๋ณด์ ๊ณ ๋ ค ํ์
DinD ๋ฐฉ์
docker run --privileged \
-v $(pwd):/workspace \
docker:dind
- Jenkins Job์์ ์์ฒด Docker ๋ฐ๋ชฌ ๊ตฌ๋
- ๊ฒฉ๋ฆฌ๋ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ์ ์ ํฉ
- ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋ง๊ณ ๋ณด์ ๋ฆฌ์คํฌ ์กด์ฌ
Argo Workflow์์์ ํ์ฉ
DooD ๊ธฐ๋ฐ ๊ตฌ์ฑ ์์
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dood-example-
spec:
entrypoint: docker-job
templates:
- name: docker-job
container:
image: docker
command: ["docker", "build", "-t", "myimage", "."]
volumeMounts:
- name: docker-socket
mountPath: /var/run/docker.sock
volumes:
- name: docker-socket
hostPath:
path: /var/run/docker.sock
- ํธ์คํธ์ Docker ์์ผ ๊ณต์
- ๋น ๋ฅธ ๋น๋, ๋ฐฐํฌ ์์ ์ ์ ํฉ
DinD ๊ธฐ๋ฐ ๊ตฌ์ฑ ์์
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dind-example-
spec:
entrypoint: docker-job
templates:
- name: docker-job
container:
image: docker:dind
securityContext:
privileged: true
command: ["dockerd-entrypoint.sh"]
- ๋ ๋ฆฝ์ ์ธ Docker ๋ฐ๋ชฌ ์คํ
- ๊ฒฉ๋ฆฌ๋ ํ ์คํธ ํ๊ฒฝ์ ์ ํฉํ๋ ๋ณด์/์์ ์ด์ ๊ณ ๋ ค ํ์
์ ๋ฆฌ
- DooD๋ ์๋์ ๊ฐํธํจ์ ์ค์ํ ๋ ์ฌ์ฉ
- DinD๋ ๊ฒฉ๋ฆฌ์ฑ๊ณผ ํ ์คํธ ํ๊ฒฝ ๋ ๋ฆฝ์ฑ์ด ์ค์ํ ๋ ์ฌ์ฉ
- Jenkins, Argo ํ๊ฒฝ ๋ชจ๋ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ ๋ฐฉ์์ ์ ํ์ ์ผ๋ก ํ์ฉํ ์ ์์