docer run 커맨드를 사용하여 이미지를 내려 받으면 이미지는 도커 허브에 저장된다. 하지만 우리가 직접 만든 이미지는 이미지로부터 docker run 커맨드 컨테이너를 만들려면 이미지를 가져올 수 있는 장소가 필요하다. 직접 만든 이미지도 도커 허브에 올릴 수 있으며, 비공개로 사용하는 도커 허브 같은 장소도 만들 수 있다.

이미지를 배포하는 장소를 도커 레지스트리라고 한다. 일반에 공개되어 있든 비공개이든 상관없이 이미지가 배포되는 곳은 모두 도커 레지스트리이다. 도커 허브는 도커 제작사에서 운영하는 공식 도커 레지스트리를 말한다. 아파치나 MySQL, 우분투의 공식 이미지 모두 도커 허브에 ㅊ마여해 도커 허브에서 이미지를 배포한다. 우리가 run 커맨드를 사용할 때 내려 받는 이미지는 이렇게 제공된다.

레지스트리는 이미지를 배포하는 장소이며, 반면 레포지토리는 레지스트리를 구성하는 단위이다. 도커 허브에서는 레포지토리가 각각 ID를 갖게 돼 있다. 따라서 도커 허브는 각각의 회사나 개인이 가진 레지스트리가 여럿 모인 형태가 된다.

이미지에 태그를 부여해 복제하는 커맨드 docker tar (docker image tag)

이미지에 태그를 부여하는 명령어는 다음과 같이 작성한다.

docker tag ${원래 이미지 이름} ${레지스트리 주소}/${레포지토리 이름}:${버전}

이미지를 업로드 하는 커맨드 docker push (docker image push)

docker push 커맨드는 이미지를 업로드하는 커맨드이다. 태그는 레지스트리 주소/레포지토리 이름:버전 과 같이 길어서 알아보기 힘들지만 그 자체로 하나의 이름이다. 또 어느 레지스트리에 업로드할지도 태그로 판단한다. 다시 말해 도커 엔진은 태그에 포함된 레지스트리 주소의 도메인에 있는 레지스트리로 업로드를 시도한다. 레포지토리는 처음 업로드할 때는 존재하지 않는다. push 커맨드를 실해아며 만들어진다.

시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구가 토커 컴포즈이다. 도커 컴포즈는 시스템 구축에 필요한 설정을 YAML(YAML Ain't Markup Language) 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run)또는 일괄 종료 및 삭제(down) 할 수 있는 도구이다. 정의 파일에는 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목이 기재돼 있다. 작성 내용은 도커 명령어와 비슷하지만 도커 명령어는 아니다. 정의 파일(YAML)작성 예는 다음과 같다.

  1. MySQL 컨테이너: 컨테이너 이름, 인자, 네트워크 등
  2. 워드프레스 컨테이너: 컨테이너 이름, 인자, 네트워크 등
  3. Network: 네트워크 이름
  4. Volume: 볼륨 이름

도커 컴포즈와 Dockerfile 스크립트의 차이점

도커 컴포즈는 텍스트 파일에 기재된 정의를 따라 실행된다. 즉, 도커 컴포즈는 docker run 명령어를 여러개 모아놓은 것과 같다. 컨테이너와 주변 환경을 생성한다. 네트워크와 볼륨까지 함께 만들 수 있다. 반면, dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.

도커 컴포즈 설치

도커 컴포즈를 사용하려면 먼저 설치할 필요가 있다. 도커 컴포즈는 도커 엔진과 별개의 소프트웨어이기 때문이다. 단, 윈도우나 macOS에서 사용하는 도커 데스크톱은 도커 컴포즈가 함께 설치되기 때문에 따로 설치할 필요가 없다. 그러나 리눅스에서는 도커 컴포즈와 파이썬 3 런타임 및 필요 두고 (python3, python3-pip 패키지)를 설치해야 한다. 도커 컴포즈는 파이썬으로 작성된 프로그램이기 때문에 파이썬 런타임이 필요하다. 리눅스에서는 다음과 같이 파이썬 런타임과 도커 컴포즈를 설치한다.

sudo apt install -y python3 python3-pip

sudo pip3 install docker-compose

또한, 도커 컴포즈는 설치가 끝나면 바로 실행 가능한 상태가 된다. 즉, 설치 후 docker-compose 명령을 사용하여 실행한다.


WRITTEN BY
ppdha82

,

소프트웨어의 개입 없이 서버와 로컬 컴퓨터 간에 파일을 주고 받아야 할 때 파일 복사 기능이 필요하다. 파일 복사는 컨데이너 -> 호스트, 호스트 -> 컨테이너로 양방향 모두 가능하다. 호스트 쪽 파일은 어디에 위치한 파일이라도 복사가 가능하고 컨테이너 쪽에서도 파일을 복사할 경로를 지정할 수 있다.

  1. 컨테이너로 파일을 복사하는 커맨드 예(호스트 -> 컨테이너)
    1. docker cp ${호스트 경로} ${컨테이너 이름}:${컨테이너 경로}
  2. 호스트로 파일을 복사하는 커맨드 예(컨테이너 -> 호스트)
    1. docker cp ${ 컨테이너 경로} ${호스트 이름}:${호스트 경로}

볼륨이란, 스토리지의 한 영역을 분할한 것을 말한다. 간단히 말하면 하드디스크나 SSD를 분할한 하나의 영역이다. 마운트는 연결하다. 라는 의미 그대로 대상을 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다. 예를 들어, USB 메모리를 컴퓨터에 꽂으면 띠딩하는 소리가 난 다음 폴더가 열리는데, 이것도 USB 메모리가 컴퓨터에 마운트 됐기 때문이다.

실제로 컨테이너를 사용하려면 스토리지 영역을 마운트 해야 한다. 왜냐하면 데이터가 이 스토리지에 있기 때문이다. 컨테이너를 종료해도 바로 삭제되지는 않지만 성격상 쓰고 버려야 하기 때문에 소프트웨어 업그레이드 등의 이유로 언젠가는 삭제된다. 이런 상황에서 컨테이너 속에 데이터가 있다면 컨테이너와 함게 데이터도 소멸된다. 컨테이너는 생성 및 폐기가 매우 빈번하기 때문에 매번 데이터를 옮기는 대신 처음부터 컨테이너 일부에 둔 데이터에 접근해 사용하는 것이 일반적이다. 이를 데이터 퍼시스턴시 (data persistency)라고 한다. 이 때 데이터를 두는 장소가 마운트된 스토리지 영역이다.

소트리지 마운트의 종류

  1. 볼륨 마운트: 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스키 형태로 마운트한다. 이름만으로 관리가 가능하므로 다루기 쉽지만 볼륨에 비해 직접 조작하기 어려우므로 임시 목적의 사용이나 자주 쓰지는 않지만 지우면 안 되는 파일을 두는 목적으로 많이 사용한다.
  2. 바인드 마운트: 도커가 설치된 컴퓨터의 문서 폴더 또는 바탕화면 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다. 디렉터리가 아닌 파일 단위로도 마운트가 가능하다. 폴더(디렉터리) 속에 파일을 직접 두거나 열어볼 수 있기 때문에 자주 사용하는 파일을 두는 데 사용한다.

스토리지 영역을 마운트하는 커맨드

  • 어느 마운트 방식을 사용하든 스토리지 마운트는 run 커맨드의 옵션 형태로 지정한다. 마운트하려는 스토리지의 경로가 컨테이너 속 특정 경로와 연결되도록 설정하는 형태이며, 스토리지 영역을 만드는 방법은 다음과 같다.
  1. 볼륨 생성(볼륨 마운트): docker volume create ${볼륨 이름}
  2. 볼륨 삭제(볼륨 마운트): docker volume rm ${볼륨 이름}

컨테이너로 이미지를 만드는 방법

  • 이미 존재하는 컨테이너를 이용하면 누구나 쉽게 이미지를 만들 수 있다. 나만의 이미지를 만들어 똑같은 구성의 컨테이너를 대량으로 만들 수 있고 다른 컴퓨터 또는 서버에 이동 시킬 수도 있으며 다음과 같이 두 가지 방법이 있다.
  1. commit 커맨드로 기존 컨테이너를 이미지로 변환하는 방법: 컨테이너를 준비하고 컨테이너를 이미지로 변환한다. 컨테이너만 있으면 명령어 한 번으로 이미지를 만들 수 있어 간편하지만 컨테이너를 먼저 만들어야 한다. 기존 컨테이너를 복제하거나 이동해야 할 때 편리하다. 자주 사용하는 커맨드 예시로는 docker commit ${컨테이너 이름} ${새로운 이미지 이름} 과 같이 사용한다.
  2. Dockerfile 스크립트로 이미지를 만드는 방법: dockerfile 스크립트를 작성하고 이 스크립트를 빌드해 이미지를 만드는 방법으로 이미지를 만드는 것 밖에 할 수 없다. Dockerfile 스크립트에는 토대가 될 이미지나 실행할 명령어 등을 기재한다. 편집은 메모장 같은 텍스트 에디터를 사용한다. 자주 사용하는 커맨드 예시로는 docker build -t ${생성할 이미지 이름} ${재료 폴더 경로} 와 같이 사용한다.

컨테이너는 먼저 이미지로 변환하지 않으면 옮기거나 복사할 수 없다. 하지만 이미지 역시 이미지 상태 그대로는 옮기거나 복사할 수 없으므로 도커 레지스트리를 통하거나 save 커맨드를 사용해 tar 포맷으로 도커 엔진의 관리 영역 밖으로 내보내야 한다. 파일은 호스트 컴퓨터의 파일 시스템에 생성된다. 파일을 다시 도커 엔진에 가져오려면 load 커맨드를 사용한다.

tar 팡리 생성 예: docer save -o ${파일 이름}.tar ${이미지 이름}

컨테이너 개조 방법

  1. 파일 복사와 마운트를 이용하는 방법
  2. 컨테이너에서 리눅스 명령어를 실행하는 방법

WRITTEN BY
ppdha82

,

웹 서버 소프트웨어로 아파치 외에도 nginx가 유명하다. 웹 서버는 통신이 전제가 되므로 옵션을 통해 포트 번호를 지정해야 한다. 또한 데이터 베이스 서버는 MySQL 외에 PostgreSQL이나 MariaDB도 유명하다. 데이터베이스 관리 소프트웨어는 기본적으로 루트(root) 패스워드를 반드시 지정해야 한다.

웹 서버 및 데이터베이스 서버용 컨테이너 종류

  1. httpd: -d로 백그라운드로 실행, -p로 포트 번호 지정
  2. nginx: -d로 백그라운드로 실행, -p로 포트 번호 지정
  3. mysql: -d를 사용, 실행 시 -e MYSQL_ROOTPASSWORD와 같이 루트 패스워드를 지정
  4. postgres: -f 사용, 실행 시 -e POSTGRES_ROOT_PASSWORD와 같이 루트 패스워드를 지정
  5. mariadb: -d를 사용, 실행 시 -e MYSQL_ROOT_PASSWORD와 같이 루트 패스워드를 지정

컨테이너를 여러 번 만들다 보면 한 가지 문제가 발생한다. 컨테이너를 삭제해도 이미지는 그대로 남아 쌓이기 때문이다. 이미지가 늘어나면 스토리지 용량을 압박하게 되므로 필요 없어진 이미지는 그때 그때 삭제하도록 한다. 이미지를 삭제할 때는 이미지 ID 또는 이미지 이름으로 지정한다. 컨테이너와 거의 비슷하다. 그리고 해당 컨테이너가 남아 있으면 이미지를 삭제할 수 없으므로 docker ps -a 와 같이 컨테이너 목록을 출력해 확인하고 컨테이너를 먼저 종료 및 삭제한 다음 이미지를 삭제한다.

이미지를 삭제하기 위해서는 docker image rm 커맨드를 사용한다. docker image ~와 같은 커맨드를 사용해서 삭제해도 된다. 이 커맨드는 docker rm 과 같이 생략할 수 없다. 즉, docker rm 은 docker container rm 의 생략형이므로 이미지가 아닌 컨테이너가 삭제된다.

  1. 이미지 삭제 예: docker image rm ${이미지 이름}
  2. 여러 개의 이미지 삭제 예: docker image rm ${이미지 이름}  ${이미지 이름}  ${이미지 이름} ...

이미지를 삭제하려면 이미지 이름 또는 이미지 ID를 알아야 한다. 컨테이너 목록을 출력하는 docker ps 커맨드가 있듯 이미지 목록을 확인하는 커맨드는 docker image ls 이다. docker ps 커맨드의 정식 표기는 docker container ls 였던 것처럼 docker image ls 커맨드의 생략형도 ls 이다. 단, ps 와 달리 -a 옵션은 사용할 수 없다. 이미지는 컨테이너와 달리 실행 중, 종료 등의 상태를 가질 수 없기 때문이다. docker image ls 커맨드를 실행하면 ps 커맨드의 출력 결과와 마찬가지로 첫 번째 행에는 각 항목의 이름이 출력되며 두 번째 행부터 항목 값이 출력된다. 해당하는 이미지가 없다면 첫 번째 행만 출력된다.

워드프레스는 웹 사이트를 만들기 위한 소프트웨어로 서버에 설치하여 사용한다. 이와 유사한 소프트웨어로 Moable Type 등이 있다. 워드프레스는 워드프레스 프로그램 외에도 아파치나 데이터베이스, PHP 런타임 등을 필요로 하기 때문에 구축을 위해 자주 사용한다. 또한, 워드프레스는 MySQL 및 MariaDB를 지원한다. 워드프레스는 블로그 생성 도구와 같은 것으로, 웹 사이트 작성자가 작성한 내용을 데이터베이스에 저장하고 웹 사이트 열람자의 요청에 따라 웹 페이지를 보여준다. 즉, 프로그램 MySQL에 저장된 데이터를 읽고 쓸 수 있어야 하기 때문에 두 컨테이너가 연결돼 있어야 한다.

환경변수란, 운영체제에서 다양한 설정 값을 저장하는 장소를 가리킨다. 컨테이너의 설정 값을 이 환경변수를 통해 전달하는 경우가 많다. 어떤 환경변수를 사용할지는 컨테이너의 종류에 따라 달라진다.

워드프레스를 사용하려면 워드프레스 프로그램 외에도 아파치와 PHP 런타임, MySQL이 필요하다. 특히 아파치(Apache), PHP, MySQL에 리눅스(Linux)를 합친 조합을 LAMP라고 부른다. 소프트웨어가 발전하면서 아파치가 nginx로 바뀌기도 하고, MySQL이 MariaDB나 PostgresSQL로 바뀐 조합도 나타났지만 리눅스 + 웹 서버 + 프로그램이 언어 런타임 + 데이터베이스의 조합임은 변함이 없다.

레드마인은 티켓(누구에게 어떤 업무를 맡길지를 나타내는 ToDo)을 관리하는 소프트웨어로 소프트웨어 개발 현장에서 많이 사용된다. 레드마인 역시 워드프레스와 포트 번호 정도만 달고 거의 같은 구성을 띤다. 다만 옵션의 이름이 다르다는 점에 주의해야 한다. 레드마인은 실행 시 데이터베이스 접속에 실패하면 컨테이너가 종료된다. 만약 레드마인이 정상적으로 동작하지 않으면 docker stop, docker rm 커맨드로 레드마인 컨테이너만 삭제한 후 다시 실행한다.


WRITTEN BY
ppdha82

,