docker란
가상환경이다. 과거 개발 환경의 고질적인 문제인 "내 PC에선 되는데요?" 문제를 줄여보고자 나왔다.
서비스나 앱을 "컨테이너"라는 별도의 격리된 개념에 담아서 어디서나 똑같이 실행되게 해주는 기술이다.
이전에도 가상환경은 있었는데요?
Virtualbox, Vmware... 이런 애들이 과거에 있었는데 현재 점유율이 줄어든 이유는 단순하다.
느리고, 복잡해서
애네들 동작방식이
물리적인 PC(하드웨어) -> 우리가 쓰는 Windows(OS)가 기본 구성에
Hypervisor 라는 소프트웨어/펌웨어가 들어간다.
설명에 괜히 소프트웨어, 펌웨어로 나눠놨는데.
Type 1이라고 OS 말고 물리적인 하드웨어를 조작하는 펌웨어 시스템도 있고
Type 2라고 OS 위에서 동작하는 소프트웨어도 있기 때문이다.
Hypervisor 다음부터는 격리된 Vm 환경이 구동된다.
여기서 골때리는건 VM1, VM2 가상환경이 각각 있다고 하면, 격리환경마다 구동하기 위한 자체 OS가 따로 들어간다는 것이다.

즉 우리가 쓰는 윈도우 위에 윈도우 1,2,3... 이 있는거다
구조가 이러니 당연히 느리고 용량도 크다.
이것저것 셋팅하고 이미지 만들면 10GB가 넘어가는데 10년 전에 10GB 데이터를 옮긴다고 생각해보자, 무진장 느리다.
과거에는 개발팀 다 같이 통합된 VM 환경 쓰겠다고 신입 오면 하루종일 가상환경 이미지 다운로드 받고 구성하느라 시간 다 갔다.
컨테이너는 뭐가 달라요?
중요한건 가상환경인데 docker에서는 과감하게 가상 OS(Guest OS)가 사라진다
즉, 필요한 애플리케이션과 라이브러리만 격리 실행하는 가벼운 가상화 서비스가 되는 것이다.
가상 OS가 없으면 시스템이 어떻게 동작하느냐, 의문이 들 수 있는데
컨테이너는 호스트 '커널'을 공유한다.
즉 우리 물리적인 PC에 설치된 OS를 이용한다는 점이다.

저 Windows 쓰고있는데, 컨테이너가 제 OS 쓰는거면 리눅스 못써요?
윈도우에는 WSL2라는 놈이 있다.
WSL2(Windows Subsystem for Linux 2)
이름부터 명확한데 "너가 윈도우 쓰더라도 리눅스 시스템을 별도로 쓰게 해줄게"다.
Windows 운영체제에서 '진짜 리눅스 커널'을 가진 '경량 VM'을 자동으로 띄워 준다.
그럼 가상환경에서 리눅스 시스템 쓰는 애들은 거의 네티이브처럼 리눅스 커널을 이용 가능한 거다.
와! 굉장해요 어떻게 쓰는 건가요?
들어가서 대충 다운로드 받고 설치했다고 가정하자.
docker에 시작은 image다.
기술과 발전의 시작은 불편함이다.
"아 매번 개발 환경 설치하고 셋팅하기 귀찮네"
"내가 설치한 환경과 셋팅을 저장해두자!"
라고 생각한 사람들이 각자 이미지를 만들어서 배포한다.(물론 우리도 배포할 수 있다.)
자기 서비스 손쉽게 이용하라고 공식 회사가 배포하는 경우도 많다.
https://hub.docker.com/search?badges=official
mysql, ubuntu, python, 심지어 docker도 docker 이미지를 docker 안에서 구동 가능하게 배포한다.(Docker in Docker!)
내가 원하는 이미지가 있다면
docker pull 대충 원하는 이미지 및 버전 으로 다운 받아주면 된다.
다운받은 이미지는 docker images 명령으로 확인 가능하다.
이미지를 받아오면 이제 이미지로 실제 구동 되는 컨테이너를 만들 수 있는데
docker run 이미지명 명령어를 사용해서 구동해주면 된다.
다만 여기서 이미지 종류에 따라서 '포트'나 '볼륨' 정보를 요구하는데,
컨테이너는 격리된 가상 환경이다.
즉 격리된 환경에서 8080 포트를 쓰고, /usr/bin/myData 경로를 쓴다고 해서 실제 내 PC에 영향이 가는 게 아니다.
컨테이너 내환경
8080 port => 8888 port
/usr/bin/myData => C:\myData
형식으로 매핑이 필요하다는 것이다.
요구하는대로 docker run 명령어 작성시 별도로 넣어주고 나면 컨테이너가 동작을 한다.
동작하는 컨테이너는 docker ps 명령으로 확인 가능하다.
그 다음부터는 그냥 운영에 영역이다.
연결된 포트로 접근해서 관리를 하거나, 아니면 직접 리눅스 커널로 접근해서 관리를 하거나 이건 이미지 별로 다르다.
복잡하게 명령어 안써도 Docker 설치하면 docker desktop도 같이 설치 할 수 있는데
GUI 기반으로 그냥 클릭 몇번이면 이미지부터 컨테이너까지 다 관리된다.
이제 Docker좀 쓴건가?
컨테이너 개념은 마이크로서비스 아키텍처(Microservice Architecture) 즉, MSA와 밀접하다.
무슨 뜻이냐 Docker를 배우고 쓰다보면 언젠가 작고 수많은 서비스를 유기적으로 연결해서 안정적인 운영 관리가 필요한 순간이 올 것이라는 뜻이다.
여러가지 서비스(컨테이너)를 유기적으로 연결해 한 번에 실행 관리하고자 한다면
Docker Compose라는 개념을 알아야한다.
또한 Docker는 컨테이너간 연동을 위한 가상 네트워크와 데이터를 보존하기 위한 볼륨이나 바인드 마운트 기능을 보유하고있다.
유기적인 컨테이너간의 연결이 되었다면 추가로 배포, 확장, 운영까지 신경을 써야하는데
우리가 그토록 말로만 들었던 쿠버네티스(Kubernetes)를 통한 컨테이너 오케스트레이션이 여기에 들어간다.
또한 개발자라면 자신의 작업에 대한 배포 관리를 해야할텐데
GitHub Actions 또는 Jenkins 등의 CI/CD 도구와 docker에 대한 연동이 필요하다.
코드 푸시 -> 자동 테스트 -> 이미지 빌드 -> 필요시 이미지 푸시
로 구성되는 소스부터 컨테이너까지 즉시 반영되는 핫 리로딩 환경에 대해 구성할 줄 알아야한다.
AI 엔지니어라면?
아마 튜닝한 모델 배포가 주가 되지 않을까 이건 나도 배우는 중이라 모르겠다.