소소한개발팁
article thumbnail
Published 2023. 10. 24. 20:15
Docker 기본 사용법 정리 DevOps/Docker
반응형

Docker 소개 및 기본 개념

Docker는 컨테이너화된 환경에서 애플리케이션을 실행할 수 있게 해주는 플랫폼으로, 다음과 같은 주요 개념을 이해해야 합니다:

컨테이너 (Container): 컨테이너는 격리된 실행 환경을 제공하는 경량 가상화 단위입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 종속성을 포함하며, 호스트 운영 체제와 독립적으로 실행됩니다.

이미지 (Image): 이미지는 컨테이너의 템플릿입니다. 이미지는 파일 시스템과 애플리케이션을 포함하고 있으며 컨테이너를 생성하기 위한 기본 설정 및 명령을 정의합니다.

레지스트리 (Registry): 레지스트리는 Docker 이미지를 저장하고 공유하기 위한 서버 또는 서비스입니다. Docker Hub는 가장 널리 사용되는 공개 이미지 레지스트리 중 하나입니다.

 

Docker 설치

Docker를 사용하려면 먼저 해당 운영 체제에 Docker를 설치해야 합니다. 아래는 각 운영 체제에 Docker를 설치하는 방법입니다:

 

 

  • Windows: Windows 10 이상의 64비트 버전이 필요합니다. Docker Desktop을 설치하면 Docker Engine, Docker Compose, Docker CLI 및 Docker Machine이 함께 설치됩니다. Docker Desktop은 공식 웹 사이트에서 다운로드 가능합니다.

 

  • macOS: Docker Desktop은 macOS에서도 지원됩니다. Docker Desktop을 공식 웹 사이트에서 다운로드하고 설치하세요.

 

  • Linux: Linux 운영 체제의 경우, 운영 체제에 따라 패키지 관리자를 통해 Docker를 설치할 수 있습니다. 예를 들어, Ubuntu에서는 다음 명령을 사용하여 Docker를 설치할 수 있습니다:
sudo apt-get update
sudo apt-get install docker.io

Docker를 설치한 후, docker --version 명령을 사용하여 설치된 버전을 확인할 수 있습니다.

 

Docker 컨테이너 실행

Docker 컨테이너를 실행하는 것은 Docker의 가장 기본적인 사용 사례 중 하나입니다. 아래의 명령어와 옵션을 사용하여 컨테이너를 실행할 수 있습니다:

docker run: 컨테이너를 실행하는 명령어입니다.
-d 또는 --detach: 컨테이너를 백그라운드에서 실행합니다.
-it 또는 --interactive 및 --tty: 컨테이너와 상호작용하도록 터미널을 연결합니다.
-p 또는 --publish: 호스트와 컨테이너 간 포트 매핑을 설정합니다.
--name: 컨테이너에 이름을 부여합니다.
-e 또는 --env: 환경 변수를 설정합니다.


예를 들어, Nginx 웹 서버 컨테이너를 실행해 보겠습니다:

docker run -d -p 80:80 --name my-nginx nginx

 

이 명령은 Nginx 컨테이너를 백그라운드에서 실행하고 호스트의 80번 포트와 컨테이너의 80번 포트를 연결합니다. 컨테이너에 "my-nginx"라는 이름을 부여했습니다.

 

Dockerfile 생성 하여 이미지 만들기

1. Dockerfile 생성
프로젝트 폴더 내에 Dockerfile이라는 이름의 파일을 생성합니다.

2. 베이스 이미지 선택
Dockerfile은 기존의 베이스 이미지로부터 시작합니다. 어떤 베이스 이미지를 사용할지 선택하고, 그 이미지의 태그를 지정합니다. 예를 들어, Ubuntu 기반 이미지를 사용하려면 다음과 같이 작성합니다:

FROM ubuntu:20.04

 

3. 작업 디렉토리 설정
작업 디렉토리를 설정하여 Docker 컨테이너 내에서 작업할 디렉토리를 지정합니다. WORKDIR 명령을 사용하여 디렉토리를 변경합니다:

WORKDIR /app

 

4. 필요한 파일 복사

로컬 파일을 컨테이너로 복사하려면 COPY 명령을 사용합니다. 예를 들어, 현재 디렉토리의 app.jar 파일을 /app 디렉토리로 복사하려면 다음과 같이 작성합니다:

COPY app.jar /app/app.jar

 

5. 필요한 명령 실행
Dockerfile에서 컨테이너 내에서 실행해야 하는 명령을 지정할 수 있습니다. 예를 들어, Java JAR 파일을 실행하려면 CMD 명령을 사용합니다:

CMD ["java", "-jar", "app.jar"]

 

6. 이미지 빌드

Dockerfile을 작성한 후, 해당 Dockerfile을 사용하여 Docker 이미지를 빌드합니다. 이를 위해 다음과 같이 docker build 명령을 사용합니다:

docker build -t my-app-image:latest .

 

이외의 별도 명령어들 참조 사이트

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

 

Docker 이미지 관리

Docker 이미지는 컨테이너를 만들기 위한 템플릿입니다. 이미지를 관리하는 것은 Docker의 중요한 부분입니다. 이미지를 빌드하거나 다운로드하고 이미지 버전 관리를 수행할 수 있습니다.

이미지 다운로드: Docker Hub 또는 다른 레지스트리에서 공개 이미지를 검색하고 다운로드할 수 있습니다.

예를 들어, Ubuntu 이미지를 다운로드하려면 다음 명령을 사용합니다:

docker pull ubuntu

 

이미지 빌드: Docker 이미지를 직접 빌드할 수도 있습니다. 이때 Dockerfile을 사용하여 이미지를 정의하고 docker build 명령을 사용합니다.

docker build [명령어]


이미지 목록 보기: 시스템에 설치된 모든 이미지를 확인하려면 다음 명령을 사용합니다.

docker images

 

이미지 삭제: 더 이상 필요하지 않는 이미지를 삭제하려면 다음 명령을 사용합니다:

docker rmi image_name

 

반응형

 

 컨테이너 간 통신

여러 Docker 컨테이너가 필요한 경우, 이러한 컨테이너 간에 효율적인 통신을 설정해야 합니다. Docker는 여러 가지 방법으로 컨테이너 간 통신을 지원합니다:

Docker 네트워크: Docker는 기본적으로 컨테이너 간에 가상 네트워크를 생성하여 통신합니다. 이러한 네트워크를 사용하여 컨테이너 간 통신을 간단하게 설정할 수 있습니다.

#먼저, 두 개의 Nginx 컨테이너를 실행합니다. 
#하나는 "web1"이라는 이름으로, 다른 하나는 "web2"라는 이름으로 설정합니다.
#이러한 컨테이너는 기본적으로 동일한 Docker 네트워크에 속하게 됩니다.

docker run -d --name web1 nginx
docker run -d --name web2 nginx

#이제 컨테이너 간 통신을 테스트하기 위해 
#하나의 컨테이너에서 다른 컨테이너로 HTTP 요청을 보내보겠습니다.
#curl 명령을 사용하여 다른 컨테이너에 요청을 보낼 수 있습니다. 
#먼저, "web1" 컨테이너에서 "web2" 컨테이너로 요청을 보냅니다.

docker exec -it web1 curl web2

# 이 명령은 "web1" 컨테이너에서 "web2" 컨테이너로의 HTTP 요청을 보내고,
# "web2"에서 응답을 받게 됩니다.
# 또는, "web2" 컨테이너에서 "web1" 컨테이너로 요청을 보낼 수도 있습니다.

docker exec -it web2 curl web1


링크 (Link): 컨테이너를 실행할 때 --link 옵션을 사용하여 다른 컨테이너에 대한 링크를 설정할 수 있습니다. 이를 통해 컨테이너 간 통신이 쉽게 설정됩니다.

# MySQL 컨테이너 실행
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

# 웹 애플리케이션 컨테이너 실행 및 MySQL 컨테이너에 링크 설정
docker run --name web-app --link mysql-db:mysql -d your-web-app-image


#"web-app" 컨테이너가 "mysql-db" 컨테이너에 대한 링크를 설정했습니다.
#이제 "web-app" 컨테이너에서 MySQL 데이터베이스에 연결할 수 있습니다.
#"web-app" 컨테이너 내에서 MySQL에 접속하려면 다음과 같이 명령을 실행할 수 있습니다:

docker exec -it web-app mysql -h mysql-db -u root -p

 

Docker Compose: Docker Compose를 사용하면 여러 컨테이너를 정의하고 이들 간의 네트워크 및 통신을 관리할 수 있습니다. 이를 통해 멀티 컨테이너 어플리케이션을 쉽게 구성할 수 있습니다.

version: '3'
services:
  # H2 데이터베이스 컨테이너 정의
  h2:
    image: oscarfonts/h2
    container_name: h2-container
    restart: always
    environment:
      H2_OPTIONS: -ifNotExists
    ports:
      - "1521:1521"  # 호스트의 1521 포트를 컨테이너의 1521 포트로 매핑
      - "8081:81"    # 호스트의 8081 포트를 컨테이너의 81 포트로 매핑
    volumes:
      - ./h2/:/opt/h2-data  # 호스트 디렉터리와 컨테이너 디렉터리를 연결하여 데이터를 유지

  # Spring Boot 애플리케이션 컨테이너 정의
  myapp:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: myapp-container
    ports:
      - "8080:8080"  # 호스트의 8080 포트를 컨테이너의 8080 포트로 매핑
    environment:
      SPRING_DATASOURCE_URL: jdbc:h2:tcp://h2:1521/demo  # H2 데이터베이스에 대한 연결 정보 설정
      SPRING_DATASOURCE_USERNAME: sa
      SPRING_DATASOURCE_PASSWORD: 12
    depends_on:
      - h2  # myapp 컨테이너가 h2 컨테이너를 의존하도록 설정

 

볼륨 및 데이터 관리

Docker 컨테이너는 기본적으로 ephemeral하며 컨테이너가 종료되면 모든 데이터가 손실됩니다. 그러나 데이터를 영구적으로 저장하고 공유해야 할 때, Docker 볼륨을 사용할 수 있습니다. Docker 볼륨은 컨테이너의 데이터를 호스트 파일 시스템 또는 다른 컨테이너와 공유하기 위한 방법입니다.

볼륨 생성 및 연결: docker volume create 명령을 사용하여 볼륨을 생성하고, 컨테이너를 실행할 때 -v 또는 --volume 옵션을 사용하여 볼륨을 연결합니다.

version: '3'
services:
  myapp:
    image: myapp-image
    container_name: myapp-container
    volumes:
      - myapp-data:/app/data  # 데이터 볼륨 연결
    ports:
      - "8080:8080"

volumes:
  myapp-data:  # 데이터 볼륨 생성

myapp 서비스는 myapp-data라는 데이터 볼륨을 생성하고, /app/data 경로에 연결합니다.
이것으로 컨테이너 내 데이터가 데이터 볼륨에 저장되며, 데이터는 컨테이너가 삭제되더라도 보존됩니다.

 


데이터 백업 및 복원: Docker 볼륨을 백업하고 복원하는 방법을 설명합니다. 이를 통해 데이터 손실을 방지할 수 있습니다.

tar 명령을 사용하여 데이터를 백업하고 복원합니다. 백업 및 복원 스크립트를 실행하여 데이터를 백업합니다

chmod +x backup.sh
./backup.sh

chmod +x restore.sh
./restore.sh

 

백업 스크립트 (backup.sh)

#!/bin/sh
docker run --rm --volumes-from myapp-container -v $(pwd):/backup busybox tar cvf /backup/myapp-data-backup.tar /app/data

 

복원 스크립트 (restore.sh):

#!/bin/sh
docker run --rm --volumes-from myapp-container -v $(pwd):/backup busybox tar xvf /backup/myapp-data-backup.tar -C /app/data

 

 

Docker Compose 사용 방법

1. Docker Compose 파일 생성
먼저 Docker Compose 파일을 생성하십시오. Docker Compose 파일은 멀티 컨테이너 어플리케이션의 서비스 및 구성을 정의합니다.

version: '3'
services:
  webapp:
    image: your-webapp-image
    ports:
      - "8080:8080"
  database:
    image: your-database-image
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword

 

위의 예제에서 webapp 및 database 서비스가 정의되었습니다. image로 컨테이너 이미지를 지정하고, ports로 포트 매핑을 설정하며, environment로 환경 변수를 전달할 수 있습니다.

2. 컨테이너 실행
Docker Compose를 사용하여 컨테이너를 실행합니다. Docker Compose 파일이 있는 디렉토리로 이동한 후 다음 명령을 실행합니다.

docker compose up

이 명령은 Compose 파일을 기반으로 모든 서비스를 시작합니다. docker-compose up -d와 같이 -d 옵션을 추가하면 백그라운드에서 실행할 수 있습니다.

3. 어플리케이션 관리
이제 멀티 컨테이너 어플리케이션이 실행 중입니다. 웹 애플리케이션과 데이터베이스는 Docker Compose의 도움으로 함께 실행됩니다. 필요한 경우 docker-compose down을 사용하여 컨테이너를 중지하고 모든 리소스를 정리할 수 있습니다.

4. 컨테이너 간 통신
멀티 컨테이너 어플리케이션 내에서 컨테이너 간 통신을 설정합니다. 이를 위해 Docker Compose 내의 서비스 이름을 사용하여 서비스 간 통신을 구성할 수 있습니다.

예를 들어, webapp 서비스에서 database 서비스로 연결할 때, 데이터베이스 호스트를 database로 설정할 수 있습니다.

5. 환경 변수 및 볼륨 설정
Docker Compose를 사용하면 각 서비스의 환경 변수와 볼륨을 쉽게 설정할 수 있습니다. 필요한 데이터를 컨테이너에 전달하거나 데이터를 유지 관리할 때 이러한 설정을 사용합니다.

 

반응형

'DevOps > Docker' 카테고리의 다른 글

Ubuntu 에서 Docker 설치하기  (1) 2024.02.10
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!