Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ
๋ณธ ๊ฐ์๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ 4๊ฐ์ง ํต์ฌ ์์(MSA, CI/CD, DevOps, Container) ์ค ํ๋์ธ CI(Continuous Integration, ์ง์์ ์ธ ํตํฉ)๊ณผ CD(Continuous Deployment, ์ง์์ ์ธ ๋ฐฐํฌ) ํ์ดํ๋ผ์ธ์ ๋ํ ๋ค๋ฃจ๋ ๊ฐ์์ ๋๋ค. ๋ณธ ๊ฐ์๋ฅผ ํตํด CI/CD ๋๊ตฌ์ธ Jenkins๋ฅผ ์ด์ฉํ์ฌ ๋ก์ปฌ ํ๊ฒฝ๊ณผ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ์์ ๋ง์ ์๋ํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ , ๋ฐฐํฌํ๋ ๋ฐ์ ํ์ํ ๊ณผ์ ์ ์ดํดํ๊ณ ์ค์ตํด ๋ณผ ์ ์์ต๋๋ค.
์๊ฐ์ 4,735๋ช
๋์ด๋ ์ด๊ธ
์๊ฐ๊ธฐํ ๋ฌด์ ํ
์๋ ํ์ธ์, ์ด๋์์ ๋๋ค.
"Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ" ๊ฐ์์ "DevOps๋ฅผ ์ํ Docker ๊ฐ์ํ ๊ธฐ์ (Private Harbor Registry)" ๊ฐ์์์๋ ์ํ ํ Docker ์ปจํ ์ด๋ ์คํ์ ์ํด DinD (Docker in Docker) ๋ฐฉ์์ผ๋ก ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ถํ์ฌ ์์ ๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.
๋ค๋ง, Windows์ MacOS ํ๊ฒฝ์ด ๊ฐ๊ฐ ๋ค๋ฅด๊ณ , MacOS์ ๊ฒฝ์ฐ Intel chip, Apple chip์ ๋ฐ๋ผ ๊ตฌ์ฑํด์ผ ํ๋ ๋์ปค ์ด๋ฏธ์ง๊ฐ ๋ฌ๋ผ์ง๋๋ค. ํด๋น ์ด๋ฏธ์ง์์๋ SSH ์๋ฒ์ Docker ์์ง์ด ์ค์น ๋์ด ์๋๋ก ๊ตฌ์ฑํ์ฌ, ์ค์ต ์, ์ฌ๋ฌ ๋์ปค ์ปจํ ์ด๋๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ์ด ์ฉ์ดํ๋๋ก ๊ตฌ์ฑํ์๋๋ฐ, ์๊ฐ์ ๋ถ๋ค์ ํ๊ฒฝ์ ๋ชจ๋ ๋ง๋๋ก ์ ์ํ๋๊ฒ์๋ ๋ฌด๋ฆฌ๊ฐ ์๋ ๊ฒ๋ ์ฌ์ค์ ๋๋ค. ๊ทธ๋๋, ์ต๋ํ ์ผ๋ฐ์ ์ธ ํ๊ฒฝ์์๋ ๋ฌด๋ฆฌ์์ด ์ค์ต ํ ์ ์๋๋ก ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ค๊ณ ํ๊ณ ์์ต๋๋ค.
์ต๊ทผ์ MacOS Apple chip์์ ์ฌ์ฉํ๋ docker-server:m1 ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ์ค์ต ์, ์๋์ ๊ฐ์ ์ค๋ฅ ๋ฑ์ผ๋ก ์ค์ต์ด ์๋๋ ์ค๋ฅ๊ฐ ํ์ธ ๋์์ต๋๋ค.
exec /docker-entrypoint.sh: invalid argument์ฌ๋ฌ ๊ฒฝ๋ก๋ก ํ์ธํด ๋ณด๊ณ ์์ ๋ ํด ๋ณด์๋๋ฐ, MacOS Apple chip์์ ์ฌ์ฉํ๋ arm64 ์ํคํ ์ฒ์ Docker ์ปจํ ์ด๋์ ๋์ปค ์์ง์ ์ค์นํ์ฌ ์ฌ์ฉํ๋ DinD ๋ฐฉ์์์ ์ค๋ฅ๊ฐ ๋ฐ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค. (์ค๋ฅ ๋ฉ์์ง๋ ๋ก๊ทธ๊ฐ ์์ด ์์ธ์ ์ฐพ๋ ๊ฒ์๋ ํ๊ณ๊ฐ ์๋ค์)
์ค๋ฅ ์์: https://www.inflearn.com/community/questions/1401289/service-create-%EC%8B%9C%EC%97%90-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D
ํด๋น ์ด๋ฏธ์ง๋ก๋ ํด๊ฒฐํ๊ธฐ๊ฐ ์ด๋ ต๋ค๊ณ ํ๋จ๋์ด, ์๋์ ๊ฐ์ด Ubuntu ๋ฒ ์ด์ค์ SSH + Docker ์์ง์ ์ค์นํ ๋ฒ์ ์ ๋ค์ ๋น๋ํ์ฌ ๋ฐฐํฌ ํ์ต๋๋ค.
https://hub.docker.com/repository/docker/edowon0623/docker-server/general
์์์ ๋ฐ์ํ ๋ฌธ์ ๋ฑ์ ๋ชจ๋ ํด์ ๋์์์ ํ์ธํ์ต๋๋ค. Ubuntn ์์๋ Docker ์๋น์ค๋ฅผ ๊ธฐ๋ํ๊ธฐ ์ํด ์๋ ๋ช ๋ น์ด๋ฅผ ๋จผ์ ์คํํด ์ฃผ์๊ณ ์ค์ตํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
service start docker์์ผ๋ก๋ DinD ๋ฌธ์ ๋ฑ๊ณผ ๊ฐ์ด ์ค์ต์ ๊ด๋ จ ๋ ์ด์๊ฐ ํ์ธ๋๋๋๋ก ์ ๋ฐ์ดํธ ๋ ์ค์ต ํ๊ฒฝ์ ์ ๊ณตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ ์ฃผ๊ฐ ์ฐํด๋ค์. ์ ๊ฐ์ธ์ ์ผ๋ก ๅคไบๅค้ฃ ํ๋ 2024๋ ์ด์์ต๋๋ค๋ง, ์๋ก์ด ๋ง์์ผ๋ก ์๋ก์ด ํํด๋ฅผ ์์ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฌํด๋ ๋ ์ข์ ๊ฐ์๋ก ์์ฃผ ์ฐพ์ ๋ต๋๋ก ํ๊ฒ ์ต๋๋ค. ์ํด ็ฆ ๋ฐ์ด ๋ฐ์ผ์ธ์.
๊ฐ์ฌํฉ๋๋ค.
** ansible-server์์ windows์ K8s๋ก์ ํ ์คํธ ์ ์ฐธ์กฐ
ansible-server๋ฅผ ์ด์ฉํ์ Windows์ ์ค์นํ docker-desktop์ Kubernetes์ ์ ์์ ํ์ฌ ํ ์คํธ๋ฅผ ์งํํ ๊ฒฝ์ฐ ์๋ ๋ด์ฉ์ ํ์ธํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
ansible-server์์ ssh-copy-id ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ windows์ id_rsa.pub ํค ํ์ผ์ ๋ด์ฉ์ ๋ณต์ฌํ๋ ค๊ณ ํ ๋, ์ ์์ ์ธ ํค ํ์ผ์ ๋ด์ฉ์ด ์๋, ECHO~ ๋ผ๋ ๋ฌธ์์ด์ด ์ฝ์ด๋์ด ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ๋ ssh-copy-id ๋ช ๋ น์ด ๋์ , ํด๋น id_rsa.pub ํค ํ์ผ์ ๋ด์ฉ์ ์ง์ ๋ณต์ฌํด์ ์ฌ์ฉํ์ ์ผ ํฉ๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฐ๊ณผ๋ก๋ windows์ .ssh ํด๋์ ์๋ authorized_keys ํ์ผ์ ansible-server์์ ์์ฑํ id_rsa.pub ํค ํ์ผ์ ๋ด์ฉ์ด ์ ์ฅ๋์ด ์์ผ๋ฉด ๋ฉ๋๋ค. ์ด ๋ ์ฃผ์ํ์ค ์ ์, ansible-server์ ๋ก๊ทธ์ธ ํ ๊ณ์ ๊ณผ windows ์๋ฒ์ ๋ก๊ทธ์ธํ๋ ๊ณ์ ์ด ์ผ์นํด์ผ ํ๋ฉฐ, ํด๋น ๊ณ์ ์ windows์์ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์์ด์ผ, docker๋ kubectl ๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์์ฝํ๋ฉด Windows์ ๋ก๊ทธ์ธํ๋ ๊ณ์ ๊ณผ ๋์ผํ ๊ณ์ ๋ช ์ผ๋ก ansible-server์ ๊ณ์ ์ ์์ฑํ, ํค๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋ก์ฐ์๋ฉด, ssh ์ ์ํ ๋ ์ธ์ฆ ์์ด ์ ์ํ๊ธฐ ์ํด ssh-copy-id ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋, ์ด๋ถ๋ถ์ ๊ทธ๋๋ก ์ํธ๋ฅผ ์ ๋ ฅํ๋ฉด์ ์งํํ๊ณ , ansible-playbook์์๋ ansible์ hostsํ์ผ์ windows ์ ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ์ฌ ์ฌ์ฉํ์๋ฉด, playbook ์คํ์์๋ ๋ฌธ์ ์์ด ์งํํ ์ ์์ต๋๋ค.
์๋์ ์คํ ๊ณผ์ ์ ๋ํด ์ค๋ช ํ ๋ด์ฉ์ ์ฐธ์กฐํ์๊ธฐ ๋ฐ๋๋๋ค.
Windows OS (docker-desktop ์ค์น, Kubernetes ์คํ, IP: 192.168.0.7)
docker-server (๋์ปค ์ปจํ ์ด๋, IP: 172.17.0.3)
ansible-server (๋์ปค ์ปจํ ์ด๋, Ansible ์ค์น, IP: 172.17.0.4)
๋จผ์ ansible-server์์ ์์ฑํ id_rsa.pub ํค๋ฅผ docker-server์ ssh-copy-id ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ๋ณต์ฌํฉ๋๋ค. docker-server์ ํค๋ฅผ ๋ณต์ฌํด์ ssh๊ฐ ์ํธ ์์ด ์ ์ ๋๋ ๊ฒ์ ํ์ธํด ๋ณด์ค ์๋ ์์ต๋๋ค.

ansible-server์ id_rsa.pub ํค๋ฅผ windows ์๋ฒ์ ๋ณต์ฌํฉ๋๋ค. (์๋ ์ด๋ฏธ์ง๋ docker-server๋ก ๋์ด ์์ง๋ง, ansible-server์์ ์งํํ์๋ฉด ๋ฉ๋๋ค). ๋ค๋ง, id_rsa.pub ํค๋ฅผ ์์ฑํ ๋์ ๊ณ์ ๊ณผ windows์ openssh์ ์ ์ ํ ๊ณ์ ์ด ๋์ผํด์ผ ํด์ฌ, ํด๋น windows ๊ณ์ ์ docker๋ kubectl ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด ๋, ssh-copy-id ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ id_rsa.pub ํค ๋ณต์ฌ๋ฅผ ์๋ํ๋ฉด, Windows์ authorized_keys ํ์ผ์ id_rsa.pub ํค์ ๋ด์ฉ์ด ๋ณต์ฌ๋๋ ๊ฒ์ด ์๋๋ผ, ECHO~ ๋ผ๋ ๋ฌธ์์ด์ด ๋ณต์ฌ๋์ด ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด๋ด ๊ฒฝ์ฐ์๋ ํด๋น ํค๋ฅผ ์ง์ COPY-PASTE ๋ฐฉ์์ผ๋ก Windows์ authorized_keys ํ์ผ์ ๋ณต์ฌํด ๋ฃ์ผ์๋ฉด ๋ฉ๋๋ค. (๋ง์ฝ authorized_keys ํ์ผ์ windows์ ์๋ค๋ฉด, ํ์ผ๋ ์ง์ ์์ฑํ์๋ฉด ๋ฉ๋๋ค)

id_rsa.pub ํค๋ฅผ ๋ณต์ฌํ๋ ์์ ์ ํ๊ธฐ ์ ์, ์๋ 4)๋ฒ๊ณผ ๊ฐ์ด windows์์ ssh ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ windows ์๋ฒ์ ์ ์์ด ๋๋์ง ํ์ธํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. (openssh๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด ์ค์นํ์๊ธฐ ๋ฐ๋๋๋ค.)

์ด๋ฒ์๋ ansible-server์์ ์ง์ ssh ๋ช ๋ น์ด๋ก Windows์ openssh ์๋ฒ์ ์ ์ํ๋ ํ ์คํธ๋ฅผ ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.

์์ 2๋ฒ์์ ์ค๋ช ๋๋ฆฐ ๊ฒ ์ฒ๋ผ id_rsa.pub ํค๋ฅผ ๋ณต์ฌํ ๋๋ id_rsa.pub ํค๊ฐ Windows์ ๊ณ์ ๊ณผ ๋์ผํ ๊ณ์ ์ผ๋ก ์์ฑํด์ผ ํ๋๋ฐ, ์ด ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋ก์ฐ์๋ฉด, ์๋์ ๊ฐ์ด, ansible์ hosts ํ์ผ์ windows ์ ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ์ฌ ์ฌ์ฉํ์๊ธฐ๋ฅผ ๊ถ์ฅ๋๋ฆฝ๋๋ค. ์ด์ฐจํผ ssh ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ง์ ์ ์์ ์๋ํ๋ ๊ฒฝ์ฐ๋ณด๋ค๋ ansible ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ssh-copy-id ์์ ์ ์งํํ์ง ์๊ณ ์ง์ ansible hosts ํ์ผ์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ์ด ๋ถ๋ถ์์ ansible_user, ansible_password ํญ๋ชฉ์ Windows ์ ์ ๊ณ์ ์ ๋ณด (์ ๋ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์๋ ์ฌ์ฉ์ ๊ณ์ ์ ๋ณด์ ์ํธ๋ฅผ ์ ๋ ฅํ์ต๋๋ค)๋ฅผ ์ ์ ํ์๋ฉด ๋ฉ๋๋ค. ansible hosts ํ์ผ ์ ๋ณด๋ฅผ ์์ฑํ์๋ค๋ฉด ,๋ค์ ansible ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ping ๋ชจ๋์ด ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
ansible windows -m in_ping -u [windows ๊ณ์ ]

ansible-playbook ์คํ์ ์์, windows์ K8s์ manifest ํ์ผ์ด ์ ์ฅ๋์ด ์๋ ์์น๋ฅผ ํ์ธํ๊ณ , kubectl ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ Kubernetes์ ๋ฆฌ์์ค๋ค์ ํ์ธํด ๋ด ๋๋ค. ์๋ ์์ ์์๋ K8s์ Service ๋ชฉ๋ก์ ํ์ธํ๊ณ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ผ๋ก ์์ฑ๋๋ ์๋น์ค์ธ ์ฌ์ฉ์๊ฐ ์์ฑํ ์๋น์ค๋ ๋ณด์ด์ง ์๋ ๊ฒ์ ํ์ธํ๊ณ ์์ต๋๋ค.

ansible-server์์ playbook ํ์ผ์ ๋ด์ฉ์ ํ์ธํฉ๋๋ค. windows์ ๋ช ๋ น์ด๋ฅผ ์ ๋ฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์๋ ์์ ์ ๊ฐ์ด win_command ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ณ (MacOS์ ๊ฒฝ์ฐ command ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉ) ์คํํ๊ณ ์ ํ๋ manifest ํ์ผ์ ์์น๋ฅผ ์ ๋๊ฒฝ๋ก๋ก ๋ช ์ํด ์ค๋๋ค. playbook ํ์ผ์ ์คํํ์ฌ ์คํ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์ค ์ ์์ต๋๋ค.

๋ง์ง๋ง์ผ๋ก windows์์ ์คํํ ๋ฆฌ์์ค๊ฐ ์ ์์ ์ผ๋ก ๋ฐ์๋์๋์ง, kubectl ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ํ์ธํด ๋ณด์ค ์ ์์ต๋๋ค.

์ ๋ด์ฉ์ ๋ํด ์ถ๊ฐ ์ง๋ฌธ์ฌํญ ์์ผ์๋ฉด ์ง๋ฌธ ๊ฒ์ํ์ ๊ธ ๋จ๊ฒจ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
ํด๋น ๋ฌธ์ ๊ฐ ๊ณ ๋ฏผํ์ จ๋ ๋ถ๋ค๊ป ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ํ์ธ์, ์ด๋์์ ๋๋ค.
"Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ" ๊ฐ์๋ฅผ ์งํํ๋ฉด์, ์ค์ต ํ๊ฒฝ ๊ตฌ์ฑ์ ์ด๋ ค์์ ๊ฒช๋ ๋ถ๋ค์ด ๋ง์ VM์ผ๋ก ํ๊ฒฝ ๊ตฌ์ฑ์ ๋ค๋ฃจ๋ ๋ถ๋ถ์ ๋ํ ๊ฐ์๋ฅผ ๋ณ๋๋ก ์ ์ํ์ฌ ๊ณต์ ํ๊ฒ ๋์์ต๋๋ค. ์ค์ต ํ๊ฒฝ์ Windows ๋ฐ MacOS (Intell chip) ์ฌ์ฉ์ ๋ถ๋ค์ด ๊ธฐ์กด์ Docker + SSH ํ๊ฒฝ์ด ์๋๋ผ, VirtualBox๋ฅผ ์ด์ฉํ ํ๊ฒฝ์ผ๋ก VM์ ๊ตฌ์ฑํด ๋ณด์ค ์ ์๋๋ก ํ์์ต๋๋ค. VM์ ์ค์น ๋ Docker๋ฅผ ์ด์ฉํ์ฌ, ์กฐ๊ธ์ด๋ผ๋ ์์ํ๊ฒ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํ์์ผ๋, ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ํ์ธ์, ์ด๋์์ ๋๋ค.
๋จผ์ ๊ฐ์์ ๊ด์๋ฏ ๊ฐ์ ธ์ฃผ์ ๋ถ๋ค๊ป ๊ฐ์ฌ์ ์ธ์ฌ ๋๋ฆฝ๋๋ค.
๋ณธ ๊ฐ์๋ ์ค์ต์ด ๊ธฐ๋ณธ์ผ๋ก ํจ๊ป๋์ด์ผ ํ๋ ๊ฐ์์ ๋๋ค. ํนํ Jenkins ๋ฐ Tomcat์ด๋ Docker ์๋ฒ๋ ์ง์ ์ค์นํ๊ณ ์ค์ตํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ํ๊น๊ป๋, ์ผ๋ถ ์๊ฐ์๋ถ๋ค(ํนํ, Windows)์ด ์ค์ต์ ์งํํ๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ ๊ตฌ์ถ์ ์ด๋ ค์์ด ์๋ค๊ณ ๊ธ์ ๋จ๊ฒจ์ฃผ์ จ์ต๋๋ค. ๋ชจ๋ ํ๊ฒฝ์ ๋ํด ํ ์คํธํด ๋ณด์ง ๋ชปํ์ง๋ง, ์ ํฌ๋ก์จ๋ ๊ตฌ์ถํ ์ ์๋ ์ฌ๋ฌ ํ๊ฒฝ์ ์ค๋นํ์ฌ ํ ์คํธํ๊ณ ๊ด๋ จ ๋ฆฌ์์ค ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต์ ํด ๋๋ ธ๋๋ฐ, ํด๊ฒฐ ๋์ง ๋ชปํ ์๊ฐ์๋ถ๋ค๊ป๋ ์ฃ์กํ๋ค๋ ๋ง์์ ๋๋ฆฝ๋๋ค.
์์ ๊ณต์ ํด ๋๋ฆฐ, ์ง๋ฌธ๋ต๋ณ ๋ฐ ์ถ๊ฐ ์์๋ฑ์ ํตํด Windows + SSH + Dokcer ํ๊ฒฝ์์์ ์ค์ต ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด ๋๋ ธ๋๋ฐ, ์ถ๊ฐํด ํ์ธ ๋ ์ฌํญ์ด ์์ด ๊ณต์ ํด ๋๋ฆฝ๋๋ค.
Windows) SSH ์๋ฒ (with ๋์ปค) ์คํ ๋ช ๋ น์ด (๋ฐฉ๋ฒ1)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init
Windows) SSH ์๋ฒ (with ๋์ปค) ์คํ ๋ช ๋ น์ด (๋ฐฉ๋ฒ2, ์ ๋ช ๋ น์ด๋ก ์คํ๋์ง ์์ ๊ฒฝ์ฐ)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init
์ ํฌ๊ฐ ํ ์คํธํ ์ผ๋ถ Windows PC์์๋ ์๋ ์ค์ต ๋ฐฉ๋ฒ์ด ๋ชจ๋ ์ ์ ์๋๋์๋๋ฐ, ์ต๊ทผ ๊ตฌ์ ํ Windows PC(WSL2 ์ค์น)์์ ์ค์ต1๋ฒ์ ์ค๋ฅ๊ฐ ์์์ ํ์ธํ์์ต๋๋ค. ํ์ฌ ํ์ ํ ์ค๋ฅ์ ์์ธ์ WSL2์์ iptables์ ์์ฑ๊ณผ์ ์์ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฑฐ์๋๋ฐ, ์ฌ๋ฌ ์ ๋ณด๋ฅผ ์ฐพ์์ ํด๊ฒฐํด ๋ด๋ ์ ํฌ๊ฐ ์์ฑํ ์ด๋ฏธ์ง์์๋ ์ ์์ ์ผ๋ก ์๋๋์ง ์์์, ์์๋ก iptables์ ๊ธฐ๋ฅ์ ๋นผ๊ณ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ ํ ์คํธ ํด ๋ณด๋, ํ์ฌ๊น์ง๋ ํฐ ๋ฌธ์ ์์ด ์ค์ต์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋์ด ํด๋น ์ด๋ฏธ์ง์ Dockerfile ๊ณต์ ํด ๋๋ฆฝ๋๋ค.
https://hub.docker.com/r/edowon0623/docker/tags -> docker pull edowon0623/docker:no_iptables
https://github.com/joneconsulting/docker-files
๋ฐ๋ผ์, Windows ํ๊ฒฝ์์ Dind ๋ฐฉ์ (์ค์ต ์คํฌ๋ฆฌ๋ธ ๋ฐฉ๋ฒ1)์ผ๋ก Docker ์๋ฒ๊ฐ ๊ธฐ๋๋์ง ์์ผ์๋ฉด, ์๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ค์ตํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
Windows) SSH ์๋ฒ (with ๋์ปค) ์คํ ๋ช ๋ น์ด (๋ฐฉ๋ฒ3)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:no_iptables /usr/sbin/init
๋ฌผ๋ก , ํด๋น Docker ์ปจํ ์ด๋๋ฅผ ๊ธฐ๋ํ์ ๋ค์์, SSH ์ ์ ํ, systemctl start docker ๋ช ๋ น์ด๋ฅผ ์คํํด ์ฃผ์ ์ผ Docker ์๋ฒ๊ฐ ๊ธฐ๋๋ฉ๋๋ค.
๋ค์ ํ๋ฒ, ๊ฐ์์ ๊ด์ฌ์ ๊ฐ์ ธ ์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉด, ๋ ์ข์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ง๊ณ ์๋ก์ด ๊ฐ์๋ ์ค๋นํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ํ์ธ์, ์ด๋์์ ๋๋ค.
Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipline ๊ตฌ์ถ ๊ฐ์์์ Nodejs๋ก ์์ฑ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ์์๋ฃ๋ฅผ ์ถ๊ฐํ์์ต๋๋ค. ํด๋น ์ฝํ ์ธ ๋ฅผ ์ง๋ 9์๋ถํฐ ์์ฒญํ์ จ๋๋ฐ, ๋ง์ง๋ ์์ ๋ถ๋์ด์์์๋ ์ด์ ์์ผ ์ ๋ก๋ ํด๋๋ฆฝ๋๋ค. ์๋ฃ๊ฐ ๋๋ฌด ๋ฆ๊ฒ ์ ๋ก๋ ๋์ด ์ฃ์กํฉ๋๋ค.
Nodejs ์ ํ๋ฆฌ์ผ์ด์ ์ PM2๋ผ๋ Process Manager๋ฅผ ํตํด ๊ธฐ๋ํ๋ฉด์, ์ด๊ฒ์ Docker ์ด๋ฏธ์ง๋ก ๋ฐฐํฌํ๊ณ ์คํํ๋ ๊ณผ์ ์ ๋ํด ์ค๋ช ํ๊ณ ์์ต๋๋ค. ๋ถ์กฑํ ์๋ฃ์ด์ง๋ง ํ์ํ์ ๋ถ๋ค์๊ฒ ์กฐ๊ธ์ด๋ผ๋ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ์ถ๊ฐ ์ง๋ฌธ์ฌํญ ์์ผ์ ๋ถ๋ถ์ ๊ฒ์ํ์ ๊ธ ๋จ๊ฒจ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ต๊ทผ์ ํ๋ก์ ํธ ๋ง๊ฐ์ผ๋ก ๋ฐ๋ก๋ฐ๋ก ํ์ธํ์ง ๋ชปํ๊ณ ์๋๋ฐ, ๊ฐ๋ฅํ๋ฉด ๋น ๋ฅด๊ฒ ํ์ธํ๊ณ ๋ต๋ณ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จ์ 2022๋ ํํด ๋ฌดํํ๊ฒ ์ ๋ง๋ฌด๋ฆฌํ์๊ณ , ํ์๋ ์ผ ๋ชจ๋ ์ ์ฑ์ทจํ์๊ธธ ๋ฐ๋๋๋ค.
๊ฐ์ฌํฉ๋.







