본문 바로가기

Dev/인프라

[Docker] 도커 입문

 개발용 컴퓨터에서 개발 후 테스트에서 이상이 없으면, 서버용 컴퓨터에 올려서 사람들이 사이트를 볼 수 있도록 배포한다. 두 컴퓨터에는 동일한 프론트, 백, DB의 개발 환경 버전들이 필요하다.

 서비스 A(서비스 A : 프론트-백-DB) 뿐만아니라 여러 서비스들의 다양한 버전의 충돌을 예방하기 위해서 꽤나 번거로운 설정이 필요하다. 이를 해결하기 위해 virtualBox, vmWare, 페러릴즈 같은 가상환경을 이용할 수 있다. 내 운영체제 안에 또 다른 운영체제를 설치해서 서비스 A는 이 운영체제에서, 서비스 B는 이 운영체제에서 개발할 수 있다. 가상환경은 공간을 분리해주지만 컴퓨터 자원을 차지하고, 공통 기능이 중복되기 때문에 효율적인 방법은 아니다.

 도커의 컨테이너를 활용하는 방법도 있다. 컨테이너는 딱 필요한 컴퓨터 자원을 필요로 하고, 여러 컨테이너끼리 공통된 기능을 공유하기 때문에 자원의 낭비가 없으며 공간의 분리도 가능하다. 개발자는 각 컨테이너들이 어떻게 설계되고 지정한 곳에서 어떻게 설치가 되며 어떤 업무를 수행할지, 여러 컨테이너들이 어떻게 연결되어 있는지 설계도에 명시할 수 있다. 개발용 컴퓨터에서 작업한 코드를 이 설계도와 함께 서버용 컴퓨터에 보내면, 그 서버에서 이 설계도 대로 컨테이너를 설치해준다.

 

아래는 도커의 기본적인 개념과 사용법, 명령어를 강의를 수강하며 정리하였습니다. 

(참고 : https://www.youtube.com/watch?v=Ps8HDIAyPD0&list=PLuHgQVnccGMDeMJsGq2O-55Ymtx0IdKWf&index=1) 

1. 수업소개 : 도커를 이용하기 위한 방법
- 하나의 운영체제가 설치된 컴퓨터 안에서 각 서비스 앱이 격리된 환경에서 실행된다.
- 각각의 컨테이너에는 운영체제 전체가 설치되어 있지 않고, 앱을 실행하는 데 필요한 라이브러리, 실행 파일만 포함
- 이미 존재하는 운영체제를 공유하기 때문에 설치할 필요가 없고 속도도 느려지지 않고 저장용량도 아낄 수 있다.
- 리눅스 운영체제에는 위와 같은 앱 실행 방법이 내장되어 있다. (컨테이너 기술)


2. 설치
- 도커와 같은 컨테이너 기술은 리눅스 운영체제 기술이다. 즉, 도커 위에서 돌아가는 컨테이너 안에서 수행되는 앱들은 리눅스 운영체제에서 동작하는 앱들이다.
- 만약 사용하는 컴퓨터가 리눅스 운영체제가 아니라면 (Windows, Mac OS) 컴퓨터에 가상 머신을 설치하고 가머신에 리눅스 운영체제를 설치하면 돼 컨테이너 기술을 이용할 수 있다. 하지만 이 작업을 도커가 대신 해준다. 가상머신을 알아서 설치해주고 그 안에 리눅스 운영체제도 설치해 준다.

 

3. 이미지 Pull
- 필요한 어플을 앱스토에서 다운받는 것처럼 docker.hub 레지스트리 서비스에서 필요한 이미지를 다운 받는다.
- 프로그램이 실행되면 프로세스가 동작하는 것처럼 이미지를 실행하는 것을 컨테이너라고 한다.
- 프로그램이 여러개의 프로세스를 가질 수 있는 것처럼, 이미지도 여러 개의 컨테이너를 가질 수 있다.
- 도커 허브에서 필요한 이미지를 다운로드 받는 법
1) hub.docker.com 》 Explorer 메뉴 》 containers 메뉴
: 아파치 웹서버란 프로그램을 컨테이너 위에서 실행시키기 위해 아파치 웹서버가 설치된 컨테이너인 httpd 를 검색한다. 오피셜 이미지 메뉴에서 Pull 명령어 복사 (docker pull httpd­)

2) docs.docker.com 》 reference 메뉴 》 Command-line reference 메뉴 》 docker CLI 메뉴
: docker Pull 명령어 형식 확인 가능
docker pull [옵션] IMAGE_NAME [태그|@DIGEST]

3) 이미지 다운이 잘 됐는지 확인
: docke images
 다운한 이미지 이름이 나오는지 확인

 

4. 컨테이너 RUN 과 기본 명령어
1) docker run [옵션] IMAGE [컨테이너 안에서 실행할 명령]
docker run http : httpd 기반으로 컨테이너가 만들어지고 실행된다.
docker run -name ws2 httpd : 하나의 이미지는 여러 개의 컨테이너를 만들 수 있다.

2) ps
: 만든 컨테이너의 ID, 생성시간, 활성여부, 이름 정보를 알 수 있다.
docker ps -a : 중지한 컨테이너도 확인 가능하다. (-A 옵션 없이는 비제공)

3) docker stop [컨테이너 이름 또는 ID]
: 실행중인 컨테이너를 중지한다.

4) docker start [컨테이너 이름]
: Stop 한 컨테이너를 다시 킨다.


5) docker logs [컨테이너 이름]
: 컨테이너 관련 로고를 볼 수 있다. (-f 옵션 : 실시간 로그 확인가능)

6) docker rm [컨테이너 이름]
: 컨테이너 삭제
(현재 실행중인 컨테이너는 삭제 불가능하기 때문에 stop 후 처리한다. 또는 --force 옵션을 이용한다.)

7) docker rmi httpd
: 이미지를 삭제한다.

 

5. 네트워크
1) 도커없이 웹서버를 사용하는 방법
- 웹 서버를 사용하기 위해서는 2개의 컴퓨터가 필요하다. (웹브라우저용 웹 서버 + 웹페이지 저장 파일 시스템용)

http://example.com:80/index.html url 입력하면 80번 포트로 접속한다.
- 80번 포트에 대기중이던 웹서버는 파일 시스템에서 index.hn 1을 찾아 웹브라우저에게 전달한다.

 

2) 도커를 사용해서 웹서버를 사용하는 방법
- 컨테이너에 웹서버가 설치된다.
- 호스트와 컨테이너의 각 80번 포트를 연결한다.
- docker run-p 80:80 htpd 
- 포트 포워딩 <호스트포트>:<컨테이너포트>


- docker run -name ws3 -p 8081:80 httpd : Hot 의 8081 포트로 들어오면 컨테이너의 80 포트로 포워딩 한다.
localhost:8081/index.html 접속 가능하고 로그 또한 확인할 수 있다. index.html 을 편집하여 나의 서비스를 개발한다.

 

6. 명령어 실행
- docker exe [컨테이너 이름] [실행 하고픈 명령어]
- 컨테이너와 지속적으로 연결을 유지하면서 계속 명령을 전달하려면
- docker exe -it [컨테이너 이름] /bin/sh : sh 본 셸 프로그램이 실행된다.
  셸 : 사용자가 입력한 명령을 셸프로그램이 받아서 운영체제에게 전달해준다.
- ext 명령 후 내리는 명령은 H051에게 적용된다.
- Index.html 편집하기
    hub.docker.com 》 아파치 웹서버의 매뉴얼 페이지 》 Index.html 의 경로를 알 수 있다.
    1) 본셸 전환
    2) cd Index.html 경로
    3) ls -
    4) apt update 갱신
    5) apt install nano : 나노에디터 설치 = html 파일 수정가능
- 이 방법은 만약 컨테이너가 사라진다면, 수정사항파일도 사라지기 때문에 이렇게 직접 수정하는 방식은 위험하다.


7. 호스트와 컨테이너의 파일 시스템 연결
- 컨테이너를 사용하는 이유는 필요에 따라 언제든지 생성하고 삭제할 수 있다는 점이다.
- 컨테이너의 파일시스템과 호스트의 파일시스템을 연결하고, 호스트 단위에서 수정이 이루어졌을 때, 이것이 컨테이너의 파일 시스템에 반영될 수 있다면, 컨테이너가 날라가도 안전하게 개발을 지속할 수 있다.
또한 버전관리가 용이하다.
- 수정은 Host, 실행은 Container
    1) Host index.html 생성
    2) docker run -p 8888:80 -v ~/Desktop/httpdocs:/usr/local/apache2/htdocs/httpd : -v [호스트경로]:[컨테이너경로]
    3) localhost:8888/Index.html 에서 Host 단위 변경이 이루어지면, 컨테이너 파일시스템도 자동으로 반영되기 때문에 변경된 모습을
볼 수 있다.
- host 단위에서 버전관리, 백업정책, 에디터수정이 되는 장점이 있다.

'Dev > 인프라' 카테고리의 다른 글

AWS API Gateway 기초 개념 정리  (0) 2022.01.07
AWS 기초 개념 정리  (0) 2022.01.07