본문 바로가기

여러가지/Docker & AWS

[섹션 2] Docker 이미지 & 컨테이너: 코어 빌딩 블록

-------------------------------------------------- 목차 ----------------------------------------------------

- 컨테이너 명령어(run, stop, start, rm, --name)

- Attached 컨테이너 vs Detached 컨테이너

- interactive 모드

- 이미지 명령어(생성, 삭제, 구성)

- 로그

- 이미지 레이어

- RUN vs CMD vs ENTRYPOINT

[실습 1] 로컬로 실행되는 NodeJS 애플리케이션

[실습 2] Dockerfile을 사용하여 자체 이미지 빌드

[실습 3] 이미지 내의 파일 변경 후, 재빌드

[실습 4] 컨테이너 <-> 로컬 시스템 파일 복사

-----------------------------------------------------------------------------------------------------------

 

 

● Docker Images

https://hub.docker.com/

 
 
● 이미지 다운로드
# docker pull node

 

● 컨테이너 명령어

ㄱ. 이미지를 사용하여 컨테이너 실행

> docker run -p <--> <-이미지 ID->

> docker run -p <--> -d --rm <-이미지 ID->

// --rm: 컨테이너 중지되면 자동 삭제, -d: detached 모드, 뒤에서 실행 <-> attached 모드, 앞에서(화면에서 실행)

ㄴ. 컨테이너 정지

> docker stop <-컨테이너 이름/ID->

ㄷ. 컨테이너 재시작

> docker start <-컨테이너 이름/ID->

ㄹ. 컨테이너 삭제

> docker rm <-컨테이너 이름/ID-> ...

=> 실행중 컨테이너 삭제 불가

ㅁ. 이름 지정

> docker run --name <-이름-> -p <--> <-이미지 ID->

 

 

● Attached 컨테이너 vs Detached 컨테이너

ㄱ. run

=> 기본 포어그라운드 실행

=> 로그가 터미널에 실시간으로 보여진다.

> docker run -p <--> -d <-이미지 ID-> // 백그라운드 실행

> docker attach <-컨테이너 이름/ID-> // 포어그라운드로 전환

ㄴ. start

=> 기본 백그라운드 실행

> docker start -a <-컨테이너 이름/ID-> // 포어그라운드 실행

 

 

● interactive 모드

=> 쌍방향, 대화형

> docker run -it <-이미지 ID->

> docker start -a -i <-컨테이너 이름/ID->

 

 

● 이미지 명령어

ㄱ. 생성

> docker build .

ㄴ. 삭제

> docker rmi <-이미지 ID-> ...

=> 해당 이미지 사용하는 컨테이너 없어야 삭제 가능

> docker image prune // 사용되지 않는 모든 이미지 삭제

ㄷ. 구성

> docker image inspect <-이미지 ID->

ㄹ. 이름&태그 지정

> docker build -t test:[1/latest] .

 

 

● 로그

> docker logs <-컨테이너 이름/ID->

> docker logs -f <-컨테이너 이름/ID-> // 포어그라운드로 생성된 로그 표시

 

 

● 이미지 레이어

=> 재빌드 시, 각 줄별로 실행

 

(+) 내용 변경 시, 이미지 재빌드 해야한다.

 

 

● RUN vs CMD vs ENTRYPOINT

ㄱ. RUN

실행 시점: 이미지 빌드

=> 이미지 빌드 과정에서 필요한 명령문을 수행

주로 이미지 안에 특정 소프트웨어를 설치할 경우 사용

ㄴ. ENTRYPOINT

실행 시점: 컨테이너 실행

=> 컨테이너를 띄울 때 최초에 실행 되어야하는 명령문일 경우 사용

ㄷ. CMD

실행 시점: 컨테이너 실행

=> 컨테이너를 띄울 때 변경할 수도 있는 명령문일 경우 사용, 하나의 Dockerfile에 하나의 CMD 명령어 사용 가능

 

 

[실습 1] 로컬로 실행되는 NodeJS 애플리케이션

1) 터미널

> npm install

> node server.js

2) localhost:80 접속

 

 

[실습 2] Dockerfile을 사용하여 자체 이미지 빌드

1) Dcokerfile 생성 및 빌드

----------------------------------------------------------------------------------------------------------------

FROM node

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app  // Dockerfile이 위치한 디렉토리 내의 모든 파일과 디렉토리(.)을 /app 디렉토리로 복사, COPY [로컬] [컨테이너]

EXPOSE 80

CMD ["node", "server.js"]

----------------------------------------------------------------------------------------------------------------

> docker build .

2) Image 생성 확인

3) 컨테이너 실행

> docker run -p 3000:80 <-이미지 ID->  // 3000: 호스트 머신의 포트 번호, 80: 컨테이너 내부 포트 번호

4) 컨테이너 생성 및 실행 확인

5) localhost:3000 접속

 

 

[실습 3] 이미지 내의 파일 변경 후, 재빌드

1) 기존 컨테이너 [정지/종료/삭제]

> docker stop <-컨테이너 이름->

2) 이미지 재빌드

> docker build .

3) 컨테이너 실행

> docker run -p 3000:80 <-이미지 ID->

4) localhost:3000 접속

 

[실습 4] 컨테이너 <-> 로컬 시스템 파일 복사

1) 파일 생성

2) 로컬 시스템 -> 컨테이너

> docker cp -L dummy/test.txt heuristic_bhabha:/test  // heuristic_bhabha: 컨테이너 이름, :/test: 경로

3) 컨테이너 -> 로컬 시스템

> docker cp heuristic_bhabha:/test -L dummy