이번에 졸업작품을 준비하면서 CI/CD 파트를 내가 맡아서 하게 되었다.
처음에 도커에 대해 알고 있는 점은 VM보다 뭐 더 가볍고 더 좋다 라고 하더라 해서 무작정 프로젝트에 적용 시키자 라고 계획을 짰고,
예전에 도커에 대해 공부해보려고 했는데 도커에 관련된 키워드 들이 조금 생소한 단어들이 있었는데 공부해 보니 생각보다 어렵지 않고, 다른 분들도 이런 고민을 할것 같고, 나도 나만의 정리를 하고 싶어서 시작하게 되었다.
인터넷에 검색해 보면
도커는 컨테이너 기반으로하는 오픈소스 가상화 플랫폼 (이거보고 겁을 먹었었다) 이라고 설명 되어있다.
말이 조금 어렵지만 간단하게 말하자면
'하나의 리눅스 컴퓨터(GuestOS)에 Mysql이나 톰캣같은 앱을 각각 독립적으로 실행해주는 기술'
이라고 이해하시면 됩니다!
정확한 내용은 아닙니다 대략적으로 그냥 이런거구나! 하고 감을 잡으시고 밑에 더 상세히 설명 드리겠습니다
그리고 참고로 도커는 리눅스 환경에서 작동하여서 리눅스 명령어로 동작된다라고 알고계시면 됩니다!
VM, 즉 가상기기는 하나의 컴퓨터에 Mysql, 톰캣 같은 프로그램을 각각 하나씩 사용한다고 보면 됩니다 .
VM 각각이 하나의 컴퓨터라면 윈도우나, macOS 같은게 깔려 있으니 당연히 하나하나가 엄청 크고 무겁고, VM에 어떤 앱을 실행하기 위해 받는 이미지에 OS도 포함되어있어서 엄청 불편합니다! (이미지는 뒤에서 이어서 설명하겠습니다. )
VM에 사용되는 이미지는 앱 기능에 OS까지 가상화를 해야하니 부담이 많이 되고, 또 배포와 관리를 하기 불편합니다 .
또 OS 까지 돌려야하니 앱 돌리기에도 부족한데 리소스를 많이 잡아 먹습니다.
위와 같은 문제를 해결한게 Docker입니다!
![[Pasted image 20230716215517.png]]
도커는 VM 과 다르게 하나의 OS(HostOS의 커널)를 공유하면서 사용합니다
그러므로 따로 OS를 가질 필요가 없어서 불필요한 리소스를 줄일수 있는 겁니다!
도커는 VM에 비해 가볍기 때문에 이를 통한 장점도 많습니다
그리고, 도커는 요새 핫한 키워드인 MSA 환경과도 적합합니다.
또 서버를 여러대 운영하다가 보면 , 분명 똑같이 설정한것같은데 어 왜 안되지? 같은 경우가 발생합니다. 똑같은 일을 하는 서버를 만들더라도, 운영체제부터 컴파일러, 설치된 패키지까지 일치하지 않고, 또 이러한 차이점들이 장애를 일으키고 맙니다...
출처 : https://www.44bits.io/ko/post/why-should-i-use-docker-container
이런 부분은 도커 파일 을 이미지로 만들어 두게 되면, 각 서버에 설치하더라도, 서버는 그 도커 파일을 만든 시점으로 위와 같은 장애가 발생하지 않게 됩니다.
위에서 예를 들었던 Mysql 이나 Tomcat 같은 각각의 앱(Application)을 도커 환경에서 실행할 수 있게 담고 있다고 생각하시면 됩니다!
나중에 SpringBoot 나 nodeJS로 프로젝트를 만들어서 Docker에서 실행하고 싶으면
DockerFile 을 작성해서 이를 통해 이미지를 만들게(Build) 될거에요!
-> 그리고 이미지를 만들고, 이미지를 통해 컨테이너를 만들어서 컨테이너를 실행시키면됩니다!
Application --> Dockerfile --(Build)--> Image --(Create)--> Container
도커에서 유명하고, 자주 사용하는 이미지를 모아놓은 사이트가 있습니다!
https://hub.docker.com/
로 접속하셔서 원하는 앱을 검색하신뒤 pull 이라는 명령어를 이용하여 이미지를 받아 사용하시면 됩니다!
추가로 말하자면 dockerhub에서 개인 레포지토리가 제공되는데 내가 만든 앱을 배포할 때 pipeline 에 사용되기도합니다!
(현재 제가 진행하고 있는 프로젝트에도 사용하였습니다. )
간단한 명령어 사용법이니 자세한 명렁어 키워드는 docker 공식 문서를 보시면 됩니다!
https://docs.docker.com/engine/reference/run/
설치는 공식 사이트에 하셔서 하는게 짱입니다... 👍
https://www.docker.com/
참고 : docker 명령어는 root 권한이 필요해서 꼭 명령어 앞에 sudo 를 붙여 주세요!
위의 dockerhub 에서 이미지를 검색할 수있는데, 또 개발자라면 간지나게 터미널에서 검색 할 수있어야 하니까 search 라는 명령어가 있습니다
docker search [검색하고 싶은 앱]
여기서 OFFICIAL인 것을 보통 선택하시면 됩니다! (도커에서 인증한 사람이 만든 거라고 생각하세요!)
위에서 검색한 도커 이미지를 이제 내 컴퓨터나 서버로 들고와야 할텐데 그럴 때는
pull 이라는 명령어를 사용하면 됩니다.
docker pull [검색한 앱의 NAME]:[태그]
태그는 앱의 버전입니다!
원하는 버전을 입력하셔도되고, latest 라고 입력하게 되면 제일 최신 버전이 받아집니다!
내가 받은 이미지들은 진짜 쉽습니다 이미지 들을 봐야하니다 images 라고 치면 됩니다!
docker images
docker run 이라는 명령어로 실행시키면되는데 이 명령어들은 옵션이 중요해서 자주 쓰는 옵션까지 설명 드리겠습니다!
[] -> 안의 문자는 '' 로 감싸주시고 숫자는 그냥 쓰시면 됩니다!
docker run
--name [내가지정할 컨테이너 이름 (지정안하면 이름이 랜덤으로 만들어져요!)]
-p [외부에서 그니까 리눅스 컴퓨터에서 접근하고 싶은 포트]:[컨테이너 내부에서 연결될 포트]
--link [도커 컨테이너끼리 연결이 안될 수있는데 이를 통해 연결합니다! ]
-e [mysql 같은걸 실행할때 필요한 매개변수 앞에 쓰는 겁니다!]
-d [백그라운드에서 실행한다는 뜻입니당!]
[마지막에 실행할 도커 이미지의 name이나 id 를 씁니다!]
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=test1234 -d -p 3306:3306 mysql
docker run --name tomcat -p 8080:8080 --link mysql-container -d tomcat
process status 의 약자인 ps 로 치면 현재 실행중인 컨테이너들의 리스트를 보여준다!
docker ps
위의 ps 명령어에 -a 를 붙이면 된다!
docker ps -a
참고 : 위의 run 명령어로 만들게 되면 이미지로 컨테이너를 만드는 기능이다 !
docker start [컨테이너 name or ID]
docker stop [컨테이너 name or ID]
docker restart [컨테이너 name or ID]
도커 컨테이너도 일종의 리눅스 컴퓨터라고 생각하면 편합니당
mysql 이미지로 컨테이너를 만들어 실행시켜서 컨테이너 내부에서 mysql 을 cli 로 접속할 수있다!
docker exec -it [컨테이너 name or ID] /bin/bash
-it 라는 명령어로 docker내 bash(명령어를 입력할 수있는 곳) 로 접근할 수있다
아래는 mysql 컨테이너를 작동해서 접근해서 docker 내 mysql CLI 로 접속하는 예시 입니다!
docker exec -it mysql /bin/bash -> (엔터)
bash-4.4# <- 이부분을 보면 docker컨테이너 내부 bash 로 들어온걸 확인할 수 있습니다!
mysql -u root -p 이 명령어로 도커 컨테이너 내부의 mysql CLI 로 접속을 한다!
이건 linux 명령어와 똑같이 rm 이다!
docker rm [컨테이너 name or ID]
위의 지우는 명령어인 rm 에서 image의 약자인 i 를 붙이면 된다!
docker rmi [이미지 name or ID]
처음에 겁을 먹은 것 보다는 생각보다 이해하기 쉬웠던 것같다 !
다른 블로그를 봤을 때 실전적인 내용보다 이론적인 부분이 강해서 더욱 그랬던 것 같다.
그냥 용어에 대해서 어색하고 부담감이 있어서 그런 것 같아서 그랬던것 같다
역시 개발자는 야생형 으로 공부해야 된다고 느꼈다.
나처럼 용어나 새로운 지식에 대한 걱정을 가진 분들도 한번쯤은 사용해 보면 좋을 것같아서 내가 사용하면서 도움이 됐던 부분이랑 이해한 부분을 정리하였는데 도움이 됐으면 좋겠다 ^^7
잘봤습니다.