JSON-OBJECT Software Engineering Blog

Professional Senior Backend Engineer. Specializing in high volume traffic and distributed processing with Kotlin and Spring Boot as core technologies.

View on GitHub
2 August 2023

Docker, Docker Compose 설치 및 사용법 정리

by Taehyeong Lee

개요

Docker 설치

# CentOS 7/8에서 Docker 설치
$ curl -fsSL https://get.docker.com/ | sh

# Amazon Linux 2023에서 Docker 설치
$ sudo dnf update
$ sudo dnf install docker -y

# Docker 서비스 시작
$ sudo systemctl start docker

# Docker 서비스 작동 상태 확인
$ sudo systemctl status docker

# Docker 서비스를 운영체제 부팅시 자동 시작하도록 설정
$ sudo systemctl enable docker

# docker 명령어를 sudo 없이 사용하기 위해 계정을 docker 그룹에 소속 (계정 재접속 필요)
$ sudo usermod -aG docker $USER
$ newgrp docker

# 설치된 Docker 버전 확인
$ docker --version
Docker version 20.10.25, build b82b9f3

# hello-world 컨테이너 실행 확인
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

Docker Compose 설치

# Docker Compose 설치
$ sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

# Docker Compose 실행 권한 부여
$ sudo chmod +x /usr/local/bin/docker-compose

# 설치된 Docker Compose 실행 확인
$ docker-compose --version
Docker Compose version v2.20.2

Docker 원격 저장소 로그인

# 기존 저장된 인증 정보를 삭제
$ rm ~/.docker/config.json

# 기존 로그인되어 있다면 로그아웃
$ docker logout

# [방법 1] DockerHub 사용자는 아래와 같이 로그인
$ docker login

# [방법 2] Amazon ECR 사용자는 아래와 같이 로그인 ({region}, {ecr-uri} 파라메터를 자신의 환경에 맞게 수정)
# Login Succeeded 가 출력되면 로그인 성공
$ docker login --username AWS -p $(aws ecr get-login-password --region {region}) {ecr-uri}/

Dockerfile 작성

$ nano Dockerfile
FROM docker.io/jhipster/jhipster-registry:v7.1.0
EXPOSE 8761
USER root
RUN apt update -y
RUN apt install software-properties-common -y
RUN add-apt-repository ppa:deadsnakes/ppa -y
RUN apt install python3.9 -y
COPY entrypoint.sh /usr/local/bin/
ENTRYPOINT ["sh", "./entrypoint.sh"]

이미지 빌드

# 이미지 빌드
$ docker build -t {image-name}:{tag-name} .

컨테이너 실행

# 이미지 이름으로 컨테이너 실행
# [1. 로컬 2. Docker Hub]의 순서로 컨테이너를 찾아 실행
$ docker run -d {image-name}:{tag-name}
{container-id}

# -p, 로컬 포트에 컨테이너 포트를 맵핑
$ docker run --rm -it -p {local-port}:{container-port} {image-name}:{tag-name}

# -v, 로컬 파일을 컨테이너 파일에 주입
$ docker run --rm -it -v {local-full-path}:{container-full-path} {image-name}:{tag-name}

# --entrypoint, 컨테이너 실행과 함께 bash 쉘 접속
$ docker run --rm -it --entrypoint bash {image-name}:{tag-name}

# --user, 컨테이너 실행과 함께 root 계정으로 bash 쉘 접속
$ docker run --rm -it --user root --entrypoint bash {image-name}:{tag-name}

실행 중인 컨테이너 콘솔 접속

# 현재 실행 중인 컨테이너 ID 목록 조회
$ docker ps

# 현재 실행 중인 특정 컨테이너에 bash 쉘 접속
$ docker exec -it {container-id} bash

# whoami
root

# pwd
/

원격 리파지터리에서 이미지 푸시

# 로컬에 존재하는 이미지에 대해 원격 리파지터리 푸시를 위한 태그 생성
$ docker tag foo/bar:latest xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/foo/bar

# 원격 리파지터리에 이미지를 푸시
$ docker push xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/foo/bar

로컬의 모든 이미지, 컨테이너 일괄 삭제

# 로컬에 생성 또는 실행 중인 모든 이미지, 컨테이너 제거
$ docker system prune -a

docker-compose.yml 작성

$ nano docker-compose.yml
version: '3'
services:
  mysql:
    image: "public.ecr.aws/ubuntu/mysql:latest"
    environment:
      - MYSQL_USER=username
      - MYSQL_PASSWORD=password
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=database
      - TZ=UTC
    ports:
      - "3306:3306"
    cap_add:
      - SYS_ADMIN
    ulimits:
      nofile: 65535
    restart: always

  redis:
    image: "public.ecr.aws/ubuntu/redis:latest"
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - TZ=UTC
    ports:
      - "6379:6379"
    restart: always

Docker Compose 기동

# Docker Compose 실행
$ docker-compose down && docker-compose build --pull && docker-compose up -d

# Docker Compose 로그 조회
$ docker-compose logs -f

참고 글

tags: Docker