가상 컨테이너는 가상 머신과 비슷한 개념처럼 보이지만, 다른 환경을 갖고 있다. 우선 가상 머신은 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 docker ps
, sudo docker ps -a
를 입력하면 된다.다운받은 도커의 이미지를 확인하려면 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 는 컨테이너 관리를 더욱 편하게 해주는 도구이다 .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 정상적으로 설치 된 경우 버전이 출력됩니다.
chmod
를 통해 실행권한을 부여해주어야 한다.때문에 docker-compose.yml 파일이 존재하지 않는 경로에서 docker compose 명령어를 실행시킬 경우 파일을 찾을 수 없다는 에러가 뜰 수 있으므로, 내가 위치해 있는 경로에 .yml 파일이 있는지 항상 확인한 뒤 실행해야 한다.
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 # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제합니다.
명령어를 실행한 뒤 첫번째 명령어를 다시 입력해보면 아무런 컨테이너도 나오지 않는 것을 확인할 수 있다.
이외에도 다운받은 파일이나 디렉토리가 있다면 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 은 컨테이너간 파일이나 설정 등 중요한 파일을 사용자가 건드리지 못하게 할 때 사용된다. bind mount 는 해당 파일들을 사용자들이 공유할 수 있도록 할 때 사용된다. tmpfs mount 는 많은 양의 데이터를 '임시로' 저장할 때, 혹은 민감한 정보 - 주로 보안 관련 - 들을 다룰 때 사용된다.
사용하지 않는 볼륨은 아래의 명령어를 통해 일괄 삭제할 수 있다.
sudo docker volume prune
주의해야할 점 등 상세히 기록해두니 좋네요!