내 컴퓨터에선 됐는데
개발에서 가장 오래된 문장 하나가 있다. 내 컴퓨터에선 됐는데.
예전 배포는 단순했다. 내 컴퓨터에서 만든 파일을 서버에 그대로 올려 두면 사람들이 그걸 봤다. 그런데 이 방식에는 조용한 전제가 있었다. 내 컴퓨터와 서버의 환경이 같다는 전제다.
실제로는 다르다. 운영체제가 다르거나, 같은 운영체제라도 버전이 다르거나, 깔려 있는 도구의 버전이 다르다. 처음 올릴 때는 맞춰 놨어도 시간이 지나면 어긋난다. 코드는 같은데 바닥이 다르니 여기선 되고 저기선 안 되는 일이 생긴다.
고치기도 어렵다. 코드를 아무리 들여다봐도 문제가 코드에 없기 때문이다.
그래서 바닥까지 통째로 옮긴다
발상은 단순하다. 환경이 달라서 문제라면 환경까지 함께 옮기면 된다.
프로그램만 옮기는 것이 아니라 그것이 돌던 바닥을 함께 떠서 하나의 꾸러미로 만든다. 어떤 운영체제 위에서 어떤 도구의 어떤 버전과 함께 돌고 있었는지가 그 꾸러미 안에 다 들어간다.
그 꾸러미를 이미지라고 하고, 이미지를 띄워 실제로 돌리는 상태를 컨테이너라고 한다. 이 방식 전체가 Docker다.
이러면 배포가 바뀐다. 파일을 하나씩 올려 덮어쓰는 대신 컨테이너를 통째로 교체한다. 새 꾸러미를 띄우고 옛 꾸러미를 내린다. 잘못되면 옛 꾸러미를 다시 띄우면 된다.
예전 내 코드 ────────────────▶ 서버
(서버의 환경은 서버 사정)
지금 내 코드 + 그것이 돌던 환경 ──▶ 이미지 ──▶ 서버에서 컨테이너로 실행
(바닥이 같으니 여기서 되면 저기서도 된다)옮길 때만 쓰는 것이 아니다
바이브 코딩을 하다 어느 순간 컴퓨터에 고래 아이콘이 깔려 있는 것을 본 사람이 있을 것이다. 대개 이 용도다.
남이 만들어 둔 이미지를 받아 내 컴퓨터에서 그대로 띄울 수 있기 때문이다. 데이터베이스를 예로 들면, 앞 편에서 본 PostgreSQL을 내 컴퓨터에 직접 설치하지 않고 이미지로 받아 컨테이너로 띄운다. 설치 과정에서 생기는 문제를 통째로 건너뛴다.
다 쓰고 나면 컨테이너를 내리면 된다. 내 컴퓨터에는 흔적이 거의 남지 않는다. 여러 프로젝트가 서로 다른 버전을 요구할 때도 서로 안 부딪힌다.
즉 Docker는 배포 도구이면서 동시에 개발 환경 도구다. 앞 편에서 내 컴퓨터도 서버가 될 수 있다고 했는데, 그 서버를 여러 개 나란히 띄우는 방법이기도 하다.
Kubernetes, 그리고 Dockerfile 한 번 열어 보기
꾸러미가 하나면 관리할 것이 별로 없다. 여러 개가 되면 사정이 달라진다. 어떤 것을 몇 개 띄울지, 하나가 죽으면 언제 다시 살릴지, 요청이 몰리면 몇 개로 늘릴지를 정해야 한다.
그 일을 하는 것이 Kubernetes다. 글자 수가 많아 K와 s 사이 여덟 글자를 줄여 K8s라고 쓴다. 규모가 커진 서비스에서 쓰는 도구이지 처음부터 필요한 것은 아니다.
배포를 자동으로 굴리는 이야기도 여기 붙는다. 코드를 저장소에 올리면 알아서 빌드하고 검사하고 새 컨테이너로 교체하게 만들어 둘 수 있다. 이 자동 흐름을 CI/CD라고 부른다.
당장 해 볼 수 있는 일이 하나 있다. 프로젝트 최상단에 Dockerfile이라는 파일이 있는지 보고, 있으면 열어 보는 것이다. 설치하고 빌드하고 묶는 순서가 열 줄 남짓 적혀 있다. 배포 버튼을 누르고 몇 분을 기다리는 동안 무슨 일이 일어나는지가 거기 다 있다.
FROM node:22 ← 어떤 바닥 위에서 시작할지
WORKDIR /app ← 어느 폴더에서 작업할지
COPY package.json . ← 무엇을 꾸러미에 넣을지
RUN npm install ← 무엇을 설치할지
COPY . .
RUN npm run build ← 무엇을 빌드할지
CMD ["npm", "start"] ← 띄웠을 때 무엇을 실행할지
배포에 걸리는 몇 분은 이 줄들이 순서대로 실행되는 시간이다아홉 편을 한 줄로
브라우저가 서버에 요청을 보내고 파일을 받아 화면을 그린다는 한 줄에서 출발했다.
브라우저가 읽는 파일이 셋이고, 요청은 IP와 포트로 목적지를 정하며 도메인이 그것을 이름으로 바꾼다. 도착한 요청에 무엇을 줄지 정하는 것이 웹서버이고, 받은 것을 그리는 쪽이 프론트엔드, 줄 것을 만드는 쪽이 백엔드다. 값은 데이터베이스에, 파일은 스토리지와 CDN에 쌓인다. 그리고 이 전체를 다른 컴퓨터로 옮길 때 컨테이너를 쓴다.
이 순서를 알고 나면 다음에 만나는 낯선 이름도 어디에 붙는지부터 물을 수 있다. 그게 이 아홉 편의 목적이었다.
