Wecode - Project 3 (부트캠프)/세션

docker 세션 [개념, 명령어, docker file ]

JBS 12 2023. 10. 26. 22:51

docker는 hub에 가입하는 과정 필요 

-> 사이트 들어가서 가입 

무료 배포 버전, 

MS가 4조 주고 사려고 했음 

 

 

1. 가상화 하기 전 운영 방식

 

2. 가상화 

 

2-1. 하이퍼바이저 

원도우 하나에 다른 os 깔아서 호스트가 관리하며 쓰는 것 

- 각각의 os 해야 해서 

 

불편해서 만든 거 ->

os 를 가상화하지 말자, 서버만 별도로 

os가 아니라, 돌아가고 있는 서버만 -> 속도 빠르게 가능 


Docker 개념

 

윈도우에서는 되는데 맥에선 안 되고

서버 같은데 같은 코드인데 다른 사람 사람 코드에서는 안 되고 -> docker로 모든 사람들의 개발 환경을 똑같이 만듦

-> 똑같은 버전의 node가 설치된 걸 다운 받음

 

회사 가서도 

자잘한 설치 없이 docker로 하면, 

스펙/ 버전/ 메모리가 달라서 안 되는 게 없게

 

docker 구조

컨테이너 ~ os~ 이해하지 않아도, 

 

 

깃허브 -> 코드 공유, 클론 받으면, 코드는 같은데 환경이 달라서 에러 

도커 -> 코드가 돌아가고 있는 컴퓨터 환경을 os를 하나 만들어서, 다운 (컴퓨터 자체를 업로드/다운; 진짜 컴퓨터가 아니라 가상의 환경) 

 

네모는 서버 하나

가상 환경 위에 (다 linux) 다 올려서 환경을 다운 

- 엔진

- 어플리케이션 배포 

등 

어디서든 빠르게 실행 시킬 수

 

[Clinet]
docker 입장에서 client: (이미 돌아가고 있는) 백엔드 서버 

- docker build 명령어로 (8000 포트로 돌아가는) 서버 하나를 본을 뜨는 것
- docker pull (깃허브랑 비슷) 
- dokcer run

[Host]
다 업로드 되면,
images로 됨. (image 안에는 각 팀의 서버가들어가 있음) 
각 서버가 돌아갈 수 있는 - containers 

[Registry] Docker_Hub 
돌아가는 운영체제를 다운 받을 수 있는 ; 서버를 돌리는 
서버를 받아서 npm start하는게 아니라, 이미 돌아가고 있는 서버를 통째로 받는

* npm install 까지 다 되어 있는 걸 다운 받는 것

 

모든 사람 서버 다 접속 가능 -> 환경변수, 버전 상관 없이

 

[참고]

만들면서 이해하는 도커 이미지의 구조 _ 블로그

 

만들면서 이해하는 도커(Docker) 이미지: 도커 이미지 빌드 원리와 OverlayFS

도커 이미지는 유니온 마운트 기술을 활용해 계층화된 레이어들로 구성되며, 도커 레지스트리를 사용해 쉽고 효율적인 공유를 가능하게 해줍니다. 이 글에서는 도커 이미지가 저장되는 방식과

www.44bits.io

깃허브와 비교 

 

3. docker objects 

[Host의 image] 

:8000포트, npm, node, env 다 들어간 가상의 컴퓨터, 내 전체 pc /ping - /pong

:8000포트, npm, node, env 다 들어간 가상의 컴퓨터, 내 전체 pc /ping - /Hello 

 

각각 하나를 image라고 부름 (linux로 만들어놓은 image)

 

그 이미지 안에 돌아갈 수 있는 서버 자체를 container라고 부름 = 인스턴스 


이미지 만들고, 컨테이너 돌아가는지 확인, hub에 올려놓고, AWS EC2에 가서, 

 

이거를 안 하면, 

node 깔고, npm 깔고, 다운로드 하고, env 파일에 데이터베읏, jwt/ postname 수정, npm start하면 서버가 돌아감

 

node/ npm을 새로 설치하면 pakage버전 달라지고, 환경변수 버젼도 달라질 수 있고

 

그래서 온전히 돌아가는 서버 올려서

운영체제 통째로 다운 받아 (docker run하면됨)

 

 

build한다. = 온전히 돌아가는 서버 = 이미지 빌드 


dockerfile 만드는 ★문법 (그대로 사용 ) 

최상단에 

FROM node:18 -> 18버전  쓸거니까 똑같이 설치해 

 

= 컴퓨터를 만드는 거 = 가상 컴퓨터 

 

가상 컴퓨터 이름을 이렇게 만들거야 WORKDIR /usr/src/app 

 

npm install로 이 패키지들 다 설치해  --> 이거를 만들 때 

 

COPY .. : 코드 (실제 존재하는 모든 소스 코드들 복사해서 복제본  이미지에 넣어) 

 

8000 포트를 노출 시킬 거고

 

npm start를 실행시켜 (or npm dev)  --- string의 배열로 ---> docker 의 이미지 다운 받아서 docker run실행시킬 때 어떤 명령얼 할지 

 

 

폴더를 타지 않고, 컴퓨터 전체를 올리는 거라

위치 구애 받지 않고 할 수 있음 (npm 처럼) 

 

맥북 : docker 앱 다운

우분투 ; terminal


docker build 

$ docker build -t bigfanoftim/westudy:0.1.0 .

: 뒤에 버전 

 docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'

 

코드를 바꿔도 이미지는 안 바뀌어서 

docker build를 다시 해야 함

 

build를 하면 각자 다른 이름으로

image (컴퓨터)가 생김 

 

docker images 하면 각 images 다 나옴 

 

docker push 1.1 (각 버전을 쳐서 업로드)  -> Tags 가면 올라간 거 있음 

 

 

.env파일에 rds 연결해놓으면 프론트가 받아도 쓸 수 있음. 


docker 명령어

1. 컨테이너, 이미지 출력

# 실행중인 컨테이너 리스트를 출력
$ docker ps

# 실행이 종료된 것을 포함하여 모든 컨테이너 리스트를 출력
$ docker ps -a

# 생성 혹은 다운로드 된 이미지 리스트를 출력
$ docker images

 

2. 컨테이너, 이미지 삭제

# 모든 컨테이너를 삭제
$ docker rm $(docker ps -a -q)

# 모든 이미지를 삭제
$ docker rmi $(docker images -q)

3. 이미지 빌드(생성)

# docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
$ docker build -t bigfanoftim/westudy:0.1.0 .

애플 실리콘이 탑재된 맥북(M1)은 ARM으로 기존의 AMD64 설계 및 프로그램 동작 방식이 다릅니다. 만약 해당 맥북을 사용한다면 아래와 같은 옵션을 함께 작성해줘야 합니다.

# docker buildx build --platform=linux/amd64 -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
$ docker buildx build --platform=linux/amd64 -t bigfanoftim/westudy:0.1.0 .

 

4. 컨테이너 실행

아래와 같은 명령어를 입력할 시 로컬에서 해당 이미지를 먼저 찾아본 후 없다면 자동으로 Docker 저장소인 DockerHub에서 해당 이미지를 찾습니다. 그 후 곧바로 해당 이미지를 불러와 컨테이너를 실행합니다.

$ docker run --name api -p 8000:8000 bigfanoftim/westudy:0.1.0

추가로 여기서 백그라운드로 컨테이너를 실행하고 싶다면 -d 옵션을 사용하면 됩니다. 실제 Production 환경에서 실행될 컨테이너는 대부분 백그라운드 프로세스로 실행될 것 입니다.

$ docker run --name api -d -p 8000:8000 bigfanoftim/westudy:0.1.0

 

5. 실행중인 컨테이너에 쉘(shell) 접속

  • **-i** : 컨테이너의 표준 입출력을 사용하겠다는 의미입니다.
  • **-t** : 컨테이너의 pseudo tty(가상 터미널)를 통해 접속하겠다는 의미입니다.
  • 위의 두 옵션을 추가하여 실행중인 컨테이너의 쉘(Shell)에 접근하여 연속으로 명령어를 입력할 수 있습니다.
$ docker exec -it 'container name' /bin/bash

 

6. 로그

## logs
# 실행중인 컨테이너의 로그를 출력
$ docker logs 'container name'

## logs --tail 10
# --tail 옵션을 사용하여 로그 10줄만 출력
$ docker logs --tail 10 'container name'

## logs -f
# 로그를 실시간으로 출력
$ docker logs -f 'container name'

1. Dockerfile이란?

보통 Docker를 처음 접하게 되면 Docker에서 공식적으로 제공하는 이미지로 컨테이너를 생성하고 컨테이너 내부에 접속하여 수정하는 과정을 거치게 됩니다. 하지만 실제로 이러한 방식으로 애플리케이션을 운영하게 된다면 매번 컨테이너를 새로 만들 때마다 개발 환경 세팅을 다시 해줘야 합니다.

위와 같은 문제를 Dockerfile을 작성함으로써 해결할 수 있습니다. Dockerfile은 간단히 말해서 커스텀 이미지를 만드는 스크립트입니다. 따라서 기반이 되는 이미지, 즉 Docker에서 공식적으로 지원해주는 이미지 혹은 다른 사람들의 커스텀 이미지 위에 본인의 애플리케이션에 맞게 다양한 instruction을 추가하여 오로지 내 애플리케이션만을 위한 전용 이미지를 만들 수 있게 됩니다.

 

2. Dockerfile 작성

# Dockerfile

FROM node:16-alpine

WORKDIR /usr/src/app

# 현재 패키지 설치 정보(package.json, package-lock.json)를 Docker 이미지에 복사합니다.
COPY package*.json .

RUN npm install

# 현재 경로에 존재하는 모든 파일을 Docker 이미지에 복사합니다.
COPY . .

EXPOSE 3000

CMD ["npm", "start"]
  • FROM : 기반이 될 이미지를 선택( : 다음엔 버전)
  • WORKDIR : 컨테이너 실행 시 작업 디렉토리를 설정합니다. (이름 짓기)
  • COPY : 호스트에 있는 정보(코드)를 이미지에 복사. COPY를 나눠 사용하는 이유: 해당 레이어를 캐싱하여 효율적으로 운영하기 위함
  • RUN : package를 설치하는 등 쉘 명령어를 해당 이미지가 실행될 때 사용합니다.
  • EXPOSE : 컨테이너를 어떤 포트로 외부에 노출해야 할지 지정할 때 사용됩니다.
  • CMD : 컨테이너가 시작될 때 실행할 명령어를 지정할 수 있습니다.