오늘은 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼인 Docker에 대해서 학습하고 이미지와 컨테이너를 생성하고 추가적으로 docker-compose와 volume 옵션을 활용하는 스프린트를 진행하였다.
정의
도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스로, 도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 컨테이너로 격리화하여 관리할 수 있다.
Linux Container
Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말하며, 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있다.
image
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장되고 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남는다.
Docker-compose
Docker-compose란 복수 개의 컨테이너를 실행시키는 도커 애플리케이션이 정의를 하기 위한 툴로 단일 호스트에 여러개의 컨테이너가 생성되기 때문에 네트워크를 공유하거나 볼륨 데이터를 공유하는 것이 가능하다.
yaml 파일을 생성하여, 컨테이너 명, 사용되는 이미지, 포트번호, 환경변수, 볼륨 등 설정값을 기입하여 docker-compose up
을 실행하면 파일에 정의되어 있는 컨테이너가 실행된다.
yaml파일 예시
version: '3.8'
services:
nginx:
image: sebcontents/client
restart: 'always'
ports:
- "8080:80"
container_name: client
node:
image: sebcontents/server
restart: 'always'
ports:
- "5000:3000"
container_name: server
volumes:
- "./volumefolder:/data"
mysql:
image: mysql:latest
restart: 'always'
ports:
- "3307:3306"
container_name: database
environment:
MYSQL_ROOT_PASSWORD: root_계정_비밀번호
MYSQL_DATABASE: 초기_생성_데이터베이스
MYSQL_USER: 유저_이름
MYSQL_PASSWORD: 유저_패스워드
volume
도커는 하나의 이미지로 부터 여러 컨테이너를 만들기 위해서 Union File system을 사용하는데 유니온 파일 시스템은 원본 이미지에 변경된 내용를 추가하는 방식이므로, 다른 컨테이너에서 사용 할 수 없다. 애플리케이션에 따라서는 데이터를 다른 컨테이너와 공유 하거나 혹은 호스트에서 접근 할 수 있어야 하는 경우가 있는데, 이때 데이터 볼륨을 사용하여 호스트의 파일 시스템을 컨테이너에서 마운트 하는 방식으로 사용할 수 있다.
명령어
docker image pull 이미지_레포지토리:latest
: 이미지_레포지토리의 최신 이미지를 받아온다.
docker image ls
: 받아온 이미지 리스트를 출력한다.
docker image rm 이미지_레포지토리or이미지 id
: 해당 이미지를 삭제한다.(docker rmi와 동일)
docker container run --name 컨테이너_이름 이미지_레포지토리:latest
: 컨테이너_이름
을 이름으로 갖는 컨테이너에 이미지_레포지토리
를 담아 실행한다.
docker container ps -a
: 모든 컨테이너 리스트를 출력한다.
docker container cp ./ 컨테이너_이름:컨테이너 경로
: 현재 폴더에 있는 파일을 컨테이너 경로로 복사한다.
docker exec -it 컨테이너_이름 bash
: 컨테이너 안에서 bash shell을 실행한다.
docker-compose up
: docker-compose.yaml에 정의된 이미지를 컨테이너로 실행한다. (-d 옵션을 함께 사용하면, 컨테이너를 백그라운드로 실행할 수 있다.)
docker-compose down
: docker-compose.yaml에 정의된 이미지를 이용해 실행된 컨테이너를 종료한다.
하나의 컴퓨터에서 다양한 환경을 컨테이너로 분리할 수 있고 필요에 따라 docker-compose와 volume 옵션을 사용하여 컨테이너간 연결할 수 있다는 것이 굉장히 편리하다고 생각한다. 지난번에 배운 AWS의 EC2와 함께 활용한다면 추가적인 인스턴스를 사용할 필요없이 하나의 인스턴스에도 다양한 컨테이너들을 생성하여 필요한 환경에서 데이터베이스를 관리하거나 서버를 실행시킬 수 있을 것이다. docker hub에서 자주 사용했던 환경의 이미지가 어떤식으로 만들어져 있고 옵션은 무엇이 있는지 찾아보면서 깊게 학습할 예정이다.