Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

ENN

Docker에 대해 알아보자 본문

백엔드

Docker에 대해 알아보자

ParkIsComing 2022. 12. 26. 20:27

 ENN 블로그 포스팅 중에 Docker에 대한 간단한 설명을 담은 포스팅이 이미 존재한다.

따라서 기존 글과 차별화될 수 있도록 해당 글에서는 Docker를 전혀 모르는 이들도 이해하고 사용할 수 있도록 원론적인 설명부터, 코드 중심의 실용적인 내용까지 폭넓게 담았다. 

기본 용어 정리

이미지

  • 특정 프로세스를 실행하기위해 필요한 모든 설정값들은 포함한 캡쳐본 같은 존재
  • 서비스 운영에 필요한 서버 프로그램, 코드, 라이브러리, 컴파일된 실행 파일 등을 모두 포함한다.

컨테이너

  • 이미지를 실행한 상태
  • 응용 프로그램의 종속성과 함께 응용프로그램 자체를 패키징, 캡슐화 하여 격리된 공간에서 프로세스를 동작시키는 기술

가상컴퓨팅과 docker의 차이

  • 가상컴퓨팅은 한 물리적 컴퓨터 안에서 물리적 자원을 나눠서 쓴다. 따라서 성능에 한계 존재한다.
  • 도커는 실행환경만 독립적으로 돌리기 때문에 훨씬 가볍고 빠르다.

Docker 환경설정

자신의 OS 환경에 맞춰서 Docker Desktop을 설치하면 된다.
https://www.docker.com/products/docker-desktop/

 

Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

설치 후에 접속하면 다음과 같이 나타난다.
첫 접속시에는 매우 친절한 튜토리얼도 제공하는데 한번 해보는 것을 추천한다.

 

Dockerfile

개념

  • 나만의 이미지를 만들기 위한 설계도
  • 같은 이미지라도 컨테이너별로 변화를 줄 수 있다.

작성법

  • RUN : 이미지를 생성하는 과정에서 실행되는 것
  • CMD : 이미지로부터 컨테이너가 만들어져 가동될 때 기본적으로 실행되는 명령어
  • COPY : RUN처럼 이미지를 생성하는 과정에서 해당 이미지 안에 특정 파일을 미리 넣어두는 것
  • volume : CMD처럼 컨테이너가 생성되어 실행될 때 그 내부의(ex: $(pwd)) 폴더를 외부의 것과 연결하는 것예시
  • 예시1)
  • 예시2)
  • 예시3)

Docker 사용해보기

  • docker image
    • 현재 도커 데몬에서 사용가능한 이미지 리스트를 보여준다
    • -a : 해당 옵션을 사용하면 도커 빌드 중에 생성되어 이름과 태그가 지정되지 않은 중간이미지들도 확인 가능하다.
  • docker ps
    • 현재 돌아가는 컨테이너만 표시
    • -a : 해당 옵션을 사용하면 현재 작업중인 아닌 컨테이너도 보임)
    • 보여지는 컨테이너들이 현재 커맨드를 하는 위치에 있다는 뜻이 아니다.
    • 어디에서든지 도커에 의해 다른 곳에서 관리되는 컨테이너들을 확인 가능하다.
  • 이미지 생성 명령어
    • 형식 : docker build -t {이미지명} {Dockerfile로의 상대경로}
    • 상대경로는 파일명이 Dockerfile이면 따로 명시해줄 필요 없다. 그냥 .으로 표시 가능하다.
    • 예시 : docker build -t frontend-img .
  • 컨테이너 시작 & 들어가기 : docker run에 아래 옵션들을 줘서 사용
    • --name {생성할 컨테이너명}
    • -v
      • 형식 : -v {연결할 외부 디렉토리}:{컨테이너 내 디렉토리}
      • 위의 예시는 현재 위치한 폴더(pwd) 안의 내용들이 컨테이너의 home/node/app 폴더에 들어간다는 것
    • -d
      • daemon
      • 백그라운드에서 컨테이너 돌아가게 설정. docker run 해도 터미널 사용 가능
    • -p : 포트 설정
      • 형식 : -p {host port no.}:{container port no.}
      • 같은 이미지의 다른 컨테이너를 실행할 때는 docker run --name {컨테이너명} -v "$(pwd):/home/node/app -p 8080:8081 {이미지명} 이런 식으로 바꿔줘야 한다. (아래 사진 출처는 얄팍한 코딩사전 유튜브)
        출처: 얄팍한 코딩사전 유튜브
    • -it
      • 컨테이너로 들어갔을 때 bash로 CLI 입출력 사용 가능
    • 💻 예시 커맨드 :
      docker run --name {컨테이너명} -v "$(pwd):/home/node/app -d -p 8080:8080 {이미지명}
  • 컨테이너 중지
    • docker stop $(docker ps -aq) : 모든 컨테이너 중지
  • 삭제 커맨드
    • docker rm {컨테이너 id 또는 이름} : 특정 컨테이너 삭제
    • docker rm $(docker ps -aq) : 모든 컨테이너 삭제
    • docker prune -a : 사용되지 않는 모든 도커 요소(컨테이너, 이미지, 네트워크, 볼륨) 삭제
# 세트처럼 쓰면 편하다
docker stop $(docker ps -aq)
docker system prune -a
  • 도커 로그 확인
    • docker logs -f {컨테이너명}

docker-compose

위의 명령어 예시처럼 프론드엔드, 백엔드, 데이터베이스 각각에서 이미지를 빌드하고 컨테이너를 run하는 방법도 있다. 하지만 이렇게 되면 프론트엔드와 백엔드 연결이 안 될 뿐더러 매우 번거롭다.

그래서 한번에 해결하는 docker-compose가 존재한다.

예시를 보면서 하나씩 알아보자. (들여쓰기 주의)

version: '3'
services:
  database:
    # Dockerfile이 있는 위치
    build: ./database
    # 내부에서 개방할 포트 : 외부에서 접근할 포트
    ports:
      - "3306:3306"
  backend:
    build: ./backend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./backend:/usr/src/app
    ports:
      - "5000:5000"
    # 환경변수 설정
    environment: 
      - DBHOST=database  #db에 접속할 때 이 호스트명을 사용해서 db 컨테이너의 mysql에 접속
  frontend:
    build: ./frontend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./frontend:/home/node/app
    ports:
      - "8080:8080"

docker-compose up

docker-compose 파일이 있는 위치에서 해당 커맨드를 실행한다.
-d 옵션도 줄 수 있다.
나머지는 도커가 알아서 한다~!

참고 자료

https://www.yalco.kr/36_docker/
https://www.youtube.com/watch?v=hWPv9LMlme8
https://www.youtube.com/watch?v=tPjpcsgxgWc

해당 포스팅은 이화 DnA 활동의 일환으로 작성된 블로그 포스팅입니다. 필자의 개인 블로그에서도 해당 포스팅을 확인하실 수 있습니다. 블로그 링크

 

Docker에 대해 알아보자

이미지? 컨테이너? 차근차근 알아보기

velog.io