바위 뚫는중

[Docker] 도커 소개, 설치, 명령어 실행 본문

Docker

[Docker] 도커 소개, 설치, 명령어 실행

devran 2021. 11. 18. 18:07
반응형

예전에 생활코딩을 보고 정리한 내용들

최근 맡게된 업무 내용에 필요한 것들이 많아 생각난 김에 업로드

생활코딩 Docker 입문수업

목차

  1. Docker 소개
  2. Docker 설치
  3. 이미지 Pull
  4. 컨테이너 run
  5. 네트워크
  6. 명령어 실행
  7. 호스트와 컨테이너의 파일시스템 연결

1. Docker 소개

애플리케이션을 만들기 위해서는 OS운영체제에 Webserver와 Database 등을 깔아야 함

근데 여간 까다로운게 아닌데, 원래 이렇게 깔려져 있는 것이 있다면 얼마나 좋을까?

→ 하나의 컴퓨터에 가상의 컴퓨터를 만들고, 그위에 운영체제를 설치하고, 거기에 웹서버를 설치하면 어떨까? 별도의 컴퓨터를 장만하지 않아도 되잖아? → Vmware, Virtualbox가 바로 이런것

→ 그치만 웹서버를 위해 운영체제를 깔아야하는게 돈과 용량이 넘 아깝고, 운영체제 위에 운영체제가 있으면 실행속도가 느려져

→ 그렇다면 한대의 컴퓨터 안에서 각각의 앱을 실행(앱, 웹서버, 데이터베이스), 이를 격리된 환경에서 실행하면 어쩔까?

  • 이떄 운영체제가 설치된 컴퓨터를 host
  • host에서 실행된 각각의 격리된 환경을 container
  • 각각의 컴퓨터에는 운영체제가 설치된 것이 아니고, 앱을 실행하는데 필요한 lib(라이브러리)와 bin(실행파일)만 포함되어있음.

→ 이미 존재하는 운영체제를 공유하니 각각 설치할 필요도 없고, 운영체제가 하나라서 속도도 느려지지 않음

운영체제를 다시 설치할 필요가 없으니 시간도 절약, 용량도 아낄수있음

→ Linux 운영체제에는 이렇게 환상적인 앱 실행방법이 내장되어있음 → 바로 Container

Container 실행을 해주는 것 중 가장 잘나가는 것이 바로 Docker!

2. Docker install

Dokcer는 Linux운영체제의 기술

  1. Docker 위에서 돌아가는 Container, Container 안에서 동작하는 각각의 App들은 Linux 운영체제에서 동작하는 App들임
  2. 만약 자신의 컴퓨터가 Linux 운영체제가 아니라면, 도커를 쓸 수 없나? 그렇지 않다.→ 복잡 까다로워보이지만, docker가 알아서 가상머신을 만들어주고 그 위에 Linux를 설치해줘서 복잡할게 하나도 없음
  3. → 윈도우나 맥OS라고 하면, 가상머신을 깔고, 그 가상머신에 Linux 운영체제를 깔면 Linux 운영체제 위에서 docker와 같은 Container기술을 사용할 수 있음

https://www.docker.com/ 에서 docker 설치!

3. 이미지 Pull

앱스토어를 통한 도커설명!

Appstore에서 Program을 찾음 → Dockerhub에서 필요한 Registry를 찾음

앱스토어에서 다운받은 Program → Dockerhub에서 찾아낸 것을 컴에 다운해서 가지고 있는 것 = Image

Program을 실행하면 Process 동작 → Image를 실행하는 것 = Container

프로그램은 여러 프로세스가 있고, 이미지에는 여러 컨테이너가 있음

  • 도커허브에서 이미지를 다운받는 것 = Pull
  • 이미지를 실행하는 것 = Run
  • (이미지가 컨테이너가 되고 컨테이너가 실행되면서, 컨테이너 안에 포함되어 있는 프로그램이 실행됨)
  • 도커허브에서 필요한 이미지를 다운받기
  • https://hub.docker.com/ 도커 허브에 방문하여 원하는 것 다운
  • 간단한 실습을 위해 httpd 다운받기!
  • https://hub.docker.com/_/httpd

terminal에서 docker pull httpd 라는 명령어를 통해 이미지를 받을 수 있음

docker pull 매뉴얼, 참고하여 명령어 사용

https://docs.docker.com/engine/reference/commandline/pull/

이미지가 잘 다운받았는지 확인. 터미널에 docker images 입력하면 알 수 있음

docker images 

버전, 생성날짜, 용량이 모두 표시됨

docker dashboard에서도 바로 확인가능

4. 컨테이너 run

Run: 이미지를 컨테이너로 만드는것

dashboard에서 httpd에서 run을 누르면 끝, 관리가 쉽도록 이름만 잘 지어주기

  • ws1이라는 이름의 컨테이너를 만들어봄
  • 컨테이너가 실행되고, 프로세스도 러닝되기 시작
  • 클릭시 log도 확인가능 (컨테이너의 자세한 정보, 통계자료를 볼 수 있음)

실행되고있는 컨테이너는 컴퓨터의 자원을 쓰고있어서, 컨테이너를 끌 필요가 있음!

stop: 컨테이너 끄기, start: 컨테이너 켜기, delete: 컨테이너 삭제

terminal을 이용하여~ docker run 컨테이너를 만들때

docker run [Options] IMAGE [Command]

#IMAGE(이미지 이름)
#[]대괄호는 생략해도 되는 부분임
#[Command] 컨테이너에서 실행시키고 싶은 명령

docker 명령어들

docker run httpd
#httpd 기반으로 컨테이너 만들고, 실행되는 모습이 출력됨

docker ps
#우리가 만든 컨테이너들을 보여줌. 생성한 컴퓨터의 아이디, 생성 시간, 상태, 이름이 나옴

#하나의 이미지는 여러개의 컨테이너를 만들 수 있음
docker run --name ws2 httpd
#docker run --name 컨테이너이름(ws2) 이미지이름(httpd)
#httpd에 ws2 라는 컨테이너 생성! (httpd 에는 ws1도 생성되있는 상태)

docker stop 컨테이너이름(ws2)
#컨테이너 스탑하기

docker ps 
#상태 확인, 근데 이건 stop된 컨테이너는 안나옴

docker ps -a (all 이라는뜻)
#all을 이용하면 stop된 컨테이너까지 다 나옴

docker start 컨테이너이름(ws2)
#stop된 컨테이너를 다시 start
docker ps
#start 됐는지 확인, 근데 log가 잘 뜨지 않음

docker logs ws2 
#실시간 로그를 확인 가능, 근데 뜨다가 끊김. 실시간으로 끊기지 않고 보려면

docker logs -f ws2
#실시간 로그 확인가능

docker rm 컨테이너이름(ws2)
#컨테이너 삭제하기
#근데 현재 실행중인 컨테이너는 삭제할수 없음,무조건 컨테이너를 stop 하고 삭제!

#현재 실행중인 컨테이너를 한방에 삭제하고 싶을 경우
docker rm --force 컨테이너이름(ws2)
#이러면 stop 안해도 삭제 가능

#이미지를 삭제하는 법: 대쉬보드에서는 httpd(이미지) 누르고 리무브 하면 되는데
#커맨드에서는
docker images
#해당 명령어로 먼저 도커 이미지들을 확인 확인

docker rmi [Options]IMAGE[Command]
#위 명령어 이용
docker rmi httpd
#이렇게 하면 이미지가 삭제됨
docker rmi --force httpd
#나는 잘 안돼서 force로 삭제

docker images
#삭제 됐는지 이미지들 확인

5. 네트워크

도커없이 웹서버를 사용하려면?

→ 두대의 컴퓨터 필요 '웹브라우저가 설치된 컴퓨터'와 '웹서버가 설치된 컴퓨터'

→ 그 다음은? 웹페이지를 파일로 만들어서 웹서버가 설치된 컴퓨터의 저장장치안의 특정 디렉토리에 위치시켜야함

→ 파일시스템(=데이터가 저장된 공간) 내의 특정 디렉토리안에 index.html(웹페이지)을 위치시켜보자

→ 그리고 웹서버에게 누가 웹페이지를 요청하면 이 디렉토리에서 찾아야 해! 라고 설정해두자

→ 컴퓨터에는 65000개의 포트가 있고, 우리의 웹서버(아파치)는 80번 포트에서 접속을 대기하고 있도록 설정되어있음!

→ 웹서버가 설치된 컴퓨터의 주소는 example.com 으로 정해보자

→ 웹브라우저에서 http://example.com:80/index.html 80번 포트로 접속을 하면 웹서버가 대기중임 → 웹서버로 요청이 전달됨 → 웹서버가 디렉토리에서 index.html을 찾아서 웹브라우저로 전달

도커를 이용해서 웹서버를 이용하는 방법

$ docker run httpd

도커를 이용하면 웹서버가 컨테이너에 설치됨

  • 컨테이너가 설치된 운영체제는 도커 host
  • 하나의 도커 host 에는 여러개의 컨테이너가 만들어질수있음
  • 컨테이너와 호스트모두 독립적인 실행환경 = 독립적인 포트와 독립적인 파일시스템!

그렇다면 웹브라우저로 웹서버에 접속을 시도해보자

호스트의 80번 포트와 컨테이너의 80번포트를 연결해주자

$ docker run -p 80:80 httpd

앞에 80은 host포트, 뒤에 80은 container포트

웹브라우저에서 호스트에 80번으로 들어온 신호가 컨테이너의 80번 포트로 전송됨

→ 이렇게 연결된 포트로 신호를 전송하는 것을 port forwarding(포트포워딩)이라고 함 → 요청 신호가 웹서버로 전송이 되고 나머지 과정은 이전과 같음

포트가 8000으로 변경된다면, 이렇게 쓰면됨

$ docker run -p 8000:80 httpd

그렇다면 ws3이라는 새로운 컨테이너를 만들어보자!

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

host포트 8081로 들어오면 컨테이너의 80번 포트로 연결한다는 뜻

http://localhost:8001/index.html

위의 링크로 접속하면 정상 작동하는 것을 확인할 수 있고, 새로고침하면 로그도 계속하여 확인할 수 있음!

6. 명령어 실행

index.html을 편집해서 나의 웹, 앱을 만들려면?

컨테이너 안으로 들어가서 컨테이너를 수정할 수 있어야 함

방법 1: ws3의 cli로 접속 → 컨테이너 터미널로 접속

방법 2: command 에서 실행

docker exec [OPTIONS] CONTAINER Command [ARG..]

docker ps 
#현재 실행중인 프로세스 확인
docker exec ws3 /bin/sh #ws3의 shell이 켜짐. 근데 바로 꺼짐!
docker exec -it ws3/bin/sh #지속적인 연결을 위해서 -it 명령어 사용
docker exec -it ws3/bin/bash #bash쉘이 쓰기더 편하니까 bash로 접속

index.html 의 위치는 httpd 메뉴얼에 나와있음! (/usr/local/apache2/htdocs/)

해당 위치를 참고하여 index.html의 디렉토리(/usr/local/apache2/htdocs/)로 접속하기

apt update #html을 바로 수정할 수 없으니 nano를 사용하기 위해 apt 먼저 update
apt install nano #nano 설치
nano index.html #index.html을 수정할 수 있게됨!

해당 과정을 통해 index.html을 수정하면 수정한 결과가 http://localhost:8001/index.html 링크에 나타나는 것을 확인할 수 있음

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

도커의 파일시스템 안의 index.html을 수정했는데, 컨테이너가 사라진다면? 물거품이 될 것

컨테이너를 우리가 사용하는 이유는 필요할 때 언제든지 생성하고 지울 수 있는 것이 큰 이유!

컨테이너의 디렉토리(/usr/local/apache2/htdocs/)와 호스트의 디렉토리(/Desktop/htdocs)를 연결하고 호스트쪽의 수정이 이루어졌을때 그것이 컨테이너에 반영될 수 있다면, 컨테이너가 날라가도 우리의 소스코드는 여전히 남아있고, 파일의 버전관리가 쉬울것

실행환경은 컨테이너에게 맡기고, 파일을 수정하는 것은 호스트에서 하는 법을 알아보자

컨테이너의 파일 시스템과 호스트의 파일시스템을 연결

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

#호스트의 8888포트와 컨테이너의 80번포트연결
#-v : volume의 약자 

이 과정을 거치면 호스트에서 파일이 수정되고 노출되기 때문에 파일의 버전관리, 에디터(vscode등)로 코드편집 등이 모두 수월하게 진행된다!

반응형