프로젝트/프로젝트 관련

Docker 입문 下

Wonuk 2021. 12. 28. 02:15
반응형
본 포스팅은 생활코딩 유튜브를 기반으로 작성되었습니다.
https://www.youtube.com/watch?v=Ps8HDIAyPD0

4. 컨테이너 run

上편에서는 설치부터 docker hub에서 이미지를 pull하는 방법까지 알아보았습니다.

이제는 이미지를 실행시켜서 컨테이너를 만드는 방법인 run을 알아보겠습니다.

 

docker desktop -> images를 클릭하여 httpd위에 마우스를 올려놓으면 우측에 run버튼이 나오게됩니다.

 

run을 클릭하게되면 이미지를 컨테이너로 만드는 대화상자가 등장합니다.

이때 run 버튼만 눌러도 되지만 이미지를 컨테이너로 만들면 여러개의 컨테이너가 생기는데

그때 이름이 잘 지정되어 있어야 관리하기 편합니다.

 

Optinal Settings를 눌러서 입력칸이 나오면

web server라는 의미의 ws1이라는 이름을 작성하고 run버튼을 클릭합니다.

 

run버튼을 누르면 

ws1이라는 이름으로 컨테이너가 생성된것을 확인할 수 있습니다.

이 컨테이너가 실행되면서 컨테이너 안에있는 process도 현재 running되고 있는 상태입니다.

 

ws1 컨테이너를 클릭하게 되면 실행되는 모습을 확인할 수 있습니다.

이 컨테이너 안에서 실행되고있는 프로세스가 뱉어내는 로그가 출력됩니다.

옆의 INSPECT로 컨테이너의 자세한정보, STATS로 통계자료를 확인할 수 있습니다.

 

그리고 실행되고 있는 컨테이너는 컴퓨터의 자원을 사용하고 있습니다.

자원을 아끼기 위해서는 컨테이너를 끌 필요가 있습니다.

이때 우측의 정지버튼을 누르게되면 정지되고, 다시 실행을 누르면 RUN하게 됩니다.

 

이 컨테이너가 더이상 필요없다면 휴지통 모양의 DELETE 버튼을 클릭하여

컨테이너를 삭제할 수 있습니다.

 

이 작업들을 COMMAND LINE에서 하고자 한다면

https://docs.docker.com/ 에서 확인 가능합니다.

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

docker run이라는 명령뒤에 실행하고자 하는 IMAGE의 이름을 작성합니다.

그 앞에는 옵션을적고 이름 뒤에는 컨테이너 안에서 실행하고싶은 명령이 있다면

그 명령을 입력하면 됩니다.

 

우리가 만든 컨테이너를 확인하고 싶다면

docker ps 명령어를 사용합니다.

생성된 컨테이너의 정보를 확인할 수 있습니다.

 

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

이번에는 대표적인 옵션인 name을 w2로 지정해보도록 합니다.

 

docker ps 명령어로 확인 합니다.

ws2라는 이름의 컨테이너를 확인할 수 있습니다.

 

실행중인 컨테이너를 종료하고 싶다면 컨테이너 이름이나, ID를

docker stop 이름 or ID 의 형식으로 입력하면 됩니다.

 

이 작업은 단순히 컨테이너의 실행을 정지시킬 뿐 삭제하는 작업은 아닙니다.

docker ps -a를 입력하면 실행중이지 않은 컨테이너도 출력됩니다.

종료된 컨테이너를 다시 실행시키고 싶다면

docker start 실행시킬 컨테이너 이름 을 입력하면 됩니다.

 

만약 로그를 확인하고 싶다면

docker logs 컨테이너이름 을 사용하면 됩니다.

실시간 로그를 확인하고 싶다면 docker logs -f 컨테이너이름 을 입력하면 실시간으로 확인이 가능합니다.

 

컨테이너를 삭제하고싶다면

docker rm 컨테이너이름 을 사용하면 됩니다.

삭제하기 전에는 꼭 stop 명령어로 중지시킨 다음 rm으로 삭제해야 합니다.

 

만약 실행중인 컨테이너를 중지하지 않고 한번에 삭제하고 싶다면 docker rm --force 컨테이너이름

명령어를 사용하면 됩니다.

 

 

마지막으로 image를 삭제하고 싶다면

GUI상 우측의 점 메뉴를 클릭하여 Remove를 선택하면 됩니다.

 

커맨드 라인에서 삭제하고 싶다면

docker rmi 이미지이름 명령어를 사용하면 됩니다.

 


5. 네트워크

docker를 사용하기 위해서는 네트워크에 대해서 조금은 알고있어야 합니다.

docker로 동작하는 많은 소프트웨어들이 네트워크를 이용하기 때문입니다.

apache web server 또한 네트워크 위에서 동작합니다.

 

우선 Docker없이 웹서버를 사용하는 방법을 알아보도록 하겠습니다.

Web server를 사용하기 위해서는 2대의 컴퓨터가 필요합니다.

 

한대의 컴퓨터에는 웹 브라우저가 설치되어있고, 다른 한대는 웹서버가 설치되어 있습니다.

웹 페이지를 파일로 만들어서 저장장치의 특정 디렉토리에 위치시켜야 합니다.

지금부터는 데이터가 저장된 공간을 파일시스템 이라고 부릅니다.

 

예를들어 파일시스템내에 있는 /usr/local/apache2/htdocs/ 디렉토리에

index.html 파일을 위치시키고 web server에게 요청이 들어오면

이 경로에서 찾아야 한다고 설정을 해둡니다.

 

컴퓨터에는 65000개 이상의 포트라는 개념이 있어서

여러 소프트웨어들을 네트워크적으로 구분해줍니다.

우리의 웹서버는 80번 포트에서 접속들 대기하고 있도록 설정되어 있습니다.

그리고 웹서버가 설치된 컴퓨터의 주소는 example.com이라고 예를 들겠습니다.

 

동작과정

 

 

 

docker를 이용하여 웹서버를 사용하는 방법

docker를 이용하면 웹서버가 컨테이너에 설치됩니다.

이 컨테이너가 설치된 운영체제를 docker Host라고 부릅니다.

하나의 host에는 여러개의 컨테이너가 만들어질 수 있습니다.

 

컨테이너와 호스트 모두 독립적인 실행환경 이기때문에 각자 독립적인 포트와

파일시스템을 갖고 있습니다.

host의 80번 포트와 컨테이너의 80번 포트를 연결해줍니다.

docker run -p 80:80 httpd

 

이렇게 설정해주면 host로 80번으로 들어온 신호가

컨테이너의 80번 포트로 전송되게 됩니다.

이렇게 연결된 포트로 신호를 전달하는 것을 포트포워딩 이라고 합니다.

요청신호가 웹서버로 전송되고 나머지 과정은 이전과 같습니다.

 

 

만약에 접속경로가 8000번 포트로 바뀐다면

어떻게 되는걸까요?

 

 

이제 자신의 컴퓨터에서 docker로 웹서버를 구동해보겠습니다.

ws2라는 컨테이너를 host 81포트로 만들어줍니다.

이를 커맨드 라인에서 실행하고자 한다면

docker run에 옵션을 지정하면 됩니다. 그중 -p 즉, --publish 를 사용하면 됩니다.

컨테이너의 포트를 호스트로 연결시킨다 라는 옵션입니다.

docker ps로 포트를 확인할 수 있습니다.

 

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

 

이제 우리가 만든 웹서버를 사용해봅시다.

url에 로컬호스트와 포트번호를 입력하면 로그를 확인할 수 있습니다.

 

 


6. 명령어 실행

우리가 만든 컨테이너는 상단에 보이는것과 같은 주소로 접속할 수 있고

접속했을 때 그 컨테이너 안에 있는 웹서버가 그안에 저장된 index.html파일을 읽어서

우리에게 보여주고 있는 화면입니다. 하지만 이 index는 쓸모가 없습니다.

우리는 index.html이라는 파일을 편집해서 나만의 web app을 만드는것이 중요합니다.

 

그러기 위해서는 컨테이너 안으로 들어가서 컨테이너를 사용할 수 있어야 합니다.

우선 docker desktop을 사용하는 방법부터 알아보겠습니다.

CLI버튼을 클릭합니다.

 

그럼 터미널이 실행되고 그 안에서 pwd라는 명령어를 실행하게 되면

host의 pwd가 아닌 컨테이너 안으로 들어와서 pwd 명령어를 실행한것이 됩니다.

ls -al 명령어 또한 컨테이너 안에서 실행되게 됩니다.

 

이것과 똑같은 것을 커맨드 라인에서는 어떻게 실행하는지 알아보겠습니다.

만약 우리가 컨테이너와 지속적으로 연결된 상태로 명령어를 입력하고 싶다면

다른 방법을 사용하여야 합니다.

명령어에 /bin/sh 을 붙여주면 됩니다.

 

이 명령어를 붙이면 shell이라는 프로그램이 실행되게 됩니다.

쉘이라고 불리는 프로그램들이 하는 역할은 사용자가 입력한 명령을

쉘 프로그램이 받아서 그것을 운영체제에게 전달해주는 일종의 창구같은 역할을 합니다.

 

docker exec -it ws3 /bin/sh를 입력하게 되면 #이 출력되고

이제부터 입력하는 모든 명령어는 ws3컨테이너 안에서 실행되게 됩니다.

 

-i와 t의 의미는 운영체제에 관한 이해가 필요합니다.

지금은 그냥 터미널과 지속적으로 연결하기 위해서는 -it를 사용해야 한다는것을 알면됩니다.

 

GUI에서 CLI를 실행하면 상단에 같은 명령어가 출력되는것을 알 수 있습니다.

 

만약 연결을 끊고 밖으로 나가고싶다면 exit 명령어를 사용하면 됩니다.

 

요즘 shell은 기능이 많이 부족하기 때문에 bash shell을 많이 사용합니다.

사용하고있는 컨테이너에 따라 bash shell이 없을 수 도 있습니다.

docker exec -it ws3 /bin/bash 명령어로 사용합니다.

 

 

다시 https://hub.docker.com/ 로 이동하여 index파일의 위치를 알아보도록 하겠습니다.

파란색 블록으로 지정된 경로에 사용자가 요청한 웹페이지를 보관하도록 약속되어 있습니다.

위 내용을 바탕으로 접속해보겠습니다.

 

docker exec -it ws3 /bin/bash

cd /usr/local/apache2/htdocs/

ls -al

nano index.html -> 실행안됨 apt나 욤을 이용하여 nano나 빔을 다운받아야함

apt update

apt install nano

nano index.html의 순서대로 명령어를 입력합니다.

index.html 파일의 내용을 Hello, Docker로 바꾼뒤

ctrl + X -> Y -> Enter 를 쳐서 저장하고 페이지를 리로드하면

파일이 변경된 것을 확인할 수 있습니다.

 


7. 호스트와 컨테이너의 파일시스템 연결

이전까지 우리는 docker안의 파일을 직접 수정했습니다.

하지만 이런 방식은 불편하고 위험한일을 초래할 수 있습니다.

 

예를들어서 docker 안에있는 index.html을 직접 수정한 상태에서

컨테이너가 사라진다면 어렵게 작업한 내용이 물거품이 됩니다.

물론 컨테이너가 사라지지 않게하면 됩니다.

 

하지만 컨테이너를 우리가 사용하는 이유는 필요할 때 언제든지 생성했다가

필요없을 때는 언제든지 지울 수 있다는 것입니다.

 

그렇다면 컨테이너에 /usr/local/apache2/htdocs/ 디렉토리와

호스트의 /Desktop/htdocs/ 디렉토리를 연결하고

호스트 쪽에서 수정이 이루어지면 컨테이너의 파일시스템에 반영된다면?

 

컨테이너가 지워져도 우리의 소스코드는 여전히 호스트에 남아있기 때문에

보다 안전하게 개발을 지속할 수 있고, 버전관리가 쉬워집니다.

 

실행환경은 컨테이너에게 맡기고 파일을 수정하는 작업은

호스트에서 진행하는 방법에 대해서 알아보겠습니다.

 

자신이 사용하는 에디터를 이용하여

Desktop/htdocs 경로 -> 바탕화면 를 생성하고 그안에 index.html 파일을 만듭니다.

이제 할일은 컨테이너를 생성하면서 컨테이너의 파일시스템과

호스트의 파일시스템을 연결해주면 됩니다.

 

 

docker run --name ws5 -p 8888:80

- C:\Users\Windows10\Desktop\htdocs\:/usr/local/apache2/htdocs/ httpd

호스트 8888포트와 docker 80포트를 연결하고 설정한 파일시스템 경로와 컨테이너 경로를 연결시키는 명령어

그리고 8888포트로 접속하면 아래 화면이 출력됩니다.

이제부터는 호스트의 파일만 수정해도 컨테이너 안의 파일도 수정됩니다.

재접속

이제부터 host에서 파일이 수정되고 누출되기 떄문에

host 환경 안에서 파일에 대한 버전관리나 백업정책을 수립할 수 있습니다.

 

앞으로 배울것

반응형

'프로젝트 > 프로젝트 관련' 카테고리의 다른 글

CI/CD 개념정리  (0) 2021.12.28
NGINX란 무엇인가? 왜 사용하는가?  (0) 2021.12.28
Docker 입문 上  (0) 2021.12.27
Docker란 무엇인가? 왜 쓰는가? 소개편  (0) 2021.12.25
JDBC, SQL Mapper(MyBatis), ORM  (0) 2021.12.25