리눅스

Docker 설치 및 컨테이너 기반 개발환경 구축

bluefrog 2025. 4. 21. 08:42

처음에 도커(Docker)라는 걸 들었을 때는 그냥 '뭔가 서버랑 관련된 개발자들이 쓰는 도구' 정도로만 생각했다. 근데 실제로 백엔드 개발 조금만 하다 보면 도커 안 쓰는 환경이 오히려 더 불편하게 느껴질 때가 온다. 나도 맨 처음에는 pip install, npm install, apt install 이런 걸로 로컬 개발환경 하나하나 세팅해가면서 하다가, 어느 순간 똑같은 걸 여러 팀원이 반복하고 있다는 게 너무 비효율적이라는 걸 깨달았다. 그래서 도커를 본격적으로 써보기 시작했고, 지금은 거의 모든 개발환경을 도커 컨테이너로 만들고 있다.

설치부터 이야기하자면, 도커는 공식 문서대로 따라가면 어렵지 않다. 우분투 기준으로는 아래 명령어 몇 줄이면 끝난다.

bash
복사편집
sudo apt update sudo apt install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

설치가 끝나면 sudo systemctl start docker로 데몬 실행하고, docker --version으로 잘 깔렸는지 확인해주면 된다. 그리고 개발용으론 매번 sudo 치는 게 귀찮으니까 현재 사용자에게 도커 권한을 주는 것도 자주 한다. sudo usermod -aG docker $USER 하고 나서 로그아웃/로그인하면 된다.

이제부터가 진짜인데, 도커를 잘 쓰는 핵심은 Dockerfile이랑 docker-compose.yml을 잘 정의하는 데 있다. 나는 주로 Node.js, Python Flask, Django 같은 백엔드 개발환경을 많이 다루는데, 그럴 땐 보통 Dockerfile 안에 베이스 이미지 설정하고, 필요한 패키지 설치하고, 포트 열고, 실행 커맨드 정리해둔다.

예를 들면 이런 식이다:

Dockerfile
복사편집
FROM node:18 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["npm", "run", "dev"]

이렇게 하나 만들고 docker build -t myapp . 하면 이미지가 생기고, docker run -p 3000:3000 myapp 하면 바로 실행된다. 신기했던 게, 진짜 OS 환경부터 패키지 버전까지 완벽하게 통일되니까 '내 로컬에선 잘 됐는데?' 하는 소리 할 일이 없어졌다.

근데 실제로 팀 프로젝트에서 많이 쓰는 방식은 docker-compose다. 여러 개의 서비스가 함께 돌아가야 할 때, 예를 들어 백엔드 + DB + Redis 이런 식일 때는 docker-compose.yml 하나로 모든 컨테이너를 정의하고 한 번에 올릴 수 있어서 너무 편하다. 예전엔 DB 따로 깔고 포트 맞추고 진짜 정신없었는데, 이젠 그냥 docker-compose up -d 한 줄로 끝난다.

예시 하나만 보여주자면:

yaml
복사편집
version: '3' services: web: build: . ports: - "3000:3000" volumes: - .:/app depends_on: - db db: image: postgres:15 environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - pgdata:/var/lib/postgresql/data volumes: pgdata:

위처럼 구성하면 웹 서버랑 DB가 따로 컨테이너로 뜨고, 데이터는 볼륨에 저장돼서 컨테이너를 지워도 데이터는 안 날아간다. 그리고 depends_on 덕분에 순서대로 실행되는 것도 자동으로 정리된다.

한 가지 팁을 주자면, 도커 컨테이너 안에서 디버깅하거나 로그를 확인할 때는 docker logs, docker exec -it 이런 명령어를 자주 쓰게 된다. 예전엔 서버 직접 SSH로 들어가서 봤는데, 요즘은 그냥 docker ps로 컨테이너 ID 확인하고 바로 들어가서 문제를 해결한다. 디버깅 속도가 진짜 빨라졌다.

처음에는 조금 낯설고 복잡하게 느껴질 수 있는데, 한두 번 써보면 금방 익숙해진다. 오히려 안 쓰면 불편할 정도로. 특히 여러 명이 같은 환경에서 개발해야 하는 팀 프로젝트라면 도커는 거의 필수라고 봐도 된다. 누구는 Python 3.10, 누구는 3.8 이렇게 다르면 진짜 지옥이 따로 없다.

결론은, 도커는 개발자에게 있어서 일종의 '가상화된 개발환경의 스냅샷' 같은 느낌이다. 내 환경 그대로 다른 사람에게 넘겨줄 수 있고, 필요하면 바로 지우고 다시 만들 수도 있고, 테스트용 환경도 손쉽게 만들 수 있다. 한번 익혀두면 진짜 개발이 훨씬 효율적이고, 실수도 줄어든다. 아직 도커 안 써본 사람이라면 지금이라도 꼭 한 번 설치해서 기본적인 예제부터 돌려보는 걸 추천한다. 이건 분명 시간을 아끼는 기술이다.

4o