Docker
Docker 기본 개념
Docker는 애플리케이션을 개발, 배포, 실행하기 위한 오픈소스 플랫폼이다. Docker를 사용하면 애플리케이션과 그 의존성을 하나의 패키지로 만들어 어디서든 일관되게 실행할 수 있다. 컨테이너는 가볍고 격리된 환경에서 애플리케이션을 실행하는 방식이다.
비유적 예시
개념:
- Docker = 도시락을 만드는 기계
- 컨테이너 = 도시락(애플리케이션 + 필요한 모든 것 포함)
- 이미지(Image) = 도시락 레시피
- 호스트 OS = 회사 주방 (컨테이너들을 데워서 먹는 곳)
위 예시 개념으로 설명을 하자면,
만약에 회사에서 100명이 점심을 먹어야 한다면 어떤 사람은 김밥, 어떤 사람은 파스타, 카레, 돈까스… 등 여러 음식들을 선택해서 먹는다
각 요리는 다른 재료와 조리법이 필요로 한 법이다.
이때 문제는 주방에서 요리를 일일이 하려면 시간이 오래걸리고 서로 다른 환경에 대한 문제가 발생한다.
이러한 문제를 해결할려면 각 도시락을 미리 만들어 놓고, 전자레인지에(서버)에 데우기만 하면 해결이 된다.
도시락(컨테이너)는 음식 뿐 만 아니라 젓가락, 숟가락, 소스 , 반찬 … 등 여러가지가 들어가있다.
이렇게 구성하면 어디서든지, 어떤 환경이든, 누가 사용하면 똑같은 맛과 환경을 구성이 보장이 된다.
Docker는 마치 도시락처럼, 애플리케이션과 그에 필요한 모든 것을 하나로 포장해서 어디서든 쉽게 실행할 수 있게 해줌. 주방마다 재료가 달라 요리가 망칠 걱정 없이, 언제 어디서나 같은 도시락을 꺼내 먹는 느낌이다.
실제 Docker 사용 ( Mysql )
- 도커에 Mysql 공식 이미지를 가져온다. (생략 가능)
1
docker pull mysql:8.0
- 컨테이너 실행
1
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-password -p 3306:3306 -d mysql:8.0
이 명령어의 의미는:
-name mysql-container: 컨테이너 이름을 ‘mysql-container’로 지정한다e MYSQL_ROOT_PASSWORD=my-password: root 계정의 비밀번호를 설정한다p 3306:3306: 호스트의 3306 포트를 컨테이너의 3306 포트로 매핑한다d: 백그라운드 모드로 실행한다mysql:8.0: 사용할 이미지와 태그를 지정한다
Docker MySQL 컨테이너에 접속하기
MySQL 컨테이너 내부로 진입 후 접속
MySQL이 Docker 컨테이너에서 실행되고 있다면 exec 명령어로 컨테이너 내부에 진입하여 MySQL 클라이언트를 실행한다.
docker exec -it mysql-container mysql -u root -p
위 명령어는 MySQL 컨테이너 내부로 접속하고, MySQL에 연결하기 위한 명령이다.
명령어 설명:
docker exec: 실행 중인 컨테이너에서 명령을 실행한다.it: 인터랙티브 모드와 TTY(Terminal) 모드를 의미한다.mysql-container: MySQL 컨테이너의 이름. 컨테이너 이름은docker ps로 찾을 수 있다.mysql: MySQL 명령어를 호출한다.u root: MySQL 사용자 이름 (root는 기본 관리자 계정).p: 비밀번호를 프롬프트로 요청하도록 한다.
접속 후, 비밀번호 입력을 요구할 수 있다. Docker를 실행할 때 MYSQL_ROOT_PASSWORD로 설정한 비밀번호를 입력하면 된다.
자주 사용하는 Docker 명령어는 다음과 같다:
- 실행 중인 컨테이너 목록 확인:
1
docker ps
- 모든 컨테이너 목록 확인:
1
docker ps -a
- 컨테이너 중지:
1
docker stop 컨테이너_이름
- 컨테이너 시작:
1
docker start 컨테이너_이름
- 컨테이너 재시작:
1
docker restart 컨테이너_이름
6 . 컨테이너 로그 확인:
1
docker logs 컨테이너_이름
Docker Hub 나 Docker Compose 를 활용하는 방법도 있다.
필자는 위와 같은 방법으로 Docker 기반의 환경을 구성하여 직접 설치를 피하고, 한 프로젝트 안에서 DB 서버, Redis 서버, 스프링부트 서버를 묶어서 관리하고 있다. Docker를 사용하면 복잡한 설정 없이 독립적이고 재사용 가능한 환경을 쉽게 유지할 수 있다.