나의 발자취

Dockerfile 문법, 도커 이미지 생성 도커 컨테이너 수명 주기, 도커 명령어 본문

Backend

Dockerfile 문법, 도커 이미지 생성 도커 컨테이너 수명 주기, 도커 명령어

달모드 2024. 11. 1. 16:24

지난 포스팅의 Dockerfile 참고

2024.11.01 - [Backend] - Docker에 대한 기본 개념 정리, Docker 기본 명령어 정리

 

Docker에 대한 기본 개념 정리, Docker 기본 명령어 정리

가상머신: 각각의 앱을 실행하기 위해 각각의 OS가 올라가므로 굉장히 무겁다.도커: Container Engine(Docker)이라는 SW를 설치해 개별 컨테이너가 생성되어 각 앱을 고립된 환경에서 실행할 수 있다.  

wildguess.tistory.com

 

 


 

Dockerfile 문법

귀여운 고래 모양이 그려진 Dockerfile을 클릭해보면, 아래와 같이 전용 도메인 언어(instruction)로 이미지 구성이 정의되어있다.

 

FROM node:10.16.3
RUN mkdir -p /app
WORKDIR /app
ADD . /app
RUN npm install
ENV NODE_ENV=development
EXPOSE 3000 80
CMD ["npm","start"]

명령어 한줄 한줄씩 처리가 되면서, 마치 포토샵의 레이어와 같이 이미지가 변경되는 스텝이 순차적으로 실행된다고 보면 된다.

 

 

FROM <이미지명>:<태그>

RUN <도커 컨테이너 안에서 실행할 명령>

COPY <원본파일/디렉토리> <대상 디렉토리>

CMD ["명령1" "인자1" "인자2" ...] 또는 CMD <명령> <인자1> <인자2> ...

 

ADD <원본> <대상> 또는 ADD ["원본", "대상"] (공백 있을 경우)

ENV <환경 변수명> <값>  : 환경 변수 설정

EXPOSE <포트1> <포트2>

WORKDIR [작업 디렉토리 경로]

LABEL : 이미지를 만든 사람에 대한 정보, 저작권

COPY vs ADD?
둘 다 복사하는 명령어이다. 그럼 언제 어떤 걸 써야할까?

- COPY: 로컬만 가능
- ADD: 로컬/원격 모두 가능

COPY는 로컬에 있는 원본파일일때만 사용할 수 있고, 로컬에 없을 때에는 ADD 명령어를 써야한다.
RUN 과 CMD의 실행 시점?
- RUN: 이미지를 만들 때 
- CMD: 만들어진 이미지를 실행할 때

따라서 이미지를 만들고 그다음 실행

 

 

docker 이미지 빌드

docker image build <도커 파일 경로> -t <이미지명[:태그명]>

 

  • 태그 생략 시: latest
  • [-f 다른 파일 명] 옵션: 파일명이 Dockerfile이 아닌 경우
  • [-pull = true]: base image를 매번 다시 받음
  • 이미지명에 사용자 namespace를 추가: 이미지명 충돌 방지 e.g.) Examples/guestbook4node

 

 


도커 이미지 빌드

이렇게 파일이 있는 상태에서, 

docker image build ./firstNodeDockerApp -t firstnode-app:1.0

 

명령어를 쳐서 이미지 빌드를 실행해준다.

 

 

그리고 방금 생성한 이미지를 확인해보면, 아래와 같이 firstnode-app 레포지토리가 잘 생성된 것을 볼 수 있다. 

 


도커 컨테이너 생명주기

실행 중: Dockerfile의 CMD/ENTRYPOINT instruction에 정의된 앱 실행 중 상태

정지: 사용자에 의한 명시적 중단

정상적인 실행의 종료

컨테이너 종료 시점의 상태를 디스크에 저장(재실행)

 

파기 Purge

디스크 공간 확보를 위한 명시적인 완전 삭제

동일한 이미지로 다시 실행한 경우 완전히 다른 컨테이너

 


 

도커 컨테이너 관리 주요 명령1

 

docker container run 

- 도커 이미지에서 컨테이너 생성 및 실행

docker container run <옵션> <이미지명 [명령] [명령인자...]>

docker container run <옵션> <이미지 ID [명령] [명령인자...]>

 

docker container run -it alpine:3.7

docker container run -it alpine:3.7 uname -a

  • -i: Interactive 모드. 컨테이너의 표준 입력을 활성화하여 사용자와 상호작용할 수 있도록 한다.
  • -t: TTY를 할당. 가상 터미널을 제공하여 더 나은 사용자 경험을 제공한다. 즉, 터미널 환경에서 실행되는 것처럼 보이게 한다

 

이 두 옵션(-it)을 함께 사용하면 사용자와의 상호작용이 가능하며, 터미널에서 명령어를 직접 입력하고 결과를 확인할 수 있다!

 

 

 

 

명령어를 실행하면,

아래와 같이 컨테이너 안으로 들어오게 된다.

 

 

Cmd+ C 해서 컨테이너 종료

quit 명령어 치면 터미널에서 나오게 된다.

 


컨테이너에 원하는 이름 붙이기: 
자동 이름 대신 알기 쉬운 이름으로 개발 생산성 향상

docker container run --name <컨테이너명> <이미지명[:태그]>

#2. 컨테이너에 원하는 이름 부여하기
docker container run -d --name helloworld hello.docker/hello-world
docker ps
  • -d: Detach 모드. 컨테이너를 백그라운드에서 실행하도록  함. 이 옵션을 사용하면 명령어 실행 후에도 터미널을 사용할 수 있다.
  • ps: Process Status의 약어. 현재 실행 중인 컨테이너 목록을 보여주는 명령어

 


 

도커 foreground /background 실행, 포트 포워딩

1. Foreground 실행(attached mode)

docker container run <이미지명:태그명>

 

2. Background 실행(detached mode)

docker container run -d <이미지명:태그명>

표준 출력 -> 컨테이너 ID

 

3. 포트 포워딩: 컨테이너 밖의 요청을 컨테이너 안으로 전달

-p HOST_PORT:CONTAINER_PORT

호스트 포트는 생략이 가능하다(자동 할당)

 

docker ps


#3. 컨테이너 포그라운드 실행 (중지: ctrl + c)
docker container run --name firstnode firstnode-app:1.0

#4. 지정 포트로 컨테이너 백그라운드 실행.
docker container run -d -p 80:3000 guestbook-app

이렇게 도커로 컨테이너를 실행한 후에 포트번호 주소로 가본다. (port no: 80)

 

아래와 같이 잘 나타나는 것이 보인다.

 

 

 

Port Forwarding

그런데, 명령어 docker ps를 켜서 현재 돌아가고 있는 컨테이너를 보면 PORTS 컬럼 아래에 80포트에서 3000 포트로 옮겨간 것이 보인다.

앞서 명령어에서 컨테이너를 실행할 때 아래와 같이 80:3000으로 명령했었다.

docker container run -d -p 80:3000 guestbook-app

 

-> 실제 호출되는 컨테이너는 3000번 포트로 응답하도록 실행되는 것이다.

 

만약 포트포워딩을 해주지 않으면, 로컬 컴퓨터에서 접속할 방법이 없다.

만약 -p 옵션을 생략하면, 포트번호가 임의로 지정이 된다.

 

 

현재 실행 중인 Docker 컨테이너의 ID를 간단하게 출력하는 명령어

 docker container ls -q

 

 

가 아래에서 많이 쓰일 예정이다.


 

Docker 컨테이너 실행중 컨테이너 목록 표시 (옵션)

docker container ls  또는 docker ps

 

  • -q: 컨테이너 ID만 추출
  • -- filter "필터명=값"
  • -a: 종료된 컨테이너 목록

#6. 실행 중인 도커 컨테이너 필터링 후 표시
docker container ls --filter "name=guestbook-app"

#7. 종료된 컨테이너 목록
docker container ls -a
docker ps -a

 

 


 

Docker 컨테이너 종료/재시작/파기

1. 실행중인 컨테이너 종료: docker container stop <container ID 또는 container name>

2. 컨테이너 재시작: docker container restart <container ID 또는 container name>

3. 컨테이너 파기: docker container rm [-f] <container ID 또는 container name>

#8. 컨테이너 종료
docker container stop <guestbook-app의 container id>

#9. 컨테이너 재시작
docker container restart firstnode

#10. 컨테이너 파기
docker container rm <CONTAINER_ID>

 

 

 

현재 아래와 같이 컨테이너가 실행중이다.

 

컨테이너 종료를 위해, 컨테이너 id를 복사해서 붙여준다.

docker container stop <컨테이너 id>

 

이렇게 종료가 된 것이 보인다. 

 

재시작을 해준다.


특정 파일을 변경해서 도커로 바로 띄우고 싶을때

1. 표준 출력 연결하기

- 실행 중인 특정 도커 컨테이너의 표준 출력 내용 확인

docker container logs -f(표준 출력 내용을 계속 볼 경우) <컨테이너 ID/컨테이너명>

 

2. 실행중인 컨테이너에서 명령 실행

- 컨테이너에 SSH 로그인을 한 것 처럼 컨테이너 조작

docker container exec <option> <컨테이너 ID/컨테이너명> <컨테이너에서 실행할 명령>

위에서 말했다시피, -it 옵션은

-it: 표준 입력 연결 유지(i) 및 유사 터미널 할당(t)

 

#11. 실행 중인 컨테이너에 명령 실행
docker container exec <CONTAINER_ID/CONTAINER_NAME> pwd
docker container exec -it <CONTAINER_ID/CONTAINER_NAME> bash
mv header.ejs _header.ejs

 

 

 

그리고 bash로 들어가게 된다.

views 안에 들어가자.

 

그리고 exit하고 나와서 해당 파일을 수정해준다.

#12. 컨테이너에 파일 복사
docker container cp header.ejs <CONTAINER_ID/CONTAINER_NAME>:/app/views/header.ejs

 

그리고 해당 경로를 가서 위 명령을 실행해준다.

 

그리고 다시 Localhost:80에 가보면

위에서 수정한 내용이 잘 반영된 것을 볼 수 있다!


도커 컨테이너 파일 복사 / 사용 현황 확인

컨테이너에 파일 복사

 

  • 컨테이너 끼리 또는 컨테이너와 호스트간 파일 복사
  • 주로 디버깅 중 컨테이너 안에서 생성된 파일을 호스트로 가져와 확인하는 용도
  •  
# 기본 형식
docker container cp <컨테이너ID/컨테이너명:원본 파일> <대상 파일>
docker container cp <호스트 원본 파일> <컨테이너ID/컨테이너명:대상 파일>

# 실제 사용 예시
PS D:\DockerClass\GuestBook4ExpressJS\views> docker container cp header.ejs guestbookapp:/app/views/header.ejs
PS D:\DockerClass\GuestBook4ExpressJS\views> docker container exec -it guestbookapp sh
# cd views
# ls
404.ejs  _header.ejs  error.ejs  footer.ejs  header.ejs  index.ejs  new-entry.ejs

 

 

사용 현황 확인

 

  • 컨테이너 단위로 시스템 리소스 사용 현황 확인
  • 명령어 구문: Docker container stats <옵션> <대상_컨테이너ID...>
  • 출력 예시
CONTAINER ID  NAME             CPU %  MEM USAGE / LIMIT    MEM %   NET I/O         BLOCK I/O       PIDS
7c6426ba822e  guestbookapp    0.00%  30.17MiB / 1.952GiB  1.51%   14.4kB / 6.29kB  1.09MB / 8.19kB  23
9ab24226bf94  suspicious_bose  0.00%  32.45MiB / 1.952GiB  1.62%   3.76kB / 1.15kB  20.5kB / 4.1kB   23

 


 

도커 명령줄 도구 사용법

docker <관리명령> <하위명령> <옵션>

docker container run

  • 축약형: docker run
  • 관리명령 전체 도움말: docker help
  • 특정 관리 명령 하위명령 전체 도움말: docker <관리명령> --help
    e.g.) docker image -help
  • 특정 하위명령의 도움말
    docker <관리명령> <하위명령> --help
docker help

 

터미널에 위 명령어를 쳐보면, 아래에 쭉쭉 커맨드들이 나온다.

 

 

 

Comments