그림과 실습으로 배우는 도커 & 쿠버네티스
태그: 개발, 인프라
1. 도커란 무엇인가?
1) 도커란 무엇인가?
#도커란
- 도커란
- 도커는 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어
- 주로 서버에 사용된다.
- 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공. 운영체제 비슷한 것을 통째로 격리함
- 컨데이터와 도커
- 독립된 창고 = 컨테이너에 데이터나 프로그램을 두는 것
- 도커는 컨테이너를 다루는 기능을 제공하는 소프트웨어
- 도커 엔진을 사용하여 컨테이너를 생성하고 구동시킬 수 있다
- 컨테이너, 이미지
- 컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵틀과도 같은 역할을 하는 이미지가 필요하다
- 이미지를 활용하면 컨테이너를 여러 개 만들 수 있다.
- 리눅스 컴퓨터
- 도커는 종류와 상관없이 리눅스 운영체제가 필요하다
- 컨테이너 안에서 동작시킬 프로그램도 리눅스용 프로그램이다
#필요성
- 독립된 환경에 격리해야 하는 이유
- 대부분의 프로그램은 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다
- 소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다.
- 프로그램 하나를 업데이트하면 다른 프로그램에도 영향을 미치게 된다.
- 서버에서는 여러 프로그램이 함께 동작하므로 서버를 처음 구축할 때부터 신중하게 따져보아야 한다.
- 프로그램의 격리란?
- 도커 컨테이너는 다른 컨테이너와는 완전히 분리된 환경
- 따로 격리하여 운영하면 된다
- 도커 컨테이너는 완전히 독립된 환경이므로, 여러 컨테이너에서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다.
2) 서버와 도커
- 도커와 연관되는 부분을 중심으로 서버가 무엇인지 설명
- 서버에서 사용하는 것이 도커의 주 목적
서버란
- 서버의 의미
- 서버란 어떤 서비스를 제공하는 것을 의미한다
- 물리적 컴퓨터로서의 서버
- 웹 서버, 메일 서버가 죽었다.
- 서버는 데스크톱 컴퓨터와 같이 어딘가에 물리적으로 존재하는 컴퓨터
- 물리적 컴퓨터로서의 서버에 여러 개의 기능적 의미의 서버를 함께 둘 수 있다
- 서버는 여러 사람이 원격으로 접근해 사용하는 컴퓨터
- 운영체제 위 소프트웨어를 실행함
- 한 가지는 기능적 의미의 서버
- 물리적 컴퓨터로서의 서버
- 서버란 어떤 서비스를 제공하는 것을 의미한다
- 서버의 대표적인 예
- 웹 서버, 메일 서버, 데이터베이스 서버, 파일 서버, dns 서버, dhcp 서버, ftp 서버, 프록시 서버, 인증 서버
- 프록시 서버 → 통신을 중재하는 서버의 통칭
- 서버의 특징
- 서버의 운영체제로는 주로 리눅스가 사용된다
도커란
- 도커 환경에서 컨테이너를 사용하면, 프로그램을 완전히 격리시킬 수 있다
- 예산이 부족해서 한 대의 서버에서 웹 서버, 메일 서버, 시스템 서버, DB 서버를 운용할 때, 도커를 활용하면 각 서버를 독립적인 환경에서 안전하게 운용할 수 있을 것이다.
- 물리 서버의 수를 줄일 수 있다. 두 웹 서버를 하나의 물리 서버를 함께 올릴 수 있다.
- 컨테이너는 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특징이 있다.
- 실제로는 컨테이너 자체를 옮기는 것 X
- 컨테이너의 정보를 내보내기 하고, 다른 도커 엔진에서 복원하는 형태
- 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다
- 도커를 통해 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있음
- 도커와 가상화 기술의 차이
- 가상화 기술 → VirtualBox, VMware, 가상의 물리 서버를 만드는 것과 같음
- 메인보드, CPU, 메모리 등 물리적인 부품을 소프트웨어로 구현
- 도커 → 실행 환경을 독립적으로 격리한 컨테이너
- 컨테이너에서 리눅수가 동작하는 것’처럼’ 보임
- 컨테이너는 운영체제의 일부 기능을 호스트 컴퓨터에 의존한다
- 도커, AWS EC2
- EC2 → 가상화 기술, 각각의 인스턴스가 독립된 컴퓨터처럼 동작한다
- 가상화 기술 → VirtualBox, VMware, 가상의 물리 서버를 만드는 것과 같음
2. 도커의 동작 원리
- 도커의 동작 원리
1) 도커의 동작 원리
- 도커, 컨테이너는 서버에서 사용된다
- 믈리 서버 → 운영체제 → 프로그램, 데이터
- 물리 서버 → 운영체제 → 도커 엔진 → 컨테이너 → 프로그램, 데이터
- 컨테이너 안에는 운영체제 ‘비슷한 것’이 들어있다
- 최소한의 컨테이너에도 ‘리눅스 운영체제 비슷한 무언가’가 딸려 나온다.
- cf) 운영체제가 하는 일
- 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다
- 도커 엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제가 있다.
- 본래 운영체제는 커널과 그 외 주변 부분으로 구성된다.
- 주변 부분 → 명령을 전달받거나 커널이 실행한 결과를 프로그램에 다시 전달하는 역할
- 컨테이너가 완전히 분리되어 있어서 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너 속 프로그램 명령을 전달받을 수 없다.
- → 컨테이너 속에는 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 되어 있음
- 결과 ⇒ 가벼움
- 도커는 기본적으로 ‘리눅스용’이다
- 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 한다
- 컨테이너에서 실행할 소프트웨어 역시 리눅스용 소프트웨어임
- 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이다
- → 근데 어떻게 윈도우에 도커 데스크탑이 있는거지..?
- 도커 데스크톱은 도커를 실행하는 데 필요한 리눅스 운영체제를 포함하고 있다.
- 워드, 엑셀 등은 도커에서 실행 불가능함
2) 도커 허브와 이미지, 그리고 컨테이너
- 이미지 → 컨테이너를 만드는 ‘빵틀’
- 허브 → 도커 이미지를 모아놓은 인터넷 상의 공간
이미지
- 이미지는 컨테이너를 만드는 데 사용한다. 빵틀 같은 역할임.
- 컨테이너의 설계도
- 실제 사용하는 대상 → 컨테이너(like 로봇 장난감)
- 하나만 있으면 똑같은 것을 여러 개 만들 수 있다.
- 도커 파일을 빌드하여 이미지를 만든다
- 컨테이너로도 이미지를 만들 수 있다
- 컨테이너로부터 이미지를 만들 수 있기 때문에
- 새로 만든 이미지를 사용해서 개조된, 준비된 이미지를 만들기 쉬워진다
- (이를 통해) 도커 엔진 간에 이동이 가능하다
- 동일한 컨테이너를 여러 개 만들지 않더라도 이러한 특성을 이용해서 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다.
- 즉, 컨테이너로부터 만든 이미지를 이용해서 다른 환경에서 원래의 컨테이너를 복원할 수 있다.
허브
- 도커 허브 → 공식적으로 운영되는 도커 레지스트리의 이름
- 공개된 컨테이너 이미지가 모여있는 곳
- 운영체제 비슷한 것 / 소프트웨어가 포함된 이미지 / 여러 개 포함된 이미지 등
- 안전한 이미지를 고르는 법
- 공식 이미지를 사용한 것
- 커스텀 이미지를 직접 만들어 사용한다
- 다양한 조합
- 도커 사용 원칙 중 하나 → 한 컨테이너에 한 프로그램
- 보안 및 유지 관리 측면에서 유리하다
- ex) 워드프레스 구축
- 아파치, MySQL, 워드프레스 세 가지 필요
- 별도의 컨테이너로 구성하는 것을 추천함 → 유지보수, 도커의 장점을 누릴 수 있음
3) 도커 컨테이너의 생애주기와 데이터 저장
- 컨테이너의 수명 / 생애주기
- 컨테이너는 그때 그때 쓰고 버리는 일회용품에 가깝다
- 컨테이너는 쉽게 만들 수 있다.
- 컨테이너를 업데이트하기보다는 새로운 컨테이너를 사용하는 것이 좋다
- 컨테이너는 여러 개를 동시 가동하는 전제로 한다. → 하나하나 업데이트하기보다는 새로운 이미지에서 새로운 컨테이너를 만들어 갈아타는 방식을 더 사용한다
- 데이터 저장 → 호옹 이해 안감
- 컨테이너를 폐기하면, 해당 컨테이너 안에서 편집했던 파일은 사라진다
- 도커가 설치된 물리적 서버의 디스크를 마운트해 이 디스크에 데이터를 저장한다
- 컨테이너가 폐기되더라도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않는다
- 데이터는 다른 곳에 저장해두고 같은 것을 계속 사용함. 설정 파일도 삭제되지 않을 곳에 저장한다.
4) 도커의 장점과 단점
장점
- 환경을 격리할 수 있다
- 독립된 환경
- 이미지를 만들 수 있다
- 컨테이너에 커널을 포함시키지 않아도 된다(커널 포함 → 가상 머신, 주변 부분만 포함 → 도커)
단점
- 리눅스만 지원
- 물리 서버에 문제 생기면 모든 컨테이너에 영향
용도
- 팀원 모두에게 동일한 개발 환경 제공하기
- 새로운 버전의 테스트
- 동일한 서버가 여러 대 필요한 경우
3. 도커를 사용해보자
1) 도커를 사용하려면
도커 설치하기
- 도커를 설치, 기본적인 조작 방법을 익힌다
- 도커는 기본적으로 리눅스용이지만 윈도우와 macOS에서도 사용할 수 있다
- 도커 환경 구축 방법
- 리눅스 컴퓨터에서 사용하기
- 가상 머신에 도커 설치하기
- 윈도우용 / macOS용 도커 설치하기
- 윈도우용 macOS 도커 사용하기
- 리눅스 운영체제가 들어있는 패키지를 사용한다 → 도커 데스크톱
- 실행 환경이 추가로 필요함 → 도커 엔진 + 리눅스 운영체제 + 가상환경(Hyper-V)
- 도커 데스크톱은 가상화 환경, 리눅스 운영체제를 신경쓰지 않고도 도커를 사용할 수 있다
- 일반적인 소프트웨어처럼 사용한다
- 설치가 간편함
- 가상화 소프트웨어, 리눅스 운영체제의 존재를 신경쓰지 않아도 된다
QNA
- 운영체제가 두 개라니 괜찮을까?
- 도커가 전용으로 사용하는 숨겨진 운영체제이다
- 도커 데스크톱을 사용하기 위한 조건
- 윈도우에서는 Hyper-V가 활성 상태여야 한다.
- 도커 데스크톱과 툴박스 버전의 차이
- 도커 데스크톱에서는 Hyper-V를 사용하는데, 툴박스에서는 VirtualBox를 사용한다
- WSL2는 무엇일까?
- 도커 제작사에서 만든 리눅스 운영체제를 사용하는 버전
- 마이크로소프트에서 만든 WSL2를 사용하는 버전
2) 도커 설치
- 설치 조건 → 64비트 운영체제
- 도커 데스크탑 설치 완료
3) 도커의 조작 방법과 명령 프롬프트 및 터미널 실행
- 명령 히스토리 찾기 → 커서 Up
- 명령 프롬프트를 종료해도 도커는 종료되지 않는다
- 도커 엔진과 터미널 소프트웨어는 완전히 별개의 소프트웨어
$ date
현재 날짜: 2023-06-17
$ exit
종료됨
4. 컨테이너를 실행해보자
- 실습을 통해 컨테이너 생성하고 삭제해보기
1) 도커 엔진 시작하기/종료하기
도커 엔진 → 컨테이너를 실행 중인 것이 아니라면 컴퓨터의 리소스를 거의 차지하지 않는다.
도커 엔진은 컴퓨터를 켰을 때 함께 자동으로 실행할 수 있지만, 컨테이너는 그렇지 않다(도커 엔진이 종료되면 모든 컨테이너는 정지 상태가 된다)
윈도우에서
- 자동 실행 설정 가능
리눅스
도커 엔진 시작 $ sudo systemctl start docker 도커 엔진 종료 $ sudo systemctl stop docker 자동 실행 설정 $ sudo systemctl enable docker
2) 컨테이너의 기본적인 사용 방법
컨테이너 사용의 기본은 도커 명령어
docker ~
명령어와 대상
docker container[상위 커맨드] run[하위 커맨드] penguin[대상]
옵션과 인자
docker container[상위 커맨드] run[하위 커맨드] -d[옵션] penguin[대상] --mode=1[인자]
기본적인 명령어
docker 커맨드 [옵션] 대상 [인자]
실습
간단한 명령어 실행해보기
도커의 버전 확인하기
> docker version Client: Cloud integration: v1.0.33 Version: 24.0.2 API version: 1.43 Go version: go1.20.4 Git commit: cb74dfc Built: Thu May 25 21:53:15 2023 OS/Arch: windows/amd64 Context: default Server: Docker Desktop 4.20.1 (110738) Engine: Version: 24.0.2 API version: 1.43 (minimum version 1.12) Go version: go1.20.4 Git commit: 659604f Built: Thu May 25 21:52:17 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.21 GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8 runc: Version: 1.1.7 GitCommit: v1.1.7-0-g860f061 docker-init: Version: 0.19.0 GitCommit: de40ad0
컨테이너 조작 관련 커맨드 (상위 커맨드 container)
- start
- stop
- create
- run
- rm → 컨테이너 삭제
- exec → 프로그램 실행
- ls → 컨테이너 목록
- cp → 파일 복사
- commit → 이미지로 변환
이미지 조작 관련 커맨드 (상위 커맨드 image)
- pull → 이미지를 내려받음
- rm → 이미지 삭제
- ls → 목록 출력
- build → 이미지 생성 (ex. dockerfile에서 이미지 생성)
볼륨 조작 관련 커맨드 (상위 커맨드 volume)
컨테이너는 휘발성 프로세스이기 때문에 컨테이너 내부의 데이터를 영구적으로 저장할 수가 없다
컨테이너에서 생성된 데이터를 영구적으로 보관하기 위해서 도커 볼륨을 사용하며 이를 통해 데이터를 보존하고 컨테이너 간에 파일 시스템을 쉽게 공유할 수 있다
create → 볼륨 생성
inspect → 상세 정보 출력
ls → 목록 출력
prune → 볼륨 삭제
rm → 지정 볼륨 삭제
네트워크 조작 커맨드 (상위 커맨드 network)
- connect → 연결
- disconnect → 해제
- create → 네트워크 생성
- inspect → 상세 정보 출력
- ls → 목록 출력
- prune → 접속하지 않은 네트워크 삭제
- rm → 지정한 네트워크 삭제
기타 등등
3) 컨테이너의 생성과 삭제, 실행, 정지
컨테이너 실행하기 → docker run
한꺼번에 수행하는 것이 docker run
컨테이너 생성 → docker create
컨테이너 실행 → docker start
이미지 내려받기 → docker pull
컨테이너 중지하기 → docker stop
컨테이너 삭제하기 → docker rm
docker ps → 컨테이너 목록 출력하기
실습
아파치 컨테이너 이미지를 받아서 실행하고 종료, 삭제하기 > docker run --name apa000ex1 -d httpd -d: 백그라운드 실행 httpd: 아파치 이미지 이름(default가 latest) > docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 607b9425a68f httpd "httpd-foreground" 24 seconds ago Up 23 seconds 80/tcp apa000ex1 > docker stop apa000ex1 apa000ex1 > docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES > docker rm apa000ex1 apa000ex1
4) 컨테이너의 통신
컨테이너를 생성하고 생성한 컨테이너에 접근하기
- 아파치는 웹 서버를 제공하는 소프트웨어
- 아파치가 동작 중인 서버에 파일을 두면, 이 파일을 웹 사이트 형태로 볼 수 있다.
- 웹 브라우저를 통해 컨테이너에 접근이 가능하게 하려면 설정이 필요하다
- docker run
웹 브라우저를 통해 컨테이너에 접근하려면 외부에 접근하기 위한 설정이 필요하다 → 이를 위해 포트를 설정한다.
- 아파치는 서버에서 정해둔 포트에서 웹 사이트에 대한 접근을 기다리다가 사용자가 이 포트를 통해 접근해오면 요청에 따라 웹 사이트의 페이지를 제공한다.
- 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
- 컨테이너를 사용하면 여러 개의 웹 서버를 함께 실행할 수도 있다.
실습 - 통신이 가능한 컨테이너 생성하기
step 1. run 커맨드 실행하기
> docker run --name apa000ex2 -d -p 8080:80 httpd ea1a1b2c3e7a741385680775b25c3d592eebc7c0f67803fc82873b3609c48a4e
step 2. 컨테이너 실행 중인지 확인하기
> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea1a1b2c3e7a httpd "httpd-foreground" 26 seconds ago Up 25 seconds 0.0.0.0:8080->80/tcp apa000ex2
step 3. 웹 브라우저를 통해 아파치에 접근할 수 있는지 확인
step 4. stop 커맨드를 통해 컨테이너 종료하기
> docker stop apa000ex2
step 5. rm 커맨드를 통해 컨테이너 삭제하기
> docker rm apa000ex2
step 6. ps 커맨드와 인자를 사용해 컨테이너가 삭제되었는지 확인
> docker ps -a
5) 컨테이너 생성에 익숙해지기
다양한 유형의 컨테이너 → 컨테이너 종류 매우 다양함
실습 → 아파치 컨테이너 여러 개 실행하기
호스트 컴퓨터의 포트 번호가 중복되어서는 안되지만
컨테이너 포트는 중복되어도 무방하므로 모두 80번으로 설정한다
step 1. run 커맨드 실행하기
> docker run --name apa000ex3 -d -p 8081:80 httpd b3895d717cc7190d8d14a266decf1514c720a0a7a811ea22c4995584926766f8 > docker run --name apa000ex4 -d -p 8082:80 httpd 1a1acb7a6392d8f02f5a0c728c1e02b885b0e24e6afb2a50fc8e1e5cfcf3f8bd > docker run --name apa000ex5 -d -p 8083:80 httpd 8c66b3d4ba324c956851a372825ead58c6a9a62c4f0f54218d59c0ac114fd151
step 2. ps 커맨드를 통해 컨테이너 실행 중인지 확인하기
> docker ps
step 3. localhost에서 접근하기
step 4. stop 커맨드로 컨테이너 종료하기
> docker stop apa000ex3
step 5. rm 커맨드로 컨테이너 삭제하기
> docker rm apa000ex3
step 6. ps 커맨드로 컨테이너 삭제되었는지 확인하기
> docker ps -a
실습 → Nginx 컨테이너 실행하기
step 1. run 커맨드 실행
> docker run --name nginx000ex6 -d -p 8084:80 nginx Unable to find image 'nginx:latest' locally
step 2. ps 명령어를 사용해서 컨테이너 실행 중인지 확인하기
> docker ps 0.0.0.0:8084(브라우저에 적는 주소)->80/tcp(서버에 접근하는 포트) CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 913f951a1a35 nginx "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:8084->80/tcp nginx000ex6
step 3. 웹 브라우저로 nginx에 접근할 수 있는지 확인하기
step 4. stop 커맨드를 활용해서 컨테이너 종료하기
> docker stop nginx000ex6 nginx000ex6
step 5. rm 커맨드를 활용해서 컨테이너 삭제하기
> docker rm nginx000ex6
step 6. ps 커맨드로 컨테이너 삭제되었는지 확인하기
> docker ps -a
실습 → MySQL 컨테이너 실행하기
step 1. run command 실행하기
-dit 백그라운드에서 실행 및 키보드를 통해 컨테이너 내부의 파일 시스템 조작하기
-e MYSQL_ROOT_PASSWORD 비밀번호 설정
> docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql Unable to find image 'mysql:latest' locally
step 2. ps 커맨드를 사용해서 컨테이너 실행 중인지 확인하기
- docker ps
step 3. mysql 서버에 접속하기
> docker exec -it mysql000ex7 bash bash-4.4# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.33 MySQL Community Server - GPL Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
step 4. docker stop mysql000ex7
step 5. docker rm mysql000ex7
step 6. docker ps -a
6) 이미지 삭제
컨테이너는 삭제해도 이미지는 남는다
- docker image rm
- docker image rm image_1 image_2 image_3
- docker image ls → 이미지 목록 확인하기
> docker image rm mysql
Untagged: mysql:latest
Untagged: mysql@sha256:15f069202c46cf861ce429423ae3f8dfa6423306fbf399eaef36094ce30dd75c
Deleted: sha256:91b53e2624b431e562ed9076a9a506c5e78387f2cb4dad5968fd51ade839baa1
Deleted: sha256:29fe1268c0126fd9958677211dc48660a1b1ab4ad95560a0974950feddafb488
Deleted: sha256:f271de7413df4881b2d3607b62453c1c06dd9064fc1d93c5b1d3608381b4b94d
Deleted: sha256:974dc031751c2282d328963dc22bfc52cc1cfca840091207026c3218d1b6dff0
Deleted: sha256:504a7a1d5454b3a4f46f81e2e25219d130302ffbdfe0f1cd0a161715f1926285
Deleted: sha256:cbfdbb307419ced9a481e2076c692a1e3ecb1da3e4069a8ea6486c2829e7d65d
Deleted: sha256:0cc534805f7a13b6a3e1c8853fc8e483c8805e8cfe7de93da140364f20627cb6
Deleted: sha256:6e01ff5e5d41ba0fdd448cef4d4acb3ca236ff967f93e14088232d6423ff8cd4
Deleted: sha256:c3e4c2eacde3a513df33b165fe0e0ee5a2b278c70f9e30545c6525891c116915
Deleted: sha256:3d55a06407299c38dc4b3ab7d5c9aeb050c7538121f9617fa3fb5fd3bc2af277
Deleted: sha256:91c495d5f32a501a8b966be1b97fbfc1df2810f7198de113b9b0d661c5e7714c
Deleted: sha256:fa499cc7379fed2c60f59713f71ddda8a68227be84f612f6c1d197e3da1bf4ae
> docker image rm httpd
Untagged: httpd:latest
Untagged: httpd@sha256:f499227681dff576d6ae8c49550c57f11970b358ee720bb8557b9fa7daf3a06d
Deleted: sha256:ad303d7f80f968a856f91e6216f8af2376d8b173f3d1d07ea11e2f810430c1af
Deleted: sha256:1f46fbfbddbded628a11bb9956b2ad6ffb7f1057a26a8db8cdab70aafa4e9711
Deleted: sha256:85584c93b7bc91601fd8721abf8c3be01bad5f59d7dcc6e1cb6c6d0f255c485f
Deleted: sha256:2d165a240b04629fb8b84078dc3a0dfcc80ac73ec697b881a2e54a1078e24c35
Deleted: sha256:e68a90e9f5b4315834c814466c5f26b24606d24fdc55d7e406e844c5bc3efe03
> docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247
Deleted: sha256:eb4a57159180767450cb8426e6367f11b999653d8f185b5e3b78a9ca30c2c31d
Deleted: sha256:387c6708d068d261ce5b1fe3e67323cbf64d8a37901f3d9742557f4abb830baf
Deleted: sha256:2946620cb422511c62ba67d12b1c16bbf6b85e6ce42e93a4dace94b4a70160b3
Deleted: sha256:f2545115e362a40e5b3fe057ad159aa9824f40a0e9341f4743b4d0c4f5322435
Deleted: sha256:9b3ff8c6f07faac480afaeecc0388a387f8cf92832de656a2d35e890340ac59a
Deleted: sha256:77366f15e73eef5c23ff7bd0be0c09f1b280c9586863232392c2d500eed148e7
Deleted: sha256:7447c8c6be248218804380a22d47c130f7efc16f31550cb446fc3cc91f98a54c
Deleted: sha256:ac4d164fef90ff58466b67e23deb79a47b5abd30af9ebf1735b57da6e4af1323
5. 여러 개의 컨테이너를 연동해 실행해보자
1) 워드프레스 구축
워드프레스 사이트 구성 및 구축
- 워드프레스가 동작하려면 여러 개의 컨테이너를 실행하고 가상 네트워크를 통해 컨테이너끼리 통신할 수 있어야 한다
- 워드프레스 → 웹 사이트를 만들기 위한 소프트웨어
- 워드프레스와 MySQL 데이터베이스와 연결
도커 네트워크 생성/삭제
워드프레스는 워드프레스 컨테이너와 MySQL 컨테이너로 구성
두 컨테이너는 가상 네트워크를 만들고 이 네트워크에 두 개의 컨테이너를 소속시켜야 한다.
docker network create
# 도커 네트워크 생성하기 docker network create network_name # 도커 네트워크 삭제하기 docker network rm network_name # 도커 네트워크 관련 커맨드 conenct 등
MySQL 컨테이너 실행 시에 필요한 옵션과 인자
워드프레스 컨테이너 실행 시 필요한 옵션과 인자
2) 워드프레스 및 MySQL 컨테이너 생성과 연동
[네트워크 설정] network create
[MySQL 컨테이너 생성] docker run … mysql
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
[워드프레스 컨테이너 생성] docker run … wordpress
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
[컨테이너 및 네트워크 확인] ps 커맨드
> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 561d55e81288 wordpress "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:8085->80/tcp wordpress000ex12 5a64f9cce384 mysql "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 3306/tcp, 33060/tcp mysql000ex11
웹 브라우저를 통해 워드프레스에 접근해서 확인하기
- localhost:8085
뒷정리
# 컨테이너 종료 docker stop wordpress000ex12 docker stop mysql000ex11 # 컨테이너 삭제 docker rm wordpress000ex12 docker rm mysql000ex11 # 이미지 삭제 docker image rm wordpress docker image rm mysql # 네트워크 삭제 docker network rm wordpress000net1
3) 명령어를 직접 작성하자
소프트웨어와 데이터베이스의 관계
LAMP 조합
- 리눅스 + 웹 서버 + 프로그래밍 언어 런타임 + 데이터베이스 조합
MySQL 컨테이너의 옵션 값 채워넣기
docker run --name container_name -dit --net=network_name -e MYSQL_ROOT_PASSWORD=root_password -e MYSQL_DATABASE=database_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
워드프레스 컨테이너 옵션 값 채워넣기
```bash
docker run --name container_namedit --net=network_name
p=8083:80
e WORDPRESS_DB_HOST=mysql000ex11
e WORDPRESS_DB_NAME=wordpress000db
e WORDPRESS_DB_USER=wordpress000kun
e WORDPRESS_DB_PASSWORD=wkunpass
wordpress
4) 레드마인 및 MariaDB 컨테이너를 대상으로 연습하자
레드마인 → 티켓(누구에게 어떤 업무를 맡길지를 나타내는 ToDo)
네트워크 생성
docker network create redmine000net2
MySQL 컨테이너 생성
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
레드마인 컨테이너 생성
docker run -dit --name redmine000ex15 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
확인
뒷정리
- MySQL과 MariaDB는 모두 개발자 미카엘 와이드니어스의 두 딸의 이름을 붙인 것.
6. 실전 컨테이너 사용법
- 보다 실전에 가까운 내용들
1) 내게 필요한 지식이 무엇인지 알기
- 서버 엔지니어나 보안 엔지니어라면 도커를 깊이 공부해야 한다.
- 나올 내용
- 6-2 절) 컨테이너와 호스트 사이에 파일 복사하기
- 6-3 절) 볼륨 마운트
- 바인드 마운트 → 컨테이너와 파일을 연동하는 데 많이 사용되는 기능. 모든 사람이 익혀두는 것이 좋음
- 볼륨 마운트 → 운영체제와 무관하게 같은 방식으로 파일을 다룰 수 있는 기능
- 6-4 절) 컨테이너를 이미지로 만들기
- 6-5 절) 컨테이너 개조
- 6-6 절) 도커 허브 로그인
- 7장) 도커 컴포즈
- 데이터베이스, 어플리케이션 컨테이너를 함께 시작하고 싶을 때, 환경을 대량으로 생성해야 할 때 유용하다
- 산출물이 텍스트 파일 형태로 남아 관리에 유용하다
- 시간 단축에 도움이 된다
- 8장) 쿠버네티스
- 여러 대의 서버에서 컨테이너를 실행할 때 사용하는 컨테이너 오케스트레이션 도구
- 대규모 시스템을 운영할 때 사용한다
2) 컨테이너와 호스트 간에 파일 복사하기
컨테이너와 호스트 사이에 파일을 복사하는 방법
파일 복사 명령어) docker container cp
# 컨테이너로 파일을 복사하는 커맨드(호스트 -> 컨테이너) docker cp 호스트_경로 컨테이너_이름:컨테이너_경로 # 호스트로 파일을 복사하는 커맨드(컨테이너 -> 호스트) docker cp 컨테이너_이름:컨테이너_경로 호스트_경로
실습 1) 호스트 파일 → 컨테이너
step 1. 호스트의 파일을 아파치 컨테이너 속으로 복사하기
> docker run --name apa000ex19 -d -p 8089:80 httpd
step 2. cp 커맨드를 실행해서 호스트 파일을 컨테이너로 복사하기
> docker cp C:\Users\enkee\Dropbox\PC\Downloads\index.html apa000ex19:/usr/local/apache2/htdocs/ Successfully copied 2.05kB to apa000ex19:/usr/local/apache2/htdocs/
![Untitled](%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B7%E1%84%80%E1%85%AA%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%89%E1%85%B3%E1%86%B8%E1%84%8B%E1%85%B3%E1%84%85%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%AE%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A9%E1%84%8F%E1%85%A5%20&%20%E1%84%8F%E1%85%AE%E1%84%87%E1%85%A5%E1%84%82%E1%85%A6%E1%84%90%E1%85%B5%E1%84%89%E1%85%B3%20dc0390dda7c14da39cca94c56b24264c/Untitled%202.png)
실습 2) 컨테이너 속 파일 → 호스트
> docker cp apa000ex19:/usr/local/apache2/htdocs/index.html C:\Users\enkee\Dropbox\PC\Downloads Successfully copied 2.05kB to C:\Users\enkee\Dropbox\PC\Downloads
3) 볼륨 마운트
- 볼륨을 마운트하면 컨테이너의 일부를 호스트 컴퓨터의 일부처럼 다룰 수 있게 된다
- 볼륨
- 스토리지의 한 영역을 분할한 것
- 마운트
- 대상을 연결해 운영체제 또는 소프트웨어의 관리 하에 두는 일
- USB를 컴퓨터에 꽂으면 USB 메모리가 컴퓨터에 마운트된 것
- 컨테이너 내부 데이터는 휘발되기 때문에, 컨테이너 외부에 둔 데이터에 접근해 사용하는 것을 의미
- 도커의 스토리지 마운트
- 볼륨 마운트
- 도커가 관리하는 영역 내에 만들어진 볼륨(부분 영역)을 컨테이너에 디스크 형태로 마운트하는 것
- 직접 조작하기 어려워 지우면 안되는 파일을 관리할 때 사용
- 바인드 마운트
- 도커가 설치된 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉토리를 컨테이너에 마운트하는 방식
- 자주 사용하는 파일을 두는 데 사용한다
- 볼륨 마운트
4) 컨테이너로 이미지 만들기
5) 컨테이너 개조
6) 도커 허브 등록 및 로그인
'Computer Science > DevOps' 카테고리의 다른 글
Docker | 자주 쓰는 명령어 모음 (0) | 2023.04.28 |
---|---|
W3Schools AWS Cloud | #3 AWS Cloud EC2 개념, 인스턴스 타입, 가격, 확장성, 자동 확장(Auto Scaling) (0) | 2022.11.02 |
W3Schools AWS Cloud | #2 AWS Certified Cloud Practitioner, AWS 클라우드 컴퓨팅, AWS 클라우드의 이점 (0) | 2022.11.01 |
W3Schools AWS Cloud | #1 AWS Cloud Intro (0) | 2022.10.31 |
W3Schools AWS Cloud | #0 AWS 클라우드 실무자 튜토리얼 (0) | 2022.10.29 |