<docker란?>
- django, db, web server 등 다양한 어플리케이션을 컨테이너 환경에서 테스트 및 배포할 수 있는 소프트웨어 플랫폼
- 가상머신에 비해 더 빠르고 가볍게 서비스를 이용할 수 있음
- docker를 사용하는 이유
- 다양한 어플리케이션을 쉽고 빠르게 배포 가능
- 컨테이너는 각각 독립적인 환경에서 구동되기 때문에 안정적으로 운영 가능
- doker 이미지를 통해 동일한 환경을 가진 컨테이너를 쉽게 생성하고 관리할 수 있음
- docker 이미지란?
- 가상 머신에서 윈도우를 설치할 때 윈도우 ISO를 사용해 설치하는 것처럼 docker 컨테이너는 docker 이미지를 기반으로 생성됨
- 이미지는 docker 컨테이너가 생성될 때 실행되는 실행 파일, 설정 등을 가지고 있음
<docker 기초>
- docker 패키지 설치
sudo apt install docker.io -y
# 만약 아래와 같은 에러가 발생한다면
# E: Package 'docker.io' has no installation candidate
# sudo apt update 명령어 실행 후 docker 패키지를 다시 설치해야 함
- docker 설치 확인
sudo docker --version # 도커 버전이 출력되는지 확인
# Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1 - 정상
# command not found: docker 와 같은 문구가 출력될 경우 docker가 설치 되었는지 확인해야 함
- docker 컨테이너 생성하기
sudo docker run -d -p 80:80 httpd:latest
# run : 이미지를 사용해 컨테이너를 실행
# -d : 컨테이너를 데몬(백그라운드)으로 실행
# 80:80 : 80번 포트로 접속했을 때 컨테이너에 접근할 수 있도록 포트포워딩 설정 해줌
# httpd:latest : httpd의 가장 최신 이미지를 사용해 컨테이너를 생성
- 실행 중인 컨테이너 확인하기
sudo docker ps # 실행중인 컨테이너 목록 확인하기
# CONTAINER ID : 컨테이너가 가지고 있는 고유한 id
# IMAGE : 컨테이너가 생성될 때 사용된 이미지
# COMMAND : 컨테이너가 생성될 때 실행되는 명령어
# CREATED : 생성 후 경과 시간
# STATUS : 컨테이너 상태
# PORTS : 사용중인 포트
sudo docker ps -a
# -a : 중지된 컨테이너 목록까지 포함해서 모두 확인하기
- 여기서 인스턴스 퍼블릭 아이피를 주소창에 쳐서 들어가면 아래와 같이 나옴
- 다운 받은 이미지 확인하기
sudo docker images
# REPOSITORY : 이미지 저장소 이름
# TAG : 이미지 버전
# IMAGE ID : 이미지의 고유한 id
# CREATED : 이미지 생성일(마지막 업데이트 일)
# SIZE : 이미지 용량
- 컨테이너 내부로 들어가보기
sudo docker exec -it $container_id /bin/bash
# $containser_id : sudo docker ps를 쳤을 때 확인되는 container_id를 입력
# /bin/bash : 컨테이너에 접속할 때 사용되는 쉘 입력
# 이미지에 따라 /bin/bash라는 쉘이 존재하지 않을 수 있는데, 이 경우에는 /bin/sh를 사용해 접속
- 컨테이너 빠져 나오기
exit
ctrl + d
- 두 명령어는 컨테이너를 종료시키며 빠져나온다
- 종료시키지 않고 빠져나오려면 아래 명령어를 사용하면 된다
ctrl + p + q
<docker-compose란?>
- 2개 이상의 컨테이너를 더욱 간편하게 관리하기 위해 사용되는 도구
- docker-compose.yml(혹은 .yaml) 이라는 파일에 컨테이너에서 사용될 이미지, 옵션 등을 작성한 후 사용함
- docker-compose 설치하기
sudo mkdir -p /usr/lib/docker/cli-plugins
# /usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성한다
# -p : 만약 상위 디렉토리가 없다면 함께 생성
# /usr/lib 경로는 관리자 권한이 필요하기 때문에 sudo 명령어 앞에 붙임
sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose
# github에 release 된 docker-compose 파일을 /usr/lib/docker/cli-plugins/ 경로에 다운
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
# 다운받은 docker-compose 파일에 실행 권한을 부여하기
sudo docker compose version
# docker-compose가 정상적으로 설치되었는지 확인
# Docker Compose version v2.11.2 정상적으로 설치 된 경우 버전이 출력됨
- v2.18.1는 docker-compose의 버전이며, 최신 버전은 여기서 확인 가능함
- docker-compose 사용 시 주의할 점
- docker-compose.yml 파일이 존재하지 않는 경로에서 docker-compose 명령어를 실행시키면 에러 발생할 수 있음
- 반드시 파일이 존재하는 곳에서 명령어 쓸 것
<docker-compose로 컨테이너 생성하기>
- docker 컨테이너 삭제하기
sudo docker ps -a # docker에 존재하는 컨테이너 목록을 확인합니다.
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 54445308314d httpd:latest "httpd-foreground" 23 hours ago Up 23 hours 0.0.0.0:80->80/tcp, :::80->80/tcp sweet_engelbart
sudo docker rm -f $container_id # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제함
- docker-compose.yml 작성하기
vi docker-compose.yml # .yml 파일 편집기로 이동(파일 없으면 생성되면서 편집기 켜짐)
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의함
services:
example: # 서비스 이름을 지정함 서비스 이름은 컨테이너끼리 통신할 때 사용됨
container_name: example # 컨테이너 이름을 지정
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줌
- 컨테이너 실행시키기
# docker compose 명령어는 docker-compose.yml 파일이 존재하는 자리에서 실행해야 함!!
sudo docker compose up -d
# up : docker-compose.yml 파일을 읽어 정의된 서비스들을 실행시킴
# -d : 컨테이너를 데몬(백그라운드)으로 실행시킴
- 컨테이너 중지시키기
중지
sudo docker compose stop # 컨테이너 중지
sudo docker compose start # stop된 컨테이너 다시 시작
삭제
sudo docker compose down # 컨테이너 삭제
- 삭제된 컨테이너를 다시 실행 명령어로 실행시킬 수 있음
- 근데 삭제한 컨테이너를 다시 실행시키면 컨테이너ID는 바뀜
<컨테이너 포트 포워딩 설정하기>
- 포트 포워딩(port forwarding)이란?
- 포트 번호 예시
- http : 80
- https : 443
- postgresql : 5432
- django : 8000
- ssh : 22
- 외부에서 서버의 특정 포트로 접근했을 때 지정한 서비스로 전달해 주는 것
- 예를 들어 특정 컨테이너의 포트포워딩을 80:8000 으로 설정했다면 외부에서 80번 포트로 접속 시 해당 컨테이너의 8000번 포트로 접속하겠다는 의미
- 로드밸런서 같은 건가??
- docker-compose.yml
version: '3.8' # docker-compose.yml에 사용될 문법 버전 정의
services:
example: # 서비스 이름 지정. 서비스 이름은 컨테이너끼리 통신할 때 사용됨
container_name: example # 컨테이너 이름 지정
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정
ports: # 포트포워딩을 설정
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결
restart: always # 컨테이너가 종료됐을 때 다시 실행시킴
- 컨테이너 실행시키기
sudo docker compose up -d
- 컨테이너 로그 확인하기
sudo docker compose logs
sudo docker compose logs -f
# -f 옵션 설정 시 컨테이너가 동작하며 발생하는 로그를 실시간으로 확인 가능함
# ctrl + c 입력해 탈출할 때까지 해당 컨테이너의 로그를 실시간으로 출력함