도커는 간단히 말해서 내 컴퓨터 안에 작은 컴퓨터를 하나 더 만드는 것

하지만 컴퓨터 안에 새로운 컴퓨터를 설치하자니 용량도 매우 많이 잡아먹고, 속도도 느려짐, 때문에 도커 서비스가 등장, 도커 같은 경우는 꼭 필요한 기능들만 설치하여 필요없는 파일은 제외하고 설치하니 훨씬 용량도 적고 속도도 빠름
위에서 꼭 필요한 기능들을 커널(os의 핵심 기능을 구현한 프로그램)이라 부름. 하지만 윈도우에서 linux를 쓸 경우 운영체제가 완전 다르고, 공유하고 있는 커널들도 다르기 때문에 WSL(Windows Subsystem for Linux)를 설치해줘야 한다.
비슷한 걸로는 npm, git 등이 있음
npm을 설치하면 npm install, npm publish 방식으로 라이브러리를 업로드 및 다운로드 할 수 있고 깃도 마찬가지로 git을 설치한 후에 git pull, git push를 통해 소스코드를 업로드 및 다운로드 할 수 있다.
이 처럼 도커도 docker를 설치한 후 docker push, docker pull을 통해 운영체제를 업로드 및 다운로드 할 수 도 있다.
docker pull로 docker파일을 다운 받을 수도 있고, docker 파일 내에서 FROM을 통해서 다운로드 받을 수 있다.
FROM ubuntu:22.04

이런식으로 hub.docker.com 에 있는 파일들을 앞의 이름으로 적고 뒤에 원하는 버전을 기입하여 다운받을 수 있다.
RUN 명령어
RUN을 하면 명령어를 실행할 수 있다
EX) RUN mkdir qqq

위처럼 해도 되지만 저렇게 해둔 것을 이미 다른사람이 올려둔게 있다
하지만 내 소스코드를 위의 운영체제에서 실행하고 싶지만, 내 코드는 도커에 올라가있지 않다. 때문에 도커 컴퓨터에 내 소스코드를 올려줘야 한다.

폴더를 만들어서 그 안에 모든 파일을 복사하는 명령어이다. 여기서 copy를 잘 보면
COPY . /myfoler/ 로 되어있는데
좌측이 내 컴퓨터 , 오른쪽이 docker컴퓨터이다
즉 내 . (현재경로)에 있는 파일들을 docker컴퓨터의 /myfolder/에 복사해달라 라는 뜻이된다

위처럼 하면 안됨, 왜냐하면 지금 현재의 node_modules는 내 컴퓨터에서 node가 다른 버전으로 설치되었는데 현재 도커파일에서는 node가 14로 고정되어 있기 때문에, 다른 환경이 되버림
그래서 node_modules는 옮기면 안됨 이런걸 어떻게 하느냐, gitignore처럼 .dockerignore파일이 있다


위처럼 하면 되긴 하지만, 이러면 매번 실행할 때 마다, node를 다운받게 된다.
그래서 보통 셋팅 단계, 실행 단계로 구분한다. 그래서 구분하기 위해 RUN yarn start부분을 다르게 쓸 수 있다.

위처럼 CMD로 하면 CMD부분을 실행 단계로 구분해서 이미지를 만들 때 포함이 되지 않는다.
docker파일이 여러개 또는 같은 docker파일을 써야하는 컴퓨터가 여러대일 경우 모두 다 한번에 똑같은 파일을 다운 및 관리해주어야 하니 그룹화 해서 이용하면 편하다. 이러한 그룹을 docker-compose라고 하며 이를 이용해 일괄적으로 실행 및 다운 삭제 등 관리를 유용하게 한다 docker-compose.yaml파일을 생성해서 지정해준다

build는 말그대로 최적화 해주기 (이미지 최적화), context에는 경로, dockerfile 에는 docker파일이름
이후 실행할 때 build를 한 번 해줬으면 docker-compose up 으로 실행한다.
그리고 해당 docker 컴퓨터로 들어가려면
docker ps 하면 도커의 현재 process 및 container 가 나오는데,
docker exec -it [container] /bin/bash 하면
명령어 칠 수 있는 shell이 나오고 그대로 실행되게 된다.

정상적으로 실행되면 위처럼 실행이 된다. 하지만 직접 localhost:3000에 접속하면 접근이 안된다. 왜 그럴까?
포트포워딩 때문. 원래는 내컴퓨터에서 작동하니 포트 3000으로 작동되지만, 현재 상황에서는 도커 컴퓨터에서 서버를 실행시켰기 때문에, 도커의 포트3000번이 열려도 내 컴퓨터에서는 접근이 불가능하기 때문이다.
때문에 내 컴퓨터에서 도커에 접속하기 위한 통로를 만들어주어야 한다. 즉 docker에 3000번 포트를 인식가능하게 만드는 것이다. 이 연결이 되는 지점 3000번 포트같은 부분을 포트포워딩이라고 한다.

위와 같은 식으로 로컬에서 2500번 포트를 실행시키 하지만 도커에서 4000포트를 내 컴퓨터로 연결해서 보여줄 수도 있다. 이걸 어떻게 코드로 구현하냐면 아래와 같다.

ports를 추가해주면 된다. 왼쪽이 내컴퓨터, 오른쪽이 도커 컴퓨터이다. 즉 내 로컬에 열 포트번호 : 도커에 인식되어있는 포트번호