티스토리 뷰

반응형

 열심히 2.5달동안 리눅스 기초를 배웠다. 그건 다 도커와 쿠버네티스, 젠킨스, 앤서블을 사용해서 가상화와 자동화를 하기 위해서라는데 이게 다 무슨 말인지 몰랐다. 한동안은 그냥 좀비처럼 명령어를 따라치며 "된다!!" 생각만 하며 나는 배우고 있는 거라고 믿었다. 근데 나는 역시 본질적이고 근원적인 부분이 이해가 안되면 집중도 안되고 더이상 앞으로 나아갈 수가 없다. 그래서 황금같은 추석 연휴동안 집에서 책 붙들고 실습해보고 생각해봤다. 그리고 이제 대충 이해한 듯?
 
VMWare 리눅스 서버로 연결된 MobaXterm에서 실습하며 정리해보겠다.
 
일단 책에서 사용하는 실습 파일들을 root의 홈 디렉터리에 다운받아주기.

 빨갛게 모자 씌워놓은 부분이 책에서 제공하는 실습파일 폴더이다. 빨갛게 모자라니... 노린거 아닌데 레드햇이넹... ㅎㅎ
 
일단 도커Docker는 프로그램 이름이다. 명령어를 치는 것만으로 간단하게 컨테이너Container를 다룰 수 있게 만든 도구 프로그램. 
 
프로그램이니까 설치해야 한다. 리눅스에 설치하자.

그럼 컨테이너는 뭘까? 책에는 "하나의 운영 체제 안에서 커널을 공유하며 개별적인 실행 환경을 제공하는 격리된 공간"이라고 쓰여있다. 컨테이너 박스처럼 '공간'인데, 그 안에 CPU, 네트워크, 메모리 같은 시스템 자원이 할당되어 있고 애플리케이션도 들어있다. 그래서 다른 컨테이너에 영향을 받지 않고 '독립적'으로 작동할 수 있는 것.
 
(내가 썼는데도 뭔 소리인지 모르겠는데 이걸 진짜 진심으로 어떻게 이해할까.. 머리가 아닌 마음으로 느껴야 한다. 일단은 그런거구나 되게 좋은 거네 하고 넘어가는 지혜도 필요하다. 내가 그러고 있음! IT를 배우면서 많이 듣는 얘기가 있다. 인터넷 어떻게 돌아가는지 전혀 몰라도 우리는 다 인터넷으로 뭘 할 수 있는건지, 얼마나 좋은지 알고 본인 필요에 따라 잘 사용하고 있지 않나? 처음부터 완벽하게 이해할 필요 없고 그럴 수도 없음을 받아들여라. 일단 사용하는 방법만 익숙하게 하자.)
 

[도커라는 프로그램으로 할 수 있는 일]

 
1. 이미지Image 만들기(이미지 빌드하기)
 
컨테이너 이미지라고도 한다. 그리고 이미지를 빌드Build한다고 이야기한다.
그렇다면 이미지는 뭔가?? 이미지라는 건 컨테이너를 실행하기 위한 토큰 같은 거라고나 할까? 컨테이너에 대한 정보를 담고 있는 이미지를 얻어서 걔를 가진 후에 그걸 제출하면 띠링 하고 컨테이너가 실행되는 거... ㅎ.. 마음으로 이해...
이미지를 직접 만들려면 애플리케이션을 개발한 소스코드가 있어야 한다. 그리고 컨테이너 이미지를 빌드하기 위한 정보를 담고 있는 Dockerfile도 있어야 한다. 명세서같은 거라고 선생님이 그러셨는데 크게 와닿지는 않았다. 그리고 소스코드 빌드를 위한 파일들도 필요한데 이건 뭔지 모르겠다. 
 
아무튼, 애플리케이션에 대한 정보 + 컨테이너에 대한 정보 를 담고 있는 파일을 들고 도커한테 간다. 그리고 그 파일들을  한 데 넣고 도커한테 "빌드해줘. 이런 택 붙여서." 라고 하면 해준다. 도커는 그런 아이. 그걸 명령어로 표현하면,
 
파일들이 담긴 디렉터리 내에서
docker build -t 만들어질이미지이름:태그 작업공간
e.g.) docker build -t test-img .
 
인데, 엄밀히 말하면 이미지이름이 아니라 REPOSITORY라고 하는데 지금은 일단 이름으로 이해하는 게 좋을 것 같다. :태그 이 부분은 생략 가능한데 생략하면 자동으로 가장 최신의 것이라는 의미로 latest라는 태그가 붙는다.
 
직접 해보니  

Successfully 어쩌구 나오고 밑에 엄청 긴 16진수가 와랄랄라라라 나온다. 이미지 ID다.
 
docker images
 
명령어로 가지고 있는 이미지 확인해보니 잘 빌드되었다. 태그는 latest가 잘 붙었다. 근데 궁금증. 같은 파일, 같은 이름으로 태그 생략해서 또 빌드하면 latest가 바뀌는데 그럼 전에 있던 이미지의 태그가 바뀌나?? 해봐야지.
 

완전히 같은 이미지라고 판단했는지 Using cache라고 뜨면서 새로 안만들고 성공한 척 한다. 마지막에 보여주는 Image ID도 처음 빌드한 이미지와 같고, 이미지 목록 띄워서 CREATED(빌드된 시간) 확인해보니 갱신되지 않았다. 도커는 자원 활용을 잘하는 아이구나^__^!!
 
이렇게 컨테이너 이미지를 빌드하는 게 도커라는 프로그램으로 할 수 있는 첫 번째.
 
그치만 대부분의 경우 이미지를 직접 빌드해서 사용하지 않고, 이미 만들어져서 도커허브라는 레지스트리(저장소)에 모여 있는 이미지를 내려받아서 사용한다. 
 
2. 이미지 검색하고 내려받기
 
별도의 레지스트리를 지정하지 않으면 도커 허브에서 이미지를 찾아온다.
 
docker search 검색어
 
명령어로 이미지를 검색할 수 있다.

그리고
 
docker pull 이미지명
 
으로 이미지를 내려받을 수 있다. 이 때도 태그를 생략하면 latest로 받아진다. 

책의 실습 내용을 따라 nginx 이미지를 내려받았고 잘 받아졌는지 확인했다.
 
3. 컨테이너 생성/실행하기
 
직접 빌드하거나 내려받은 이미지를 가지고 컨테이너를 실행할 수 있다.
 
docker run nginx
 
이게 기본 명령어인데 run하면 컨테이너를 생성하면서 실행까지 같이 해버리는 듯. 근데 이렇게만 치진 않고, 옵션이 좀 많이 들어간다. 
 
docker run -d -p 8080:80 --name my-nginx --restart always nginx
 
필수적이라 느껴지는 옵션을 다 넣으면 대충 이런 모습.
-d(--detach) : 컨테이너를 백그라운드로 구동한다.
-p(--publish) : 외부에서 호스트로 보낸 요청을 컨테이너 내부로 전달한다. 요청 받을 호스트 포트:연결할 컨테이너 포트 형식으로 사용한다.
--name : 생성될 컨테이너의 이름을 지정해준다.
--restart always : 컨테이너가 비정상적으로 종료되거나 도커 서비스가 중지되었다가 다시 시작될 때 컨테이너도 재시작할건지에 대한 정책을 설정한다. 기본값은 no 이고 on-failure, always, unless-stopped 이렇게 네 가지 값이 있다.

딱 한 줄 나오는데 이러면 성공한 것이다. 방금 생성하고 실행한 컨테이너를 식별할 수 있는 Container ID 이다.

docker ps 명령으로 구동중인 컨테이너 상태를 확인할 수 있다. 컨테이너에 사용된 이미지가 무엇인지, 포트가 잘 연결되었는지도 여기에서 볼 수 있다.

위처럼 -f(--filter) 옵션으로 검색도 가능하다. 필터링 대상을 지정할 때는 key=value 형식으로 입력하면 된다. 자주 사용하는 key는 id(컨테이너ID), name(컨테이너 이름), status(컨테이너의 작동 상태), ancestor(컨테이너가 사용하는 이미지) 등이 있다. value로 넣은 문자열이 포함된 컨테이너만 출력해준다. -q 옵션을 붙이면 컨테이너 ID만 보여준다. 아마 quiet 인듯 하다.
 
4. 컨테이너 삭제와 이미지 삭제
 
더이상 사용하지 않는 컨테이너와 이미지는 삭제해서 공간을 확보하는 것이 좋다.
 
순서는 컨테이너 정지 -> 컨테이너 삭제 -> 이미지 삭제 가 좋은데, 컨테이너를 정지하지 않고 강제로 삭제할 수도 있다.
 
 4-a 컨테이너 정지하기
 
docker stop 정지할컨테이너(이름 or ID의일부)
 
정지할 컨테이너 부분에 ID가 들어갈 수 있는데, docker ps -q 의 리턴값을 그대로 인자로 넣어줄 수도 있다.
 
docker stop $(docker ps -q -f name=nginx)
 
이런 식으로. 이걸 활용하면 필터를 설정해서 한 번에 여러개의 컨테이너를 정지하거나 삭제할 수 있다.

잘 정지되어서 docker ps 해도 나오지 않는다. 정지된 컨테이너도 보고 싶으면 -a 옵션 주면 된다.

그럼 상태가 Exited로 표시된다. 컨테이너 너도 쉬어서 신난거니... 아하..철자가 다르구나 😋
 
 4-b 컨테이너 삭제하기
 
docker rm 삭제할컨테이너(이름 or ID의일부)
 
-f(--force) 옵션을 넣어주면 구동중인 즉, 정지하지 않은 컨테이너라도 삭제할 수 있다.
 
docker container prune
 
위 명령어를 사용하면 구동중이지 않은 컨테이너를 전부 삭제할 수 있다.

확인해보기 위해 같은 이미지로 컨테이너 하나를 더 만든 후에 정지시키고 시도해보았다. non running container가 다 지워지는데 괜찮냐고 경고가 뜨고 y로 대답해주면 싹 지워버린다. 
 
 4-c 이미지 삭제하기
 
헤어지면 그 사람의 모든 흔적을 지워야 할 때가 온다. 컨테이너도 이제 안쓰니까 그 컨테이너 만들려고 사용했던 내 이미지도 지우고 원래의 나로 돌아가야겠지.... 센치...
 
docker rmi 이미지명:태그
 
rm에 이미지라고 i만 더 써주면 된다. 
 
docker rmi $(docker images -q nginx)
 
이런 식으로 컨테이너 정지/삭제할 때와 마찬가지로 조회한 결과 그대로 인자로 사용할 수 있다. id만 들어가야 하기 때문에 -q 옵션 꼭 써주기! 또 주의할 점은, 이 이미지를 사용한 컨테이너가 없어야(전부 삭제된 상태여야) 이미지를 삭제할 수 있다는 것.
 
docker image prune -a
 
위 명령어로 사용하지 않는 이미지 다 삭제해버릴 수 있다. 사용하지 않는다는 건 이 이미지를 사용하고 있는 컨테이너가 없다는 뜻이겠지...아마...?

이 명령어 또한 친절하게 경고 한 번 해주고 진행한다.
 
여기까지 도커로 할 수 있는 기본적이고도 핵심적인 것들을 해보았다.
 
기존 환경에서는 서버 자체(아마도 최근에는 주로 VM)에 dnf 또는 yum 같은 패키지 관리 도구를 사용해서 애플리케이션을 다운받고 사용했다면 컨테이너 인프라 환경이란 건 이렇게 컨테이너 이미지를 다운받아 컨테이너를 생성하고 실행하는 것인 것 같다. 그 과정을 쉽게 만들어주는 프로그램이 도커인 것이고. 그런 컨테이너들을 관리하기 편하게 만든 프로그램이 쿠버네티스겠지? 아직 거기까지는 잘 모르겠다. 근데 도커가 주로 이미지를 빌드하는 역할이었는데 이제 다 만들어진 이미지를 사용하는 경우가 많다보니 도커를 몰라도 쿠버네티스를 할 수 있다고 한다.
 
내일은 앤서블을 파보는 시간을 가져야지. 안녕~~

반응형