코로 넘어져도 헤딩만 하면 그만

Docker 심화 학습 본문

스터디/야 나두(새로운 기술 학습) - 2023.08~

Docker 심화 학습

꼬드리 2024. 5. 29. 13:53

- Thanks to. 도커 사용법 학습에는 생활코딩의 도움을 받았습니다!

 

 

🚩Doker

기본적으로 도커 위에는 실시간으로 돌아가는 컨테이너가 여럿 있고, 각각의 컨테이너 안에서 도는 앱들은 리눅스 운영체제를 기반으로 한다. 그러나 리눅스가 아닌 개발자도 얼마든지 도커를 사용할 수 있다.

 

만약 환경이 Window, Mac이라면 가상머신을 깔고 그 가상머신에 리눅스 운영체제를 깔아 도커와 같은 컨테이너 기술을 사용할 수 있다. 또한 직접 설치할 필요없이 도커가 스스로 가상머신과 리눅스를 설치해주기에 이 부분은 크게 신경 쓰지 않아도 괜찮다. 단, 이처럼 가상머신을 사용하게 된다면 약간의 속도 저하는 감수해야 한다.

 

이런 단점을 감안하고도 도커를 쓰는 이유는 개발자로서 도커의 편의성을 무시할 수 없기 때문이다.

 

 

 

🚩도커 설치

https://docs.docker.com/desktop/install/windows-install/

상단 주소에서, 각각 개발 환경에 알맞은 Desktop을 찾아 다운 받고 설치해준다.

내 경우에는 Windows기반으로 깔아주었다. 일단 docker을 깔면 Docker Desktop이라는 GUI도구를 사용할 수도 있지만, 이보다는 터미널에서 빠르게 명령어로 사용하는 것이 훨씬 낫다.

(💡리눅스 환경에서는 GUI 가 없어서 명령어로만 가능하다!)

 

cmd로 우선 명령 프롬프트를 열고 docker images를 쳤을 때, 에러가 아닌 데이터가 나타나면 잘 설치된 것이다. 이후 도커는 꾸준히 터미널에서 다룬다. 또 docker를 새로 설치했다면 docker images 명령어를 사용했을 때 하단처럼 아무 이미지가 없는 것이 정상이니 크게 걱정하지 않아도 된다.

즉, Docker는 처음 설치 시 아무 이미지도 포함하지 않으며 사용자가 컨테이너를 실행하거나 다른 이미지를 다운로드할 때만 이미지가 생성된다.

이미지가 없다!

 

 

 

🚩도커 허브에서 Image Pull하기

App Store와 유사하게, Docker Hub이라는 곳에서 우리가 원하는 이미지들을 골라 받아올 수 있다.

이렇게 가져온 이미지를 실행하는 것이 바로 컨테이너container다. 하나의 이미지는 여러 개의 컨테이너를 가질 수 있으며, 이미지를 받아오는 행위를 pull, 실행시키는 행위를 run이라고 부른다.

즉 run하는 순간 이미지가 컨테이너로 바뀌고, 우리는 받아 온 프로그램을 사용할 수 있게 된다.

 

https://hub.docker.com/explore

1) 위 주소의 Explore을 살펴보자.

자신이 사용할 이미지를 찾거나, 실시간 인기 있는 이미지를 볼 수 있다. 예시에서는 httpd라고 불리는 검증받은 The Apache HTTP Server Project를 설치해 보기로 했다.

 

https://docs.docker.com/reference/cli/docker/image/pull/

2) 공식 문서의 도커 명령어를 참고하여 아래와 같이 이미지 pull을 시도한다.

이후 docker images 명령어로 다시 확인하면 처음처럼 텅 비어있는 것이 아니라  httpd에 대한 이미지가 설치된 것을 확인할 수 있다.

docker pull httpd

 

윈도우에서는 GUI로도 설치된 이미지를 확인할 수 있다.

images를 보니 httpd가 설치되었다.

docker run httpd //httpd기반으로 컨테이너를 만든다.
docker ps //생성한 컨테이너의 ID와 실행중인 컨테이너의 정보 보여줌.
docker ps -a //all의 약자. 꺼져있는 컨테이너도 보여준다.

 

또한 하나의 이미지로는 여러 개의 컨테이너를 만들 수 있다.

docker run --name ws2 httpd //ws2라는 이름으로 생성하기
docker stop [컨테이너명] //도커를 멈추게 한다.
docker start ws2 //다시 재시작.
docker logs -f ws2 //watching 되어 실시간으로 로그를 볼 수 있다.
docker rm ws2 //컨테이너를 삭제해준다. 단, 실행 중이면 바로 삭제할 수 없어서 먼저 꺼준다.
docker rmi //이미지 삭제.

 

 

 

🚩네트워크와 포트 주소

컨테이너 생성 시 특별히 원하는 포트 주소를 지정해서 받아올 수 있다. GUI에서도 실행 가능하지만, 아래와 같은 명령어로 터미널에 입력하면 ws3라는 이름을 가진, port 번호 8081번의 httpd 이미지 기반 컨테이너가 생성된다.

—name은 이름, -p는 번호를 의미한다.

 

해당 주소에서 It works!가 제대로 나오는 걸 보면 컨테이너 내부 index.html이 제대로 반영되고 있는 것을 확인 가능하다.

 docker run --name ws3 -p 8081:80 httpd

그러나 우리는 It works!만 보고 끝나는 것이 아니라 어떠한 앱을 만들고 싶어하는 것이기 때문에, 컨테이너 내부로 들어가서 이를 수정할 수도 있어야 할 것이다.

 

 

🚩컨테이너 내부로 깊이 들어가기

우선 GUI를 사용해서 수정하는 방식부터 알아보자.

 

각 컨테이너에서 점 세 개를 클릭하여 Open in terminal을 클릭해본다.

터미널이 일단 열리면 이 터미널은 호스트가 아니라 컨테이너 내부에서 명령을 실행하게 된다. pwd를 쳐서 확인해보면 직관적으로 위치를 파악할 수 있다.

# pwd
/usr/local/apache2

 

터미널에서는 아래와 같은 명령어로 실행한다.

docker exec [컨테이너 이름] pwd
//지속적 연결X, 일회성으로만 처리.
지속적인 연결을 해두려면 /bin/sh를 붙여준다.

/bin/sh는 쉘을 사용하겠다는 의미로, 사용자가 입력한 명령을 shell 프로그램이 받아서 운영체제에게 전달하는 일종의 창구 역할이다. 다만 -it도 앞에 붙여 주어야 컨테이너 내부로 들어가 지속적으로 확인이 가능하다. 터미널 앞에 # 표시가 뜬 것을 보면 연결된 것을 알 수 있다.

💡요즘은 sh보다 기능이 다양한 bash를 주로 쓴다. /bin/bash 이런 식…하지만 어떤 컨테이너는 bash가 없는 경우가 있어서 이 점을 고려해 sh를 유동적으로 파악하고 쓸 수 있어야 한다.

 

 

🚩Index.html 수정해보기

사용하는 이미지 페이지 상세 설명에는 보통 index.html이 어디에 있는지 위치가 나와 있다. httpd의 경우 아래와 같은 경로로 한번 접근해보았다.

cd /usr/local/apache2/htdocs/

 

컨테이너는 늘 최소한으로 용량을 줄이기 때문에, index.html을 수정하기 위해 nano 편집기를 받아 깔아주어야 한다.

apt update
apt install nano//index.html을 터미널에서 수정할 수 있는 나노 편집기
nano index.html // Ctrl+X 한 뒤 Y할 경우 수정 저장 가능.

위와 같이 파일을 직접 수정하자 문구가 Changed로 바뀐 것을 볼 수 있다.

 

 

🚩호스트와 컨테이너 파일 시스템 연결하기

그러나 위와 같은 방식으로 직접 컨테이너 내부에서 수정한다면 해당 컨테이너가 삭제되면 기껏 작성한 파일도 모두 사라진다는 치명적인 문제가 생긴다. 도커 컨테이너는 언제든지 쉽게 만들고 삭제하는 것이 사용의 기본 개념이기 때문에 매우 중요한 문제다.

 

따라서 호스트에서 파일을 작성하고 이를 실행 환경만 맡긴 컨테이너 쪽에 넘겨줄 수 있다면 가장 이상적일 것이다.

이를 위해 실행시 -v 를 추가하여, Desktop 파일 위치와 컨테이너의 주소를 쌍방으로 연결해준다.

이렇게 하면 데스크톱 파일을 수정해도 페이지가 반영되어 변화하는 것을 볼 수 있다.

docker run -p 8888:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd

 

이렇게 나누면 호스트의 파일을 수정해도 바로 컨테이너 쪽으로 반영이 된다. 즉 호스트 환경 쪽에서 따로 버전 관리를 한다던지, 추가적으로 에디터를 사용하여 원하는 방식으로 코드를 편집할 수 있다.

Comments