도커 02

·2023년 11월 1일
0

웹개발 종합

목록 보기
20/23

가상 머신 vs 가상 컨테이너

가상 컨테이너는 가상 머신과 비슷한 개념처럼 보이지만, 다른 환경을 갖고 있다. 우선 가상 머신은 Host OS 위에 앱이 각각 다른 os 를 가져 비교적 무겁게 작동하지만, 가상 컨테이너는 같은 os 위에 도커 엔진을 두어 비교적 가벼운 환경에서 개별적으로 작동할 수 있다는 장점을 갖는다.

도커는 도커의 전반적인 실행 파일, 설정들이 들어있는 도커 이미지를 기반으로 실행되며 우리는 이렇게 실행된 도커를 이용해 쉽고 빠르게 독립적인 환경 - 가상 컨테이너 - 를 생성하고 관리할 수 있다.

도커 시작하기

우선 우분투 화면에서 도커 패키지를 서치해준다

sudo apt install docker.io -y
# 만약 아래와 같은 에러가 발생한다면
# E: Package 'docker.io' has no installation candidate
# sudo apt update 명령어 실행 후 docker 패키지를 다시 설치해주세요
  • 설치가 된 것을 확인하려면 sudo docker --vesion 을 쳐보면 된다.

도커를 설치한 후에는 도커를 사용한 컨테이너를 설치해줄 것이다.

sudo docker run -d -p 80:80 httpd:latest
# run : 이미지를 사용해 컨테이너를 실행시킵니다.
# -d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.
# 80:80 : 80번 포트로 접속했을 때 컨테이너에 접근할 수 있도록 포트포워딩 설정을 해줍니다.
# httpd:latest : httpd의 가장 최신 이미지를 사용해 컨테이너를 생성합니다.


httpd 이미지를 찾을 수 없으므로 자동으로 해당 이미지가 자동으로 설치된다.

  • 도커는 기본적으로 관리자 권한으로 실행되기 때문에 대부분의 명령어에 sudo 를 붙여줘야 한다.
  • 실행 중인 컨테이너를 확인하려면 sudo docker ps, sudo docker ps -a 를 입력하면 된다.

    container id 와 names 는 임의로 부여받는다.

다운받은 도커의 이미지를 확인하려면 sudo docker images 를 입력하면 된다.

이제 도커의 이미지로 들어가보자

sudo docker exec -it $container_id /bin/bash
# $containser_id : sudo docker ps를 쳤을 때 확인되는 container_id를 입력합니다.
# /bin/bash : 컨테이너에 접속할 때 사용되는 쉘을 입력합니다.
# 이미지에 따라 /bin/bash라는 쉘이 존재하지 않을 수 있는데, 이 경우에는 /bin/sh를 사용해 접속합니다.

docker-compose

docker-compose 는 컨테이너 관리를 더욱 편하게 해주는 도구이다 .yml(.yaml) 파일에 컨테이너에서 사용하게 될 이미지나 옵션 등을 작성한 뒤 이 파일을 이용해 컨테이너 관리를 보다 쉽게 할 수 있다. 설치 명령은 아래와 같다.

sudo mkdir -p /usr/lib/docker/cli-plugins
# /usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성합니다.
# -p : 만약 상위 디렉토리가 없다면 함께 생성합니다.

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/ 경로에 다운로드 받습니다.
# v2.11.2는 docker-compose의 버전이며, 최신 버전은 여기서 확인 가능합니다.
# ls -l /usr/lib/docker/cli-plugins 을 통해 docker-compose 가 제대로 설치되어 있는지 확인

sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
# 다운받은 docker-compose 파일에 실행 권한을 부여해 줍니다.

sudo docker compose version
# docker-compose가 정상적으로 설치되었는지 확인합니다.
# Docker Compose version v2.11.2 정상적으로 설치 된 경우 버전이 출력됩니다.
  • /usr/lib/ 경로는 기본적으로 사용자가 직접 접근할 수 없는 경로기 때문에 sudo 를 붙여줘야만 한다.
  • docker-compose 는 디렉토리가 아니라 플러그인이다.
  • 기본적으로 리눅스는 다운받은 파일에 대한 실행권한이 없기 때문에 chmod 를 통해 실행권한을 부여해주어야 한다.

docker-compose 실행 시 주의할 점

💡 docker-compose는 실행할 때 사용자가 작성한 docker-compose.yml 파일의 내용에 맞게 컨테이너를 설정하고 실행하게 된다.

때문에 docker-compose.yml 파일이 존재하지 않는 경로에서 docker compose 명령어를 실행시킬 경우 파일을 찾을 수 없다는 에러가 뜰 수 있으므로, 내가 위치해 있는 경로에 .yml 파일이 있는지 항상 확인한 뒤 실행해야 한다.

docker container

docker composer 로 컨테이너를 실행하기 위해 이전에 실행되어 있던 컨테이너를 삭제해줄 것이다.

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 # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제합니다.
  • -a 옵션을 주지 않으면 실행 중이지 않은 컨테이너는 표시되지 않는다.
  • 기본적으로 실행 중인 컨테이너는 삭제할 수 없기 때문에 -f 옵션으로 강제 삭제한다.

명령어를 실행한 뒤 첫번째 명령어를 다시 입력해보면 아무런 컨테이너도 나오지 않는 것을 확인할 수 있다.

이외에도 다운받은 파일이나 디렉토리가 있다면 ls -l 의 결과가 0이 될 때까지 삭제해주자
그 다음 vi docker-compose.yml 을 통해 현재 디렉토리에서 docker-compose.yml 파일을 편집해준다. 내용은 아래와 같다.

version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

services:
  example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
    container_name: example # 컨테이너 이름을 지정합니다.
    image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
    restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
  • 이때 철자가 틀리면 제대로 작동하지 않을 수 있으니 꼭 철자를 확인하며 적어준다.

컨테이너 실행을 위해서는 run 대신 docker compose up 을 적어준다. 이때 해당 위치에 docker-compose.yml 이 있는지 확인한 뒤에 실행해주자.

# docker compose 명령어는 docker-compose.yml 파일이 존재하는 자리에서 실행해야 합니다.

sudo docker compose up -d
# up : docker-compose.yml 파일을 읽어 정의된 서비스들을 실행시킵니다.
# -d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.


이번에 sudo docker ps 를 쳐보면 컨테이너의 이름이 임의로 지정된 결과가 아닌 내가 지정한 이름으로 되어있는 것을 확인할 수 있다.

컨테이너 중지시키기

컨테이너는 stop 과 down 두 가지 명령어로 중지시킬 수 있는데 이 둘의 동작은 조금 다르다. stop 은 컨테이너를 중지시키되 삭제하지 않는다. 따라서 sudo docker compose stop 명령어를 사용한다면 sudo docker ps -a 즉 -a 옵션을 통해 해당 컨테이너를 볼 수 있고, docker compose start 을 통해 동일한 컨테이너(같은 컨테이너 아이디)를 재실행시킬 수 있다.

하지만 sudo docker compose down 은 해당 컨테이너를 삭제하기 때문에 -a 옵션을 붙여도 해당 컨테이너를 볼 수 없을 뿐더러 다시 컨테이너를 실행하기 위해서는 sudo docker compose up -d 를 쳐줘야 한다. 물론 다시 생성된 컨테이너는 다른 컨테이너 아이디를 갖는다.

포트 포워딩

내 서버에 접속하기 위해서는 일종의 창구 역할을 하는 포트를 지나가야 하는데, 이때 외부 포트를 내 포트와 연결시켜주는 작업을 포트 포워딩이라고 한다. 예를 들어 특정 컨테이너에서 포트 포워딩을 80:8000 으로 해주었다면, 외부에서 80번 포트로 접속할 시 8000번 포트로 연결시켜준다는 것을 의미한다.

※ 웹 브라우저에서 naver.com과 같은 사이트에 접근할 때 https://www.naver.com 과 같은 주소로 접근하게 되는데, http 프로토콜은 기본적으로 80 포트를 사용하고 https 프로토콜은 443 포트를 사용하게 되며 이는 웹 브라우저에 주소를 입력할 때 생략된다.

컨테이너 로그

장고로 웹을 만들어 도커로 배포할 때, 배포가 잘 되고 있는지 로그를 통해 확인할 수 있다.

sudo docker compose logs


여기에 -f 옵션을 추가하면 실시간으로 컨테이너의 동작을 파악할 수 있다.

볼륨

도커는 기본적으로 컨테이너를 닫으면 그 안의 데이터를 모두 초기화시킨다. 해서 우리가 컨테이너 안에서 해당 컨테이너의 설정을 바꾸거나 html 을 바꿔줘도 컨테이너를 닫은 뒤 다시 up 시키면 해당 데이터가 없어져있는 것을 볼 수 있다.

해서 도커 컨테이너 안의 데이터를 백업하기 위해서는 볼륨을 이용해야 한다. 볼륨은 컨테이너 내의 데이터를 호스트와 공유하여 변경 내용을 저장할 수 있게끔 - 종료된 후에도 유지할 수 있게끔 - 도와준다.

docker volume의 종류는 docker volume, bind mount, tmpfs mount방식이 있으며 docker volume 방식이 주로 사용된다. docker volume 은 도커에서 가장 권장하는 방법이기도 하다.

docker volume

  • docker 엔진이 관리하는 volume을 생성하는 방식이다.
  • docker volume 방식을 사용해 생성된 volume은 host의 /var/lib/docker/volumes/ 경로에 저장된다.

bind mount

  • docker container를 생성할 때 사용자가 지정한 경로에 데이터가 저장된다.
  • docker 엔진의 관리를 받지 않는 영역이기 때문에 사용자가 직접 파일을 추가/수정/삭제 할 수 있다는 특징이 있는데, docker 공식 문서에서는 이러한 특징으로 인해 운영에 영향을 미칠 수 있기 때문에 유사한 기능인 docker volume 방식을 사용하는 것을 권장하고 있다. 실수로 설정 부분을 건드리거나 잘못된 파일에 접근할 수 있기 때문이다.

tmpfs mount

  • 기존의 방식들이 ssd 혹은 hdd(하드디스크)와 같은 저장장치에 데이터를 저장한다면, tmpfs mount 방식은 휘발성 메모리인 RAM(주기억장치)에 데이터를 저장한다.
  • 휘발성이기 때문에 파일로 저장하면 안 되는 민감한 정보를 다룰 때 사용된다.

docker volume 은 컨테이너간 파일이나 설정 등 중요한 파일을 사용자가 건드리지 못하게 할 때 사용된다. bind mount 는 해당 파일들을 사용자들이 공유할 수 있도록 할 때 사용된다. tmpfs mount 는 많은 양의 데이터를 '임시로' 저장할 때, 혹은 민감한 정보 - 주로 보안 관련 - 들을 다룰 때 사용된다.

  • 이때 volume 을 생성했다면 컨테이너를 중지시킨 뒤 다시 실행시켜야 생성된 볼륨을 확인할 수 있다.

사용하지 않는 볼륨은 아래의 명령어를 통해 일괄 삭제할 수 있다.

sudo docker volume prune
profile
공부 중

1개의 댓글

comment-user-thumbnail
2023년 11월 2일

주의해야할 점 등 상세히 기록해두니 좋네요!

답글 달기