1. 도커
1.1 도커란
- 데이터 또는 프로그램을 격리
- 컨테이너 관리
- 도커 엔진
- (도커 컨테이너) 이미지 ⇒ 컨테이너 ⇒ 이미지
- 리눅스 기반, 컨테이너에서 실행되는 프로그램도 리눅스용 프로그램
1.2 서버와 도커
기능적 의미의 서버 vs. 물리적 의미의 서버
- 컨테이너를 이용하면 여러 가지 서버 기능을 안전하게 함께 실행 가능 ← 격리
자유로이 옮길 수 있는 컨테이너
- 개발 측면에서 이점: 개발 시의 환경을 운영 시스템으로 그대로 옮길 수 있음
- 물리적 환경 차이 및 서버 구성의 차이를 무시 가능: 개발 서버와 운영 서버의 환경 차이로 인한 문제를 방지할 수 있음
도커 vs. 가상화 기술(Virtualization)
2. 도커 동작 원리
2.1 도커의 구조
- 호스트 컴퓨터 + 호스트(서버) 운영체제 + 도커 엔진 + 컨테이너들
- 프로그램 및 데이터는 컨테이너에 위치
컨테이너 안에는 리눅스 비슷한 무언가가 들어있다.
전체 리눅스 운영체제가 아닌 커널을 제외한 주변 부분이 컨테이너에 위치
- 커널은 호스트 운영체제(리눅스)를 사용
- 컨테이너가 가볍다
WSL2
2.2 도커 허브와 이미지, 컨테이너
- 이미지로부터 컨테이너를 생성
- 하나의 이미지로부터 여러 개의 컨테이너 생성 가능 ⇒ 이 컨테이너들은 완전히 똑같다
- 컨테이너로부터 이미지 생성 가능
- 도커 엔진 간에 컨테이너 이동 가능
cf.) CRI (Container Runtime Interface)
도커 허브
2.3 도커 컨테이너의 생명주기와 데이터 저장
도커 컨테이너: 쓰고 버리는 일회용품
- 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식
- 따라서 계속 유지해야하는 설정 파일, 데이터 파일 등은 별도의 컨테이너에 유지
컨테이너 생명주기(Container Life Cycle)
- 컨테이너 생성 ⇒ 실행 ⇒ 종료 ⇒ 폐기 ⇒ 생성
데이터 저장
- 데이터를 컨테이너에 저장하면 컨테이너 폐기 시 데이터도 함께 폐기되는 문제
- 해결책: 데이터는 컨테이너 외부에 저장
- 호스트(물리적 서버)의 저장소(디스크)를 컨테이너에 마운트
- 데이터만 저장하는 컨테이너(도커 볼륨)를 운용 → 도커 볼륨을 컨테이너에 마운트
- 위 해결책을 이용하면 컨테이너 간 데이터 공유 가능
2.4 도커의 장점과 단점
여러분들이 찾아서 정리해 보세요
도커의 주용도
- 팀원 모두에게 동일한 개발환경 제공하기
- 새로운 버전의 테스트
- 동일한 서버가 여러 대 필요한 경우
3. 도커 환경설정
3.1 도커 설치
1. 윈도우 돋보기 클릭 ⇒ Windows 기능 켜기/끄기 검색
- ‘리눅스용 Windows 하위 시스템 ‘ 체크
- ‘가상 머신 플랫폼’ 체크
- 확인 클릭
2. 재부팅
3. WSL2 설치
: https://learn.microsoft.com/ko-kr/windows/wsl/install
: https://learn.microsoft.com/ko-kr/windows/wsl/setup/environment
short-circuit evaluation, short-cut evaluation
: https://en.wikipedia.org/wiki/Short-circuit_evaluation
4. 컨테이너를 실행해 보자
4.1 도커 엔진 시작하기/종료하기
- 도커 엔진은 컴퓨터를 켰을 때 자동으로 실행할 수 있지만 컨테이너는 그렇지 않다.
4.2 컨테이너의 기본적인 사용 방법
cf) parameters vs. arguments = 매개 변수 vs. 인자, 인수
4.3 컨테이너의 생성, 삭제, 실행, 정지
- 컨테이너 생애주기
- 동작 중인 컨테이너를 바로 삭제할 수 없다. (정지 후 삭제)
cf.) 한 번만 실행되는 컨테이너 vs. 데몬 형태로 동작하는 컨테이너
4.4 컨테이너의 통신
4.5 컨테이너 생성에 익숙해지기
MySQL 컨테이너 생성
- docker run –name mysqlserver -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql
4.6 이미지 삭제
5. 여러 개의 컨테이너를 연동해 실행해 보자
- 여러 개의 컨테이너를 이용한 워드프레스 사이트 구축 예제
- 여러 컨테이너가 연결되려면 가상 네트워크가 필요하고 이 가상 네트워크가 도커 네트워크이다.
- docker network 생성
$ docker network create wpnet1
$ docker run --name mysqlwp -d --net=wpnet1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress2023 -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
brew install nginx
docker run --name apache -p 8081:80 httpd -d
docker pull nginx
docker images
http://localhost:8080/
5. 컨테이너 생성에 익숙해지기
도커 설치하기
https://happylie.tistory.com/78
WSL에서 Docker 설치하는 방법
https://www.lainyzine.com/ko/article/how-to-install-docker-on-wsl/
맥에서 우분투 실행하기
https://gymdev.tistory.com/75#google_vignette
01. 도커란 무엇인가?
1. 도커란 무엇인가?
도커
- 도커는 '데이터 또는 프로그램을 격리시키는' 기능을 제공하는 소프트웨어
- 주로 서버에 사용됨
- 도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능 제공
- 운영체제 통째로 격리하는 기능
컨테이너와 도커 엔진
- 코스트코의 조립형 창고같은 곳에 데이터나 프로그램을 둔다고 생각
- 이 조립형 창고를 컨테이너라고 하고, 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커
- 도커 사용하기 위해서는 sw인 도커 엔진 설치해야함
- 도커 엔진 위해서 컨테이너 생성 및 구동 가능한 것
컨테이너를 만들기 위해서는 이미지가 필요
- 컨테이너의 빵틀과도 같은 역할을 할 이미지가 필요
- 이미지는 소프트웨어 종류에 따라 다양하게 사용됨
- 아파치 컨테이너 -> 아파치 이미지, MySQL -> MySQL 이미지
- 컨테이너는 여러 개 만들 수 있음
도커는 리눅스 컴퓨터에서 사용됨
- 리눅스에서 구동됨
- 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램
- 어떤 형태로든 리눅스 운영체제 개입되는 것
데이터나 프로그램을 독립된 환경에 격리해야 하는 이유
- 대부분의 프로그램은 프로그램 단독으로 동작하지 않고, 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작함
- 소프트웨어 역시 여러 개의 프로그램으로 구성됨
- 또한 다른 프로그램과 특정한 폴더 또는 디렉터리 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있음
- 이렇게 프로그램 하나 업데이트하면, 다른 프로그램에도 영향 미치게 됨
- 프로그램간의 공유 때문에 오류 일으키는 경우가 많음
프로그램의 격리란?
- 도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경
- 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태
- 도커 컨테이너를 사용해 프로그램을 격리하여 의존성에서 발생하는 문제 해결 가능
2. 서버와 도커
서버의 두 가지 의미
- 서버는 이름 그대로 어떤 서비스를 제공하는 것
- 기능적 의미의 서버
- 무슨무슨 서버 = 무슨 무슨 기능을 제공한다는 뜻
- 웹 서버 = 웹 기능 제공, 메일 서버 = 메일 기능 제공
- 물리적 컴퓨터로서의 서버
- 실물을 말함
- 서버 역시 데스크탑과 마찬가지로 어딘가에 물리적으로 존재하는 컴퓨터
- 서버는 여러 사람이 원격으로 접근해 사용한다는 점이 다를 뿐
- 서버의 기능은 소프트웨어가 제공함
- 이 말은 여러 가지 소프트웨어를 한 컴퓨터에 설치할 수도 있다는 말
- 서버의 운영체제로는 주로 리눅스가 사용됨
컨테이너를 이용해 여러 가지 서버 기능을 완전하게 함께 실행하기
- 컨테이너 기술을 이용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올리면 여러 문제가 생김
- 컨테이너 활용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있음
자유로이 옮길 수 있는 컨테이너
- 컨테이너는 어떤 도커 엔진에서 다른 도커 엔진으로 옮기기 가능
- 이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발 환경 사용 가능
- 물리적 환경의 차이, 서버 구성의 차이 무시 가능하므로 환경 차이로 인한 문제 방지 가능
02. 도커의 동작 원리
1. 도커의 동작 원리
도커의 구조
- 일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가지만
- 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작함
- 컨테이너 안에는?
- 운영체제가 하는 일은?
- 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 함
- 본래 운영체제는 '커널'+'그 외의 주변 부분'
- 주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.
- 도커에서는 '주변 부분'이 컨테이너 속 명령을 전달받을 수 없다.
- 따라서 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 커널에 전달하는 구조로 되어있음
- 전체 리눅스 운영체제가 들어있는 것이 아니기 때문에 비슷한 것이라고 표현
도커는 기본적으로 '리눅스'용이다.
- 리눅스 운영체제가 동작하는 것을 전제로 하기 때문에 리눅스에서만 동작
- 따라서 컨테이너 안에 들어 있는 주변 부분도 리눅스의 주변 부분
- 즉, 도커는 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이며, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램도 리눅스용 프로그램
- 도커를 사용하려면 어떤 형태로든 리눅스 운영체제를 갖춰야 함
2. 도커 허브와 이미지, 그리고 컨테이너
이미지와 컨테이너
- 컨테이너 생성 위해서는 이미지가 필요
- 이미지 = 컨테이너 찍어내는 '빵틀' = 컨테이너의 설계도
- 우리는 이미지를 사용하는 것이 아니라 컨테이너를 사용함
- 컨테이너로도 이미지를 만들 수 있음
- 동일한 컨테이너 여러 개 만들지 않아도 다른 물리 서버에 설치된 도커 엔진으로 컨테이너 이동 가능
- 도커 엔진만 설치되어 있으면 구동 가능하므로 다른 서버나 컴퓨터에 도커 엔진을 설치하고 새로운 도커 엔진에 이미지를 이용해 똑같은 컨테이너 생성 가능
도커 허브와 도커 이미지
- 이미지는 '도커 허브'에서 구하게 됨
- 공개된 컨테이너 이미지가 모여 있는 곳
- 어떤 이미지?
- 운영 체제만 들어있는 이미지부터, 여러 가지 소프트웨어가 함께 포함된 것까지 다양한 이미지 제공됨
- 같은 소프트웨어도 다양한 변종의 이미지 제공됨
- 안전한 이미지 선택해야함
- 컨테이너는 다양한 형태로 조합 가능함
- 이미지 선택 외에도 다양한 조합 고려해야 함
- 도커 원칙 중 '한 컨테이너에 한 프로그램'
- 보안 및 유지 관리 측면에서 유리함
- 프로그램 여러개 한 컨테이너에 넣을 수도, 한 컨테이너에 하나의 프로그램 넣을 수도 있음.
3. 도커 컨테이너의 생애주기와 데이터 저장
도커 컨테이너는 '쓰고 버리는'일회용품
- 컨테이너의 수명, 생애주기와 연관됨
- 컨테이너는'쓰고 버리는'일회용품 같은 것
- 새로운 버전이 나오면 업데이트 보다는 새로운 컨테이너로 갈아타는 것이 좋음
- 여러 개의 컨테이너를 가동하는 것이 일반적인데, 하나하나 업데이트 하기보단 그냥 새로운 컨테이너 만드는 것이 낫다.
- 컨테이너의 생애주기
- 만들고
- 실행하고
- 종료하고
- 폐기한 다음
- 다시 컨테이너를 만드는 일련의 과정
데이터 저장
- 컨테이너 폐기 시 안에 들어있던 데이터는?
- 도커가 설치된 쿨리적 서버(호스트)의 디스크를 마운트해 이 디스크에 데이터를 저장함
- 마운트
- 디스크를 연결해 데이터를 기록할 수 있도록 한 상태
- 우리가 USB 연결하듯 도커 컨테이너도 디스크 연결해 데이터 기록 가능
- 데이터를 외부에 저장하면 다른 컨테이너와도 공유할 수 있기 때문에 편리함.
4. 도커의 장점과 단점
도커의 구조와 성질 및 그 장단점
- 환경을 격리할 수 있다는 것이 핵심
- 독립된 환경
- 이미지를 만들 수 있다.
- 컨테이너에 커널을 포함시킬 필요가 없기 때문에 가볍다.
도커의 장단점
- 장점: 여러 개, 이동성, 생성, 보안
- 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
- 서버 관리가 용이하다
- 서버 고수가 아니어도 다루기 쉽다.
- 단점
- 리눅스용 소프트웨어만 지원
- 물리 서버 한 대에 여러 대의 서버 -> 호스트 서버에 문제 생기면 모든 컨테이너 영향
- 컨테이너 여러 개 사용 시 장점을 느낄 수 있음
도커의 주 용도
- 팀원 모두에게 동일한 개발환경 제공하기
- 새로운 버전의 테스트
- 격리된 환경 이용하기 위함
- 새로운 버전을 먼저 개발환경에서 테스트한 후 운영환경에 적용할 때도 컨테이너 활용 가능
- 물리 서버와의 상성 고려하지 않아도 되고 변경된 환경에 대한 테스트에도 용이함
- 동일한 서버가 여러 대 필요한 경우
- 컨테이너 밖과 독립된 성질을 이용
- 동일한 서버가 여러 대 필요한 경우에도 컨테이너를 이용해 한 대의 물리 서버에 똑같은 서버 여러 개 만들 수 있음