DOCKER

[DOCKER] 기본 사용법

hyebin Lee 2023. 1. 9. 00:04

도커란?

우리는 웹개발을 할 때 웹서버나 데이터베이스를 설치해야한다. 하지만 이 과정은 매우 복잡하고 까다롭다. 

누군가가 운영체제위에 웹 서버나 데이터베이스를 설치한 다음 그걸 우리에게 준다면 얼마나 좋을까? 

 

 

이때 운영체제가 설치된 컴퓨터를 주인이라고 하고 이를 host 라고 한다. 

host에서 실행되는 격리된 각각의 실행환경을 container이라고 한다. 

한대의 컴퓨터안에 격리된 환경에서 각각의 앱이 실행된다.  

각각의 컨테이너에는 앱을 실행하는데 필요한 라이브러리와 실행파일들만 포함돼 있다.

리눅스 운영체제에는 이런 앱 실행방법이 내장되어 있다. 이를 컨테이너 기술이라고 한다. 

컨테이너기술을 이용하여 앱 실행을 쉽게 해주는 소프트웨어가 여러개 있는데 그중에서 제일 잘 나가는것이 바로 도커이다. 

 

도커와 같은 컨테이너 기술은 리눅스 운영체제의 기술이다. 

그렇다면 내 컴퓨터가 리눅스 운영체제가 아니라면 도커를 쓸 수 없을까?

 

우리의 운영체제가 윈도우나 맥OS라고 한다면 컴퓨터에 가상머신을 깔고 그 위에 리눅스 운영체제를 깔면 그 위에서 도커와 같은 컨테이너 기술을 사용할 수 있게 된다. ( 가상머신위에 동작하기 때문에 약간의 속도저하가 있을 수 있다. )

이러한 방법이 매우 복잡하지만 이는 도커가 다 해준다!

 

도커 설치 방법

https://www.docker.com/

 

Docker: Accelerated, Containerized Application Development

Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

도커를 설치하고 터미널에 docer images를 입력했을 때 에러가 뜨지 않는다면 성공한 것이다. 

 

이미지 pull

1. 우리는 프로그램이 필요할 때 app store 에서 다운 받는다.  이것과 비슷한 것이 레지스토리 서비스인 docker hub이다. 이곳에서 필요한 소프트웨어를 찾을 수 있다. 

2. app stroe에서 다운받은 프로그램은 도커허브에서 다운받은 이미지와 비슷하다. 

3. 프로그램을 실행하면 프로세스가 동작을 하는데 도커에서는 이미지를 실행하는 것을 컨테이너라고 한다.   프로그램이 여러개의 프로세스를 가지는 것처럼 도커또한 이미지가 여러개의 컨테이너를 가진다.

 

도커 허브에서 이미지를 다운받는 행위를 pull이라고 한다.

이미지를 실행시키는 행위를 run이라고 한다.

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

도커 허브를 들어가면 인기있는 컨테이너들이 있다.

 

아파치 웹서버를 설치하고 싶을 경우 httpd를 검색하면 httpd 이미지가 나온다.

docker pull httpd라는 명령어를 통해서 이미지를 다운받을 수 있다.

 

 

- 명령어 정리

docker pull httpd //httpd 이미지 설치
docker images //다운 받은 이미지를 확인할 수 있음
docker rim httpd //이미지 지우기

 

컨테이너 run

- 명령어 정리

//하나의 이미지는 여러개의 컨테이너를 만들 수 있다. 
docker run httpd //docker run 사용하고 싶은 이미지 이름 -> httpd기반 컨테이너가 만들어지고 컨테이너가 실행된다.
docker run --name ws2 httpd //w2라는 컨테이너 생성
docker ps //실행중인 컨테이너를 보고 싶을 때 
docker ps -a //모든 컨테이너를 볼 수 있다.
docker stop ws2 //실행중인 컨테이너를 끄고싶을 때
docker start ws2 //중지시켰던 컨테이너를 다시 킬 수 있다.
docker logs -f ws2 //실시간으로 변화되는 로그를 볼 수 있다.
docker rm ws2 //도커 컨테이너 지우기 (이때 실행중인 도커는 지울 수 없다. 따라서 중지를 하고 지워야한다)
docker rm ws2 -force //실행중인 컨테이너를 강제로 지우기

 

네트워크

<도커없이 웹서버를 사용하는 방법>

웹서버를 사용하기 위해서는 두대의 컴퓨터가 필요하다. 한대의 컴퓨터에는 웹브라우저 , 다른 한대는 웹서버가 설치돼 있다. 

웹페이지 데이터가 저장된 공간을 file system이라고 했을 때, 누군가 페이지를 요청했을 때 웹서버는 index.html를 디렉토리에서 찾을 수 있게 설정을 해둔다. 

컴퓨터에는 65000개의 포트라는 개념이 있어, 컴퓨터에 설치된 여러개의 소프트웨어들을 네트워크 적으로 구분하지 않는다면 컴퓨터로 접속이 들어왔을 때 어떤 소프트웨어가 그 접속을 마중나갈 지 알 수 없다. 

 

우리의 웹 서버는 80번 포트에서 접속을 대기할 수 있도록 설정돼 있다. 웹 서버가 설치된 컴퓨터의 주소가 example.com 일 때 

웹브라우저 주소창에 http://example.com:80/index.html 입력했을 때, 80번 포트로 접속한다. 

80번 포트에는 웹서버가 대기중이기 때문에 웹서버로 요청이 전달되고 웹서버는 브라우저가 요청한 파일을 찾는다. 그리고 그 파일을 읽어서 웹브라우저에게 전달한다.

 

<도커를 이용하여 웹서버 사용>

도커를 이용할 경우 docker run httpd 라는 명령어를 입력하면 웹서버가 컨테이너에 설치된다. 이 컨테이너가 설치된 운영체제를 도커 호스트라고 한다. 하나의 도커 호스트에는 여러개의 컨테이너가 만들어 질 수 있다. 컨테이너와 호스트 모두 독립적인 실행환경이기때문에 각자 독립적인인 포트와 파일시스템을 가지고 있다. 

웹브라우저에서 웹서버로 접속을 시도했을 때 host와 컨테이너는 연결이 끊겨있어 접속이 되지 않는다.

host에 80번 포트와 컨테이너의 80번 포트를 연결시켜준다. 컨테이너 실행 명령을 이렇게 바꿔준다.

docker run -p 80:80 httpd  -> 호스트와 컨테이너 포트 연결

앞에 80은 호스트의 포트, 뒤에 80은 컨테이너의 포트이다. 이렇게 설정해주면 호스트에 들어온 80번 포트가 컨테이너의 80번 포트로 전송된다. 이렇게 연결된 포트로 신호를 전달하는 것을 port fowarding 이라고 한다. 

 

명령어 실행으로 생성된 컨테이너 안에있는 파일 바꾸기

pwd // 어떤 디렉토리경로에 있는자를 절대경로로 표시하는 명령어
ls -a //현재 디렉토리 안에있는 모든 파일을 보여줌

//도커에서 명령어를 사용하고 싶을 겨우 exec를 사용한다. 
docker exec ws3 pwd //ws3 컨테이너를 대상으로 pwd명령어 실행(현재 컨테이너의 절대경로를 보여줌)

//컨테이너를 지속적으로 연결을 유지하면서 명령어를 전달하는 방법
doker exec -it ws3 bin/sh
또는bash shell
docker exec -it ws3 bin/bash

//연결을 끊고 컨테이너를 나가고싶을 때
exit

웹 서버의 Index.html 파일을 수정하는법

hub.docker.com에 매뉴얼을 보면  index.html이 어디에 위치해 있는지 정보를 알 수 있다.

 

docker ps //컨테이너 확인
docker exec -it ws3 /bin/bash //컨테이너 명령어 열기
docker //매뉴얼 경로 위치로 이동
ls -a//모든 파일 조회
apt update //apt 최신 상태로 갱신
apt install nano //nano editer 설치
nano index.html //nano명령어로 해당 파일 수정 가능

나노에서 파일을 수정하고 나갈 때는 ctrl+x, y , enter로 저장하면 된다. 리 로드하면 내용이 바뀐것을 볼 수 있다.

 

실행환경은 컨테이너에서, 파일 수정은 호스트에서

도커 파일 시스템 안에있는 index.html을 직접 수정할 경우 복잡하고 잘못했을 경우 컨테이너가 사라질 수 있다.

우리가 컨테이너를 사용하는 이유는 필요할 때 언제든지 생성했다가 필요없을 때는 언제든지 지울 수 있다는 것 때문이다. 

만약 컨테이너에 index.html이 있는 디렉토리와 host에 있는 디렉토리를 연결하고 호스트쪽에서 수정이 이뤄지고 그 수정이 컨테이너 파일 시스템에 반영될 수 있다면 얼마나 좋을까? 이럴경우 보다 안전하게 개발을 할 수 있을 것이다. 또한 파일의 버전관리또한 유용할 것이다.실행환경은 컨테이너에게 맡기고, 파일을 수정하는 작업은 호스트에서 진행하는 방법에 대해 알아보자. 

 

사용하고있는 에디터에서 htdocs디렉토리 아래에 index.html을 만들어 준다.

컨테이너의 파일시스템과 호소트의 파일시스템을 연결하는 방법을 할것이다. 

docker run -p 8888:80 v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd 
//호스트의 8888번포트와 컨테이너의 80번 포트를 연결하고 -v 옵션으로
//Desctop아래에 htdocds 디렉토리와 웹페이지를 찾도록 약속된 디렉토리를 연결시킨다.

 

파일의 내용을 수정 하면(호스트 수정) 호스트와 연결돼 있는 컨테이너안에 파일시스템이 바뀌면서 반영된것을 볼 수 있다.

호스트애서 파일이 수정되고 노출이 되므로, 호스트 환경 안에서 파일의 버전관리나 백업 및 코드편집이 가능하다는 장점이 있다.

 

 

 

출처 : 생활코딩 Docker 입문 수업