docker 최대한 쉽게 이해해보장!

wan2daaa·2023년 7월 16일
48

공부하게 된 계기

이번에 졸업작품을 준비하면서 CI/CD 파트를 내가 맡아서 하게 되었다.
처음에 도커에 대해 알고 있는 점은 VM보다 뭐 더 가볍고 더 좋다 라고 하더라 해서 무작정 프로젝트에 적용 시키자 라고 계획을 짰고,
예전에 도커에 대해 공부해보려고 했는데 도커에 관련된 키워드 들이 조금 생소한 단어들이 있었는데 공부해 보니 생각보다 어렵지 않고, 다른 분들도 이런 고민을 할것 같고, 나도 나만의 정리를 하고 싶어서 시작하게 되었다.

도커란

인터넷에 검색해 보면
도커는 컨테이너 기반으로하는 오픈소스 가상화 플랫폼 (이거보고 겁을 먹었었다) 이라고 설명 되어있다.

말이 조금 어렵지만 간단하게 말하자면

'하나의 리눅스 컴퓨터(GuestOS)에 Mysql이나 톰캣같은 앱을 각각 독립적으로 실행해주는 기술'
이라고 이해하시면 됩니다!

정확한 내용은 아닙니다 대략적으로 그냥 이런거구나! 하고 감을 잡으시고 밑에 더 상세히 설명 드리겠습니다

그리고 참고로 도커는 리눅스 환경에서 작동하여서 리눅스 명령어로 동작된다라고 알고계시면 됩니다!

그래서 VM(가상 기기) 이랑은 뭔 차이인데?

VM, 즉 가상기기는 하나의 컴퓨터에 Mysql, 톰캣 같은 프로그램을 각각 하나씩 사용한다고 보면 됩니다 .
VM 각각이 하나의 컴퓨터라면 윈도우나, macOS 같은게 깔려 있으니 당연히 하나하나가 엄청 크고 무겁고, VM에 어떤 앱을 실행하기 위해 받는 이미지에 OS도 포함되어있어서 엄청 불편합니다! (이미지는 뒤에서 이어서 설명하겠습니다. )
VM에 사용되는 이미지는 앱 기능에 OS까지 가상화를 해야하니 부담이 많이 되고, 또 배포와 관리를 하기 불편합니다 .
또 OS 까지 돌려야하니 앱 돌리기에도 부족한데 리소스를 많이 잡아 먹습니다.

VM 의 단점

  • CI/CD 워크 플로우에 적합하지 못하다
  • 각각의 VM에 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) 될거에요!
-> 그리고 이미지를 만들고, 이미지를 통해 컨테이너를 만들어서 컨테이너를 실행시키면됩니다!

앱을 도커로 사용하는 전체적인 flow

Application --> Dockerfile --(Build)--> Image --(Create)--> Container
  1. Application 에 Dockerfile 를 작성합니다!
    Dockerfile은 이미지를 만들기 위한 일종의 스크립트 라고 이해하시면 됩니다!
  2. Dockerfile 로 앱을 build 하며 도커 이미지로 만듭니다.
  3. 만든 도커 이미지로 Container를 만들어 실행시키면 됩니다!

참고 : 그럼 톰캣같은 이미지는 어디서 구해요?

도커에서 유명하고, 자주 사용하는 이미지를 모아놓은 사이트가 있습니다!

https://hub.docker.com/
로 접속하셔서 원하는 앱을 검색하신뒤 pull 이라는 명령어를 이용하여 이미지를 받아 사용하시면 됩니다!

추가로 말하자면 dockerhub에서 개인 레포지토리가 제공되는데 내가 만든 앱을 배포할 때 pipeline 에 사용되기도합니다!
(현재 제가 진행하고 있는 프로젝트에도 사용하였습니다. )

간단하게 도커 사용해 보면서 명령어 익히기

간단한 명령어 사용법이니 자세한 명렁어 키워드는 docker 공식 문서를 보시면 됩니다!
https://docs.docker.com/engine/reference/run/

추천 학습 방법

  • 아래의 간단한 명령어들을 한번 눈으로 익혀 보시고 ,
  • https://docs.docker.com/language/
  • 위 링크로 들어가서 각자 사용하는 개발언어에 따라 한번 해보는걸 무조건 추천 합니다!

도커 설치

설치는 공식 사이트에 하셔서 하는게 짱입니다... 👍
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

5개의 댓글

comment-user-thumbnail
2023년 7월 16일

잘봤습니다.

1개의 답글
comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

1개의 답글
comment-user-thumbnail
2023년 7월 23일

확실히 그냥 읽기보다는 명령어 하나하나 쳐보면서 결과 모는게 이해하기 쉬운것같아요

답글 달기