도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스
도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리
Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것
컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유
대표적인 운영 체제(OS)는 Linux
, Windows
, MacOS
로 구분
엔지니어는 자신이 개발하는 애플리케이션이 어떤 환경에서 구동될지 생각하고 개발해야함
개발하려고 하는 여러 애플리케이션을 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경할 부분이 발생함
같은 Linux인 Ubuntu
, CentOS
, Debian
은 서로 다른 환경이므로 여러 버전이 존재
환경이 다르다면 개발자들이 조정할 문제가 수도 없이 생기며, 수작업으로 환경을 맞추는 일은 쉬운 일이 아님
=> 많은 환경에서 애플리케이션이 돌아가도록 빌드하고 테스트를 수행해야 함
모든 개발자와 사용자가 동일한 OS 환경을 유지하는 경우, 어느 정도는 빨라질 수 있지만 '내 컴퓨터' 혹은 '내 사용 목적'에만 맞는 설정이 따로 필요할 수도 있기 때문에 환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있다.
애플리케이션을 설치할 때, 컴퓨터의 환경에 맞게 변경해야 하는 부분이 있다. (방화벽 설정, 사용자 권한 설정, Port 설정 등)
컴퓨터에 다양한 설정 작업을 수작업으로 하게 된다면, 많은 시간이 걸릴 뿐만 아니라 설정 간에 간섭이 일어나 프로그램이 멈출 수도 있다.
개발과 실행에 대한 환경 설정이 코드로 정해져 있다면 해결 가능
리소스 격리성을 제공하는 기술로는 가상 머신(Virtual Machine)
, 도커
등
VirtualBox
, VMware
와 같은 가상 머신은 개발 환경이나 사용 환경을 이미지로 저장하고, Host OS 위에 게스트 OS를 올리는 방식
가상 머신과 도커는 격리성을 제공하기 때문에, 각 애플리케이션마다 다른 컴퓨터에서 실행되는 것처럼 IP나 Port 등을 다르게 설정 가능
도커 컨테이너의 독립적인 특징을 기반으로 한 Lifecycle
Docker Image 및 Container를 다루기 위한 Docker Command Line 명령어
레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성
e.g. docker/whalesay:latest
=> Docker Hub라는 레지스트리에서
docker라는 유저가 등록한 whalesay 이미지 혹은 레포지토리에서
latest 태그를 가진 이미지
Docker Hub는 Docker Image를 찾거나, Docker Image의 사용방법을 확인할 때 사용
sudo docker image pull docker/whalesay:latest
sudo docker image ls
sudo docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
sudo docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
- [OPTIONS]
--name : 컨테이너의 이름을 할당
- [COMMAND]
command는 초기 컨테이너 실행 시 수행되는 명령어
cowsay : 컨테이너 실행 시 cowsay 명령어를 호출 (node를 호출하듯 이용)
- [ARG..]
boo : COMMAND인 cowsay에 넘겨질 파라미터
sudo docker container ps -a
- {container} ps : 컨테이너의 리스트를 출력
- -a : Default 로는 실행되는 컨테이너지만 종료된 컨테이너를 포함하여 모든 컨테이너를 출력
sudo docker container rm 컨테이너_이름
{container} rm : 컨테이너를 지칭해서 삭제
컨테이너를 명시할 때는 ps 명령을 통해 확인할 수 있는 NAMES 혹은 CONTAINER ID 를 사용
sudo docker image ls
sudo docker image rm docker/whalesay
sudo docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
- {container} run : 컨테이너를 실행합니다. 이미지가 없다면 이미지를 받아온 뒤(pull) 실행
- -rm : 컨테이너를 일회성으로 실행 / 컨테이너가 중지되거나 종료될 때, 컨테이너와 관련된 리소스를 모두 제거
Docker Example 수행하기 : danielkraic/asciiquarium
sudo docker container run -it --rm danielkraic/asciiquarium:latest
danielkraic라는 사람이 올린 이미지 asciiquarium 를 실행
-it
: -i, -t 를 동시에 사용한 옵션
사용자와 컨테이너 간에 인터렉션(interaction)이 필요하다면 이 옵션을 사용
- container는 ctrl + c 로 종료
사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우
장점
도커 이미지를 연결하는 방법은 크게 CP(Copy) 를 이용하는 방법과 Docker Volume 기능을 이용하는 방법으로 나뉜다.
마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용해서, 마치 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업
httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어
sudo docker container run --name 컨테이너_이름 -p 로컬호스트 포트:컨테이너 포트 httpd
httpd 는 일정 시간 연결 기록이 없으면, 서버 가동이 중지됨
컨테이너를 백그라운드에서 실행하게 해주는 -d
옵션
docker container cp
명령은 앞 경로의 파일을 뒤 경로에 복사docker exec -it 컨테이너_이름 bash
명령어를 통해 컨테이너 내부 터미널로 접속 가능장점
sudo docker container commit
명령을 이용
Dockerfile 은 이미지 파일의 설명서
sudo docker build
명령은, Dockerfile로 도커 이미지 파일을 생성sudo docker build --tag my_pacman:2.0 .
--tag
는 name:tag 형식으로 이미지를 생성 가능
- 지정한 경로에 있는 Dockerfile을 찾아서 빌드
- "."을 명령어에 꼭 포함해야 한다!
docker-compose.yaml
에 정의된 이미지를 컨테이너로 실행sudo docker-compose up
-d
옵션을 함께 사용하면, 컨테이너를 백그라운드로 실행할 수 있다.sudo docker-compose down
docker-compose.yaml
에 정의된 이미지를 이용해 실행된 컨테이너를 종료docker-compose up {특정 이미지}
- 하나의 docker-compose에서 관리되는 컨테이너끼리는 동일한 docker network에서 구동됨
- docker run 명령과 다르게 docker-compose 파일 안에서 기본 network가 사용됨
Docker: 앱 단위 가상화
가상머신: OS 단위 가상화
응용 프로그램과 실행 환경을 조합해서 이미지 빌드
=> 응용 프로그램이 실행되고 있는 격리 환경: 컨테이너
두 개 이상의 컨테이너(클라, 서버)가 서로 통신하면서 동시에 클라 + 서버 애플리케이션을 배포 가능
=> docker-compose up -d