Docker 비공식 문서

Mec.D's Blog·2022년 4월 18일
1

📌 Getting Started

개념

Dockerfile

이미지를 만들기 위한 설계도
(backend, frontend, DB 마다 하나씩 위치)

명령어

RUN 과 CMD 명령어의 차이

RUN : 이미지 생성 과정에서 명령 수행
CMD : 컨테이너가 만들어져 실행될 때 명령 수행

포트 번호

  1. 로컬 포트 번호는 유니크합니다.
  2. Docker 컨테이너의 포트 번호는 컨테이너별로 유니크합니다.
  3. 따라서 2개의 로컬 포트 번호를 각 컨테이너에 대응시키면
    컨테이너1과 컨테이너2에 8080포트를 동시에 사용할 수 있습니다.


사용법

docker run -it code

이미지 다운 과정

  1. 로컬 컴퓨터에서 이미지를 찾습니다.
    Unable to find image 'node:latest' locally
  2. 없으면 Docker Hub에서 해당 이미지를 내려받습니다.
  3. run 명령어 : 이미지로 → 컨테이너를 만듭니다.
  4. -it 옵션 : 컨테이너를 열고 CLI를 실행시킵니다.
# 다운 받은 Docker 이미지 목록
docker images


🐳 Docker 설치

Docker 설치

# https 프로토콜 지원 패키지 설치
sudo apt install apt-transport-https ca-certificates \
curl software-properties-common

# https 암호화 통신을 위한 Docker Repository GPG 키 추가
## OK가 출력되면 설정 성공
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Docker Repository 등록
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

# 패키지 정보 업데이트
sudo apt update

# Docker 설치
sudo apt install docker-ce

# Docker 실행 확인 (:q로 빠져나오기)
sudo systemctl status docker

# Docker 버전 확인
docker -v

# 현재 사용자를 Docker 그룹에 추가
## 추가 후 sudo 없이 Docker 명령어를 쓸 수 있습니다.
sudo usermod -aG docker ${USER} # ec2 재접속 후 적용

# 현재 사용자가 속한 그룹 출력
id -nG # docker 포함 여부 확인

Docker Compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 실행 권한 추가
sudo chmod +x /usr/local/bin/docker-compose

# 버전 확인
docker-compose -v


👩‍💻 Docker 명령어

[httpd 사용법] 도커에서 아파치 웹 서버 실행하기, 에움길

Docker 계정 관련

# Docker 로그인
docker login 아이디 비밀번호

# Docker 로그아웃
docker logout

Docker 파일 관련

# Docker 컨테이너의 파일을 호스트 PC로 복사
docker cp 이미지명:컨테이너_파일 호스트PC_경로
# Docker 컨테이너 수정 후 이미지 생성
docker commit 옵션 컨테이너명 이미지명[:태그]

Docker 이미지 관련

# Docker 이미지 검색
docker search 이미지명:태그

## 검색 결과 개수 제한
docker search --limit=개수 이미지명:태그

## 최신 버전의 이미지 다운로드
docker search 이미지명:latest
# Docker 이미지 내려 받기
## 태그 생략 시 가장 최근 버전 (latest) 을 내려 받음
docker pull [옵션] 이미지명[:태그명]
# 설치된 Docker 이미지 목록
docker image ls

## 이미지 ID만 출력하는 옵션
docker image ls -q
# 이미지 삭제
docker rmi 이미지ID

# rm도 rmi와 동일
docker image rm 이미지ID
# Docker 이미지 생성 과정 확인
docker history 이미지명

Docker 컨테이너 관련

# 컨테이너 생성
docker create ubuntu
# 실행 중인 컨테이너 출력
docker ps

## 모든 컨테이너 출력
docker ps -a

## 컨테이너 아이디만 출력
docker ps -q

컨테이너의 4가지 상태 (STATUS)

  • Created : 생성됨
  • Up : 실행 중
  • Pause : 일시정지됨
  • Existed : 종료됨
# 컨테이너 삭제
docker rm 컨테이너ID
# 컨테이너 이름 변경
docker renamee 원래이름 변경할이름
# 컨테이너 실행
docker start 컨테이너이름(또는 컨테이너ID)
  • 컨테이너를 실행하면 바로 중지됩니다.
    (표준 입력 설정을 하지 않아 입력을 받을 수 없는 상태이므로)
# Docker 컨테이너 내에서 명령어 실행
docker exec -it 컨테이너명 실행할-명령어

Docker run

docker run
옵션축약형설명
--interactive-i컨테이너 표준입력 활성화
--tty-tbash를 사용할 수 있도록 가상 터미널(tty) 할당
--detach-d데몬 모드, background에서 컨테이너 실행
--publish-p호스트와 컨테이너 포트 연결 (port-forwarding)
--volume-v데이터 볼륨 설정
--user-u사용자 계정명 또는 UID 설정
--env-e컨테이너의 환경 변수 설정
--name컨테이너 이름 설정
--rm프로세스 종료 시 컨테이너 자동 삭제
--restart컨테이너 재시작 옵션 설정
--privileged컨테이너 안에서 호스트의 주요 자원 접근 허용 (커널 등)
# 컨테이너 실행 시 컨테이너 이름 변경
docker run --name -it 변경될이름 기존이름

# 컨테이너 생성 후 종료 시 컨테이너 삭제
docker run -it --rm --name 생성될이름 기존이름

# 백그라운드에서 실행
# 컨테이너 종료
docker stop 컨테이너명
# 이미지 다운 받고 실행
docker run 이미지명

# 컨테이너 옵션을 적용해 실행
docker run --name 컨테이너명 &&^
-v $(pwd):/컨테이너와-공유할-폴더-경로 &&^
-p 로컬-포트번호:컨테이너-포트번호 Docker-이미지명

Docker 빌드 관련

# Dockerfile 빌드
docker build 도커파일명 경로

## 이미지 이름 지정
docker build --tag 이미지명:태그명 저장경로

## 파일명이 Dockerfile이 아닌 경우
docker build -f 다른_도커파일명 경로

## 빌드 전 이미지 최신 버전을 다운 받은 후 빌드하는 옵션
docker build --path==true Dockerfile .

# 베이스 이미지를 강제로 새로 받아옴
docker image build --pull=true 경로

명령어 조합

# 컨테이너 중지
docker stop $(docker ps -a -q)
## sudo 사용 시
sudo docker stop $(sudo docker ps -a -q)

# 컨테이너 삭제
docker rm $(docker ps -a -q)
## sudo 사용 시
sudo docker rm $(sudo docker ps -a -q)

# 이미지 삭제
docker rmi -f $(docker images -q)
## sudo 사용 시
sudo docker rmi -f $(sudo docker images -q)


🐋 Dockerfile 사용법

Dockerfile은 어디에 쓰이나요?

  1. 커스텀된 Docker 이미지를 만들 때 사용됩니다.

  2. 서비스를 배포할 때도 활용됩니다.


Dockerfile 작성 시 주의해야할 점은?

  1. 아래와 같은 기본 작성 형식을 따라야 합니다.
# 주석
명령어 인자값
  1. 명령어를 대문자로 작성해야 합니다.

꼭 알아야할 Docker 명령어에는 어떤 것들이 있나요?
Dockerfile에서 자주 쓰이는 명령어, <DaleSeo/>

명령어설명
FROMbase 이미지 지정
WORKDIR작업 디렉토리 전환
RUN쉘(Shell) 명령어 실행
ENTRYPOINTDocker 컨테이너 시작 시 실행할 쉘 명령어 지정, 변경 불가
ex: ENTRYPOINT ["npm", "start"]
CMDDocker 컨테이너 시작 시 실행할 쉘 명령어 지정, 변경 가능
Dockerfile당 하나만
EXPOSEDocker 컨테이너 외부로부터의 접근을 허용할 Port와 Protocol 지정
ENV환경변수 설정, 런타임
ARG--build-arg로 전달할 인자 지정, 빌드 시점
COPY파일, 디렉토리를 Docker 컨테이너에 복사
ADDCOPY와 비슷, 압축 파일 등 특수한 케이스에서만 COPY 대신 사용
USER사용자를 지정 (RUN, CMD, ENTRYPOINT와 함께 사용)
USER user[:group]
LABEL이미지의 상세 정보를 기록 (title, version, maintainer, description 등)


🐙 Docker Compose

Docker Compose란?

여러 개의 Docker 컨테이너를 한 번에 관리할 때 쓰는 툴입니다.

특징

  1. yaml 포맷으로 작성합니다.

Docker Compose 파일

version: "3"

services:
	mysql:
      # container_name: mysql
      image: mysql:5.7
      restart: always
      ports: 
          - "3306:3306"
      env_file: .env
      environment:
          - MYSQL_DATABASE=데이터베이스명
          - MYSQL_ROOT_PASSWORD=루트 계정 비밀번호
          - TZ=Asia/Seoul
      command:
          - --character-set-server=utf8mb4
          - --collation-server=utf8mb4_unicode_ci
      volumes:
          - ./db/conf.d:/etc/mysql/conf.d
          - ./deb/data:/var/lib/mysql
          - ./db/initdb.d:/docker-entrypoint-initdb.d

version

  • Docker Compose의 파일 규격 버전을 지정합니다.
  • 버전에 따라 지원되는 옵션이 상이합니다.

services

  • 실행할 컨테이너들을 정의합니다.

image

  • Docker Hub에 있는 Docker Image를 사용할 때 여기에 적습니다.

restart

  • 컨테이너가 다운될 경우 재시작하도록 합니다.
  • 옵션
    • no : 수동으로 재시작
    • always : 항상 재시작 (컨테이너를 수동으로 끈 후에는 재시작 x)
    • on-failure : 오류 발생 시 재시작

volumns

  • docker run -v 명령어와 같습니다.
  • 여러 volumn을 리스트로 작성할 수 있습니다.

environment

  • 여러 환경 변수를 리스트로 전달할 수 있습니다.

ports

  • "3306:3306" 처럼 쌍따옴표로 감싸줘야 합니다. (감싸지 않으면 yaml이 시간으로 인식)

depends_on

  • 서비스를 종속된 순서대로 실행시킬 수 있습니다.

links (depecated)

  • 컨테이너를 연결해주는 기능이지만, network나 volume을 통해 연결하는 것을 권장합니다.

networks

  • 컨테이너 간에 통신을 할 수 있도록 network로 묶어줍니다.

Docker Compose 명령어

# 모든 서비스(컨테이너)를 백그라운드(-d)에서 띄우기
docker-compose up -d
  • 컨테이너명은 docker-compose.yml 파일이 위치한 폴더명 + service명 + 번호가 됩니다.
# 모든 컨테이너 삭제
docker-compose down
profile
기술로 삶을 디자인하는 개발자 Mec.D 입니다

0개의 댓글