Docker

전은평·2023년 4월 5일
0

Docker란

가상머신과 비슷하지만, docker는 추가적인 운영체제 설치가 필요가 없기 때문에 가상머신보다 훨씬 빠르고 자원을 효율적으로 사용할 수 있는 일종의 가상머신이라고 생각하면 될 것 같다.

docker를 사용하는 이유로는 협업을 하기 위해선 컴퓨터의 개발환경을 모두 똑같이 맞춰야하는데 현실적으로 어려운 부분이 많이 있기 때문이다. 이를 간단하게 해주는 것이 바로 docker다

docker는 개발 환경 요소들이 설치된 모습을 이미지로 저장하고 저장한 이미지를 클라우드에 올린다. 이렇게 생성된 이미지들이 서로 연결되서 동작하는 설정을 문서(Dockerfile)로 저장하고 새 컴퓨터에 가서 복사한 문서의 내용대로 이미지를 다운받아 설치하면 된다.

docker 허브에서는 npm 다운 받는 것처럼 다른 사람들이 올려놓은 이미지를 다운로드도 가능!

docker의 또 다른 장점으로는 한 컴퓨터에서 다른 환경의 여러 서비스를 실행해야 하는 경우, 컨테이너로 분리되어 있기 때문에 서로 독립되어 실행될 수 있다는 점이다.

실습을 통해 백엔드 서버 & 데이터 베이스 서버를 동시에 열어서 관리가 가능하다는 점을 알 수 있었다!


Docker 명령어

docker build . : dockerfile을 실제 이미지로 만들기
docker images : 생성된 image 조회
docker run iamgeID : 이미지 실행 => 가상컴퓨터(=컨테이너) 생성
docker ps : 실행중인 docker 프로그램 조회
docker ps -a : 종료된 컨테이너까지 모두 조회
docker ps -a -q : 종료된 컨테이너 ID만 모두 조회
docker rm containerID : 해당 컨테이너 삭제
docker rm (back tick)docker ps -a -q(back tick) : 컴퓨터 전체 조회하고 삭제
docker rmi imageID : 해당 이미지 삭제
docker rmi ()docker images -q() : 전체 이미지 삭제(마찬가지로 괄호 안에 back tick)
docker exec -it containerID /bin/bash
: 해당 도커로 접속 후 화면을 bash 쉘로 바뀜
: 다시 말해, 도커에서 돌아가고 있는 가상 컴퓨터의 터미널로 들어온 것
cat 파일명.js : 파일 안 내용 확인(서버 실행 안되도 조회 가능)
exit : 컴퓨터에서 나가기
docker stop containerID : 도커 종료
docker images -q : 모든 이미지 중 아이디 번호만 조회
docker system prune -a : 캐쉬, 네트워크, 사용되지 않는 이미지만 삭제, 즉 '실행되고 있는 컨테이너는 유지'
docker run -p 내로컬(포스트맨)에서 요청하는port:도커컴퓨터port 컨테이너ID : 포트 포워딩!


.dockerignore

: 각자의 컴퓨터 환경에서 설치된 nodemodules 폴더로 모듈을 관리했다면, 가상 컴퓨터에서는 서로 다른 환경에 간섭 받지 않도록 모듈 설치해줘야함 !
: 도커 파일 안에서 소스 코드로 node_modules를 통일시킬 예정!
: 따라서 node_modules은 복사하면 안됨
: '도커 파일에 가지고 올 때 무시해줘' .dockerignore 파일 만들고 안에 node_modules입력하면 됨!!
: 이제 도커에서는 node_modules 폴더를 무시하여, COPY . 명령어로 모든 소스코드를 복사해 올 시, node_modules 폴더가 복사 되지 않음~~


포트 포워딩

중요한 개념!!!

지금까지 yarn start:dev 명령어로 express 서버를 3000번 포트에서 실행하고 localhost:3000에 접속하면 문제가 없었지만,

Docker 환경에서는 내 컴퓨터 안에 도커라는 프로그램이 있고, 그 안에서 express 서버가 실행 중인 상태!

그렇기에 가상 컴퓨터 안에서는 3000번 포트로 잘 접속되지만, 내 컴퓨터에서는 3000번에 아무 것도 존재하지 않아 요청 시 길을 잃어버리게 되어 접속 할 수 없게 됨

가상 컴퓨터의 3000번과 내 컴퓨터의 포트를 연결해줘야하는데 그것이 바로

'포트 포워딩!!!!!!!!!!!!!'

아래와 같은 원리로 포트를 연결해줘야 함!

포트 포워딩으로 주소 변경 후 이미지 새롭게 다시 만들고 실행해야 해당 컴퓨터에서 서버 요청 정상작동됨


Docker와 package.json

docker 파일의 소스코드를 일부 수정한 경우, docker 이미지를 다시 build 해야한다. 이러한 과정에서 package.json의 내용은 변경사항이 없더라도 dockfile을 어떻게 설치하냐에 따라 재설치를 강행하게 되는데 이는 매우 비효율적 이다!!

docker는 이미지를 생성하고 임시저장공간에 파일들의 캐시를 저장하게 된다. 그렇기 때문에 파일에 변화가 없는 경우 새로 파일을 복사하고 설치하는 일련의 과정을 거치지 않는다. 근데 만약 아까처럼 파일에 변경이 생기게 되면 캐시가 깨져 다시 파일을 설치하게 된다.

dockerfile은 제일 위에서 순차적으로 코드를 실행하면서 캐시가 깨진 파일을 만나게 되면 그 이후의 과정은 파일의 실제 변경 유무와 상관없이 깨졌다고 간주하고 다 새롭게 설치를 하게 되는 것이다.

이를 위해서 아래와 같이 dockerfile을 생성하면, 불필요하게 설치하는 과정을 생략할 수 있어 아래와 같은 순서로 이미지를 설계하자!

컴퓨터 만드는 설명서

# 1. 운영체제 설치(node 14버전과 npm과 yarn이 모두 설치되어있는 리눅스)

FROM node:14

# 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기
COPY ./package.json /myfolder/
COPY ./yarn.lock /myfolder/
WORKDIR /myfolder/
RUN yarn install

COPY . /myfolder/   //이 부분에서 캐시가 깨지는 경우 다반사

# 3. 도커안에서 index.js 실행시키기
CMD yarn start:dev
profile
profile
`아는 만큼 보인다` 라는 명언을 좋아합니다. 많이 배워서 많은 걸 볼 수 있는 개발자가 되고 싶습니다.

0개의 댓글