선발대

[유튜브] 생활코딩 / Docker 입문수업 본문

공부/유튜브

[유튜브] 생활코딩 / Docker 입문수업

신선한 스타트 2022. 7. 3. 18:34
1. 수업소개


생활코딩 / Docker 입문수업

생활코딩 / Opentutorials

 

도커 컨테이너

 

운영체제, DB, 웹서버 등을 한 개발자가 다 설치하고 관리하려면 너무 힘들다.

누군가 대신 해줬으면 좋겠다.

 

각각 알맞은 운영체제 위에 설치된 웹서버 하나, 또 다른 운영체제 위에 설치된 DB 하나를

네트워크로 연결해서 사용하면 총 3개의 서버가 필요하게 됨. 낭비임.

 

하나의 컴퓨터에 가상으로 컴퓨터를 만들고, 그 위에 운영체제를 설치한 후에 웹서버 설치하면 어떨까?

운영체제 위에 또 운영체제가 나오니까 리소스도 부족하고 속도도 느려짐.

 

또 다시 새로운 기술 등장.

1대의 컴퓨터 내에서 각각의 앱을 실행함. 이 앱들은 격리된 환경에서 실행됨. 

이런 기술을 컨테이너이라고 함. 리눅스 운영체제에는 이미 이 기술이 내장되어 있음.

 

운영체제가 1개이니 속도도 안 느려지고 용량도 아낄 수 있음. 설치할 필요가 없으니 시간도 절약됨.

컨테이너 기술 중 제일 잘 나가는 게 도커임. 도커의 이용자가 되는 것이 수업의 목표임.

 

- host: 운영체제가 설치된 컴퓨터

- container: host에서 실행된 각각의 격리된 실행환경. 운영체제가 없고 앱 실행에 필요한 실행파일, 라이브러리만 있다.


2. 설치


설치 전 알아야 할 것

 

도커 위에서 돌아가는 컨테이너, 컨테이너 안의 앱들은 리눅스 운영체제에서 돌아가는 앱들임.

리눅스 운영체제가 아니라도 도커는 쓸 수 있다. 

가상머신에 리눅스 운영체제 설치하면 그 위에서 쓸 수 있음. 따로하면 복잡한데, 도커가 알아서 해준다.

 

운영체제가 리눅스면 그냥 도커 실행할 수 있으니까 성능은 상관없음.

윈도우, Mac이면 조금 성능저하가 있을 수는 있는데, 그래도 도커의 편의성이 더 커서 사용하게 됨.

 

도커 설치하고 cmd에서 docker images 명령어 쳐서 에러 없다면 잘 설치된 것임.

 

도커 공식홈페이지 (다운로드)


3. 이미지 pull


 

도커 공식문서 링크

 

Docker hub

app store에서 프로그램을 찾는 것과 동일.

docker hub라는 레지스트리 서비스에서 필요한 SW 찾음.

 

Image

app store에서 다운 받고 컴퓨터에 저장한 것을 program이라고 함.

docker hub에서 찾아내서 컴퓨터에 다운받아 저장한 것을 image라고 함.

 

Container

program을 실행하면 process라는 것이 동작함.

마찬가지로 image를 실행하는 것을 container라고 함.

program은 여러 process를 가질 수 있음.

마찬가지로 image도 여러 container를 가질 수 있음.

 

Pull

docker hub에서 이미지를 다운받는 행위

 

Run

image를 실행시키는 행위.

image가 container가 되고, container 안의 프로그램이 실행되면서 사용가능해짐.

 

 

Docker hub에서 image 다운 받기

 

공식 도커 홈페이지 링크

 

Explore - Container: 컨테이너 목록 볼 수 있음. 카테고리를 통해 분류해서 검색 가능.

Apache Web Server를 컨테이너 위에서 실행시키고 싶다면 도커 허브에서 httpd 검색.

official image는 도커에서 공식적으로 관리하는 이미지라는 뜻.

docker pull httpd: 옆에 명령어 나와있는데, 이걸 이용해서 다운 가능.

 

# httpd를 레지스트리로부터 다운로드 받기
docker pull httpd

# 이미지 잘 다운받았는지 확인하기
# REPOSITORY에 httpd 보이면 잘 다운받은 것임
# docker desktop에서도 확인 가능
docker images

4. 컨테이너 run


컨테이너와 이미지를 사용하는 기본적인 명령어 알아보기

 

run 명령어를 통해 이미지를 실행시켜서 컨테이너 만들기

# IMAGE: 실행시키고 싶은 이미지 이름
# COMMAND: 컨테이너 안에서 실행시키고 싶은 명령어
# [ ]는 전부 생략 가능

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

 

httpd 실행시켜 컨테이너 만들기

docker run httpd

 

실행시킨 컨테이너 목록 보기

docker ps

 

하나의 이미지는 여러 개의 컨테이너를 만들 수 있음

# --name: 컨테이너 이름을 지정하는 옵션
# 컨테이너 이름은 ws2로 지정했음

docker run --name ws2 httpd

# 확인하려면 아래 명령어 확인
dodcker ps

 

실행시킨 컨테이너 끄기

docker stop ws2 # 컨테이너 이름 대신 아이디 입력해도 괜찮음

# 꺼졌나 확인해보기 (아래 입력하면 안 나온다)
docker ps

# 꺼진 컨테이너도 확인하기
docker ps -a

 

컨테이너 다시 켜기

# run이 아니라 start임
docker start ws2

# 중지시킨 컨테이너 다시 실행시켰지만 로그가 뜨지 않음.

# 로그 확인하는 명령어
docker logs ws2

# 변화하는 로그 확인하기
docker logs -f ws2

 

컨테이너 삭제하기

docker rm ws2

# 실행중인 컨테이너는 삭제할 수 없음
# 컨테이너를 stop 하고 rm(삭제)해야 함
# 바로 삭제하고 싶다면 아래 명령어 입력

docker rm --force ws2

 

이미지 지우기

docker rmi httpd

5. 네트워크


Docker 없이 웹 서버 사용하는 방법

 

Docker 없이 웹 서버 사용하는 방법

 

2대의 컴퓨터가 필요함. 각각 브라우저, 웹 서버가 설치되어 있음.

 

웹 브라우저에서 주소 입력하고 엔터 누르면, 80번 포트로 example.com에 접속함.

포트는 약 65000개까지 엄청 많다.

80번 포트에는 웹 서버가 대기하고 있음. 웹 서버로 요청이 전달됨.

웹 서버는 파일 시스템의 지정된 경로에서 index.html을 찾음.

 

index.html 파일을 읽어서 웹 브라우저에게 index.html 을 전달함.

 

 

Docker로 웹 서버를 사용하는 방법

 

Docker로 웹 서버를 사용하는 방법

 

도커 사용하면 웹 서버가 컨테이너에 설치됨. (컴퓨터 2대 아니어도 괜찮다)

컨테이너가 설치된 운영체제는 도커 Host라고 부른다.

도커 Host에는 여러 개의 도커 컨테이너가 설치될 수 있음.

 

컨테이너, 호스트 모두 독립적인 실행환경이기 때문에 각자 독립적인 포트와 파일 시스템을 가짐.

따라서 호스트와 컨테이너의 포트를 연결해주는 작업이 필요함.

이게 포트 포워딩(Port Forwarding)임.

 

docker run -p 80:80 httpd

# 앞의 80은 Host의 포트, 뒤의 80인 컨테이너의 포트
# Host의 80번으로 들어온 신호는 컨테이너의 80번 포트로 전송됨

 

사용해보기

 

1. Apache image 다운로드

docker pull httpd


2. 포트 포워딩: localhost 8081번 포트 >> ws3의 80번 포트

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


3. 포트 포워딩: localhost 8082번 포트 >> ws2의 80번 포트

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

 

4. 웹 브라우저 검색창에 localhost:8080 입력하면 나타남.


6. 명령어 실행


index.html 수정하려면 컨테이너 안으로 들어가서 컨테이너 수정해야 함.

 

도커 데스크톱에서 수정하기

 

1. CLI 버튼 누르면 터미널이 실행됨

pwd

# 이거 입력하면 컨테이너에서 명령어를 실행한 것임. 컨테이너 안에 들어왔다
# 현재 위치 확인 가능

 

커맨드 라인에서 실행하기

 

docker exec 명령어를 사용함

docker exec ws3 pwd

# 내가 선택한 컨테이너 ws3
# pwd는 실행시키고 싶은 명령어임. (원하는 명령어로 변경)
# 컨테이너에서 pwd를 실행한 결과가 출력됨

 

컨테이너와 연결을 지속적으로 유지하며 명령어 입력하고 싶을 때

docker exec -it ws2 /bin/sh

# 쉘 프로그램: 사용자가 입력한 명령어를 쉘 프로그램이 받아서 운영체제에 전달하는 역할을 함. (창구)
# -it 붙여야지 연결 안 끝남. (이해하려면 복잡하니, 연결 지속하려면 -it 붙여야 한다는 것만 기억)

 

연결 끊기

exit

# 연결 끊고 나가면 이제 컨테이너가 아니라 host 대상으로 명령어 적용됨

 

sh는 기능이 부족하기 때문에 주로 bash를 많이 사용한다.

# 컨테이너에 따라 bash가 없는 경우도 있기 때문에 알아서 쓰기

docker exec -it ws2 bin/bash

 

index.html 파일 수정하기

 

apache 웹 서버 매뉴얼 페이지에서 index.html 파일의 경로를 알 수 있음.

아래의 경로에 사용자가 요청한 웹 페이지를 보관하도록 정해졌다는 정보를 준다.

ws2 컨테이너에 접속하기

docker exec -it ws2 /bin/bash

 

위의 매뉴얼의 경로로 이동함

cd /usr/local/apache2/htdocs/

 

이동한 경로에서 파일을 조회하면 index.html 파일을 확인할 수 있음

ls -al

 

nano 설치

# 컨테이너는 용량이 작아서 vim, nano 같은 에디터가 없음. 업데이트하고 따로 설치해준다.

apt update

apt install nano

 

nano 에디터로 index.html을 수정함

# 경로에 index.html이 바로 있으므로 nano로 편집할 수 있음

nano index.html

 

index.html을 아래 내용으로 수정함.

<html><body><h1>Hello, Docker!</h1></body></html>

# 다 수정했다면, ctrl + x, y, enter 누르고 빠져나온다

 

브라우저에 접속하면 변경된 화면을 확인할 수 있음. 와우 신기해


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


위에서는 docker 안의 파일을 직접 수정했다.

그렇지만 이렇게 파일을 수정했는데, 컨테이너가 사라진다면? 작업내용은 물거품이 된다.

하지만 컨테이너의 장점은 필요할 때 생성하고 필요 없을 때 언제든 삭제할 수 있다는 점임.

따라서 컨테이너를 애지중지 보관하는 건 어렵다.

 

컨테이너의 /usr/local/apach2/htdocs/ 디렉토리 & host의 /Desktop/htdocs/ 디렉토리를 연결함.

그리고 host 쪽에서 수정이 일어났을 때 그게 컨테이너 파일 시스템에 연동되면,

컨테이너 날라가도 소스코드는 연동된 host에 남아있으므로 안전하게 개발 가능. 파일 버전 관리도 용이.

 

 

실행환경은 컨테이너에게 맡기고, 파일 수정작업은 host에서 진행하는 법 익히기

 

연결하고 싶은 경로에 index.html 파일 생성, vscode에서 생성 후 터미널 열고 아래 명령어 입력

docker run -p 8888:80 -v C:\htdocs:/usr/local/apache2/htdocs/ httpd

# -v 옵션: volume의 약자임
# 호스트의 C:htdocs 디렉토리 & 컨테이너의 /usr/local/apache2/htdocs/ 디렉토리 연결함

 

host에 있는 파일을 vscode에서 수정하면 곧바로 브라우저 화면(연결된 컨테이너 파일시스템)에도 반영된다. 


8. 수업을 마치며


지식지도 서말

 

 

 

참고한 블로그

 

블로그에 강의 정리가 잘 되어있어서 글을 보고 이해한 다음, 강의를 논스탑으로 들었다.

https://spacebike.tistory.com/41

 

[Docker] 생활코딩 도커 입문수업 정리

도커 소개 컴퓨터에서 어떤 애플리케이션을 만들기 위해서는 운영체제에 웹 서버나 데이터베이스 같은 소프트웨어를 깔아야 한다. 이러한 소프트웨어를 설치하는 일은 귀찮고 까다로운 일이다

spacebike.tistory.com

 

Comments