본문 바로가기

Docker

[Docker] 도커를 써보자

지난 3주간 팀프로젝트를 하면서 항상 겪었던 불편함이 있었다.

팀원들간에 개발환경이 안맞는 것.

npm 버전이 서로 다르기 때문에 같은 리액트 라이브러리를 설치해도 package.json 이나 package-lock.json 의 내용이 달랐다.

그래서 항상 브랜치 병합 과정에서 충돌이 생겼다.

이에 대한 해결책으로 리액트 라이브러리 설치시 서로에게 알리고 package.json 파일은 한명만 올리기로 했다.

그러면 나는 git pull 을 받아와서 실행할 때마다 npm install 을 해야하고, 개발 후에 commit을 할 때는 package.json 을 discard 시킨 후에 올려야 했다.

 

정말 너무 불편했다!!

 

이게 끝이 아니다.

pip 라이브러리중 pymssql을 설치해야 했는데, 각자 환경에 따라서 pymssql이 설치가 되는 사람이 있었고 안되는 사람이 있었다.

이게 설치가 안되면 데이터베이스에 접근을 할 수 없다.

해결방법을 몇 시간을 검색해봐도 남들은 다들 잘 해결됐다는데 이상하게 우리 팀원들은 해결이 안됐다.

정말 스택오버플로부터 깃 이슈, 구글링 이곳저곳을 다니며 시도해본 방법만 10가지가 넘었다.

개발환경이 서로 다름에서 오는 협업의 불편함은 정말 치명적이었다.

 

듣기로는 "도커"를 쓴다면 이런 문제를 겪지 않을 수 있다던데...

우리에게 주어진 기간은 3주였다.

3주 안에 기획과 개발을 모두 마쳐야하는데, 도커를 따로 공부하기에는 시간이 부족했다.

 

그래서 다짐했다.

이번 팀 프로젝트가 끝나면 꼭 도커를 공부해보기로.

그래서 오늘 첫 스타트를 끊었다.

 

도커는 애플리케이션이 실행되기 위한 프로그램이 설치되어 있는 Linux 환경을 컨테이너 형태로 띄울 수 있는 소프트웨어다.

우리 컴퓨터 위에 이 도커를 띄우면 모두가 같은 환경에서 개발할 수 있다.

 

예를 들면 이렇다.

Linux 운영체제에 파이썬을 설치하고 개발에 필요한 각종 pip 라이브러리를 설치한다.

그리고 이것을 컨테이너화 시킨다.

다른 팀원들도 컨테이너화된 이 환경을 받아와서 개발을 진행한다.

그럼..?! 모두가 같은 환경에서 개발이 가능하다!

 

사실 잘은 모르지만 들리는 소문에 의하면 그렇다고 한다.

아직 도커를 사용해서 협업을 해보지 않아서 정말 가능한건지 모르겠다.

일단 좋은 희망을 얻었으니 도커에 대해 무작정 배워보기 시작했다.

 

도커 용어

 

이미지(image) : 컨테이너 실행에 필요한 파일과 설정 값들을 포함하고 있는 것

컨테이너(container) : 이미지를 실행한 상태

포트 포워딩(port forwarding) : 도커 호스트의 포트와 컨테이너 포트를 연결하는 것

 

도커 명령어 (- 가 붙은 것은 옵션 태그로 없어도 되고 여러 개가 있어도 된다)

 

docker images : 이미지 리스트

docker pull <image> : 이미지 다운로드

docker rmi <image> : 이미지 삭제

docker ps : 실행중인 컨테이너 리스트

docker run <image> : 이미지 컨테이너 생성 + 컨테이너 실행

docker run --name <name> <image> : 지정한 이름으로 이미지 컨테이너 생성

docker stop <container> : 컨테이너 종료 (컨테이너 이름 또는 컨테이너 아이디로 지정 가능)

docker start <container> : 컨테이너 실행

docker logs <container> : 컨테이너 로그 확인

docker logs -f <container> : 컨테이너 로그 모니터링

docker rm <container> : 컨테이너 삭제 (컨테이너가 반드시 종료되어 있어야 한다)

docker rm --force <container> : 컨테이너가 종료 되어있지 않아도 바로 삭제

docker run -p <host port>:<container port> <image> : 도커 이미지를 port forwarding 하여 컨테이너 생성 + 실행

docker exec <container> <command> : 컨테이너 내부에서 명령어 실행

docker exec <container> -it /bin/sh : 컨테이너에 명령어를 계속 내릴 수 있는 상태로 진입

docker exec <container> -it /bin/bash : 기본적으로 컨테이너들의 명령어는 /bin/sh 에서 입력받지만 이미지의 종류에 따라 /bin/bash 가 가능할 수도 있다.

exit : docker exec <container> -it /bin/sh 종료

docker run -v <host path>:<container path> <image> : 호스트(로컬)의 작업 디렉토리와 컨테이너의 디렉토리 연결하여 컨테이너 실행

docker run -d <image> : 컨테이너를 데몬으로 실행(CLI를 닫아도 컨테이너 유지)

docker build -t <image name> <path> : 현재 경로에 있는 Dockerfile 내용을 읽어서 지정한 이름으로 이미지 생성

'Docker' 카테고리의 다른 글

[Docker] 깃 패키지로 컨테이너 관리하기  (0) 2021.10.31
[Docker] 이미지를 만들어보자  (0) 2021.10.28