도커를 한마디로 정의하자면 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어라고 할 수 있다.
- 3p
이미지는 광디스크 전체 내용을 그대로 파일에 담은 ISO 파일 등을 생각하면 이해하기 쉽다.
- 5p
윈도우나 macOS에서도 도커를 구동할 수는 있지만 이 경우 내부적으로 리눅스가 사용된다. 또, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
- 6p
프로그램을 격리해야 하는 이유?
=>
공유하는 대상을 어느 한쪽만을 위해 수정하면 다른 쪽에서 오류가 발생하게 된다.
- 8p
설계할 때는 문제가 없었던 프로그램끼리도 실제로 설치해보면 오류를 일으키는 경우도 있다. 이러한 문제의 원인은 대부분 프로그램 간 공유에 있다.
- 9p
도커는 서버에서 사용되는 소프트웨어다. ... 서버란 무엇일까? 서버는 이름 그대로 '어떤 서비스를 제공하는 것'을 가리킨다.
- 11p
'무슨무슨 서버를 만든다'는 말은 '무슨무슨용 소프트웨어를 설치해 이 기능을 갖춘다'는 말과 같다.
- 15p
만약 컨테이너 기술을 활용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올린다면 프로젝트 A에 참여 중인 개발자가 프로젝트 B의 환경을 건드리게 될 수도 있고, 아파치는 서버 한 대에 하나밖에 올리지 못하기 때문에 웹 서버의 기능을 공유해야 하는 한계도 생긴다. 컨테이너 기술을 이용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다.
- 18p
개발 측면에서의 이점은 개발환경을 갖추거나 운영 환경으로 쉽게 넘어갈 수 있다는 점 등을 들 수 있겠다. 이러한 이점은 컨테이너가 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특성에서 비롯된다.
- 18p
물리적 환경의 차이, 서버 구성의 차이를 무시
- 19p
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다. 프로그램이나 데이터는 컨테이너 안에 위치한다.
-22p
모든 컨테이너에는 '리눅스 운영체제 비슷한 무언가'가 들어있다.
-23p
간단하게 리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까 싶지만 주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 '가벼움'을 얻을 수 있다.
- 26p
이미지는 컨테이너를 만드는 데 사용한다.
- 29p
새로운 이미지를 사용해 '개조된' 컨테이너를 대량으로 만들 수 있다.
- 32p
도커를 사용할 때의 원칙 중 하나로, '한 컨테이너에 한 프로그램'이라는 것이 있다. 말 그대로 하나의 프로그램만 담긴 컨테이너를 사용한다는 의미로, 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.
- 37p
컨테이너는 일회용품에 가깝다 - 업데이트 ㄴㄴ
컨테이너를 만들고 -> 실행하고 -> 종료하고 -> 폐기하는 과정 = 컨테이너의 생애주기
- 40p
- 독립된 환경
- 이미지를 만들 수 있다
- 컨테이너에 '커널을 포함시킬 필요가 없다'
- 한대에 물리 서버에 여러 대의 서버를 띄울 수 있다
- 서버 관리가 용이하다
- 서버 고수가 아니어도 다루기 쉽다
- 팀원 모두에게 동일한 개발환경 제공하기
- 새로운 버전의 테스트
- 동일한 서버가 여러 대 필요한 경우
- 44~ 46p
docker 명령어의 기본적인 형태
docker 커맨드(상위+하위) (옵션) 대상 (인자)
커맨드 예
docker container run
상위 커맨드
start | 컨테이너를 실행
stop | 컨테이너를정지
create | 도커 이미지로부터 컨테이너를 생성
rune | 도커 이미지를 내려받고 컨테이너를 생성해 실행함(다운로드는 필요한 경우에만)
rm | 정지 상태의 컨테이너를 삭제
exec | 실행 중인 컨테이너 속에서 프로그램을 실행
ls | 컨테이너 목록 출력
cp | 컨테이너와 호스트 간 파일 복사
commit | 컨테이너를 이미지로 변환
- 92 ~ 95p
docker 실행 주요 커맨드
docker run (옵션) 이미지
--name 컨테이너_이름 | 컨테이너 이름을 저장함
-p 호스트_포트번호:컨테이너_포트번호 | 포트번호를 지정함
-v 호스트_디스크:컨테이너_디렉터리 | 볼륨을 마운트 함
-net==네트워크_이름 | 컨테이너를 네트워크에 연결함
-e 환경변수_이름=값 | 환경변수를 설정함
-d 백그라운드로 실행함
-i 컨테이너에 터미널을 연결함
-t 특수 키를 사용 가능하도록 함
존재하는 모든 컨테이너 목록 출력
docker ps -a
- 98 ~ 100p
컨테이너를 실행중인 컴퓨터(호스트)의 8080번 포트와 컨테이너의 80번 포트를 연결한다. 이 설정이 -p 옵션이며, 그 뒤로 '호스트의 포트 번호'와 컨테이너의 포트 번호'를 콜론으로 연결해 함께 기재한다.
-p 8080:80
호스트의 포트 8080을 컨테이너 포트 80으로 포워딩
docker run --name apa000ex2 -d -p 8080:80 httpd
- 110p
nginx 컨테이너 실행 실습
docker run --name nginx000ex6 -d -p 8084:80 nginx
컨테이너 삭제
하지만 이미지는 남는다
호스트의 파일을 컨테이너 속으로 복사
docker cp 원본_경로 복사대상_컨테이너_이름:컨테이너_경로
docker cp /users/사용자명/Documents/index.html apa000ex19:/usr/local/apache2/htdocs/
175p
볼륨이란 스토리지의 한 영역을 분할한 것을 말한다. 간단히 말하면 하드디스크나 SSD를 분할한 하나의 영역이다.
- 179p
이해하기 쉬운 예로 USB 메모리를 컴퓨터에 꽂으면 띠딩, 하는 소리가 난 다음 폴더가 열리는데, 이것도 USB 메모리가 컴퓨터에 마운트 됐기 때문이다.
- 180p
볼륨 마운트는 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다.
바인드 마운트는 도커가 설치된 컴퓨터의 문서 폴더 또는 바탕화면 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다.
- 181 ~ 182p
컨테이너로 이미지 만들기
docker commit 컨테이너_이름 새로운_이미지_이름
- 208p
도커 허브와 레지스트리
이미지를 배포하는 장소를 '도커 레지스트리'라고 한다.
- 215p
도커 컴포즈
시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구가 바로 도커 컴포즈다.
- 224p
up 커맨드는 docker run 커맨드와 비슷하다. 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행한다. 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한 번에 생성할 수 있다.
down 커맨드는 컨테이너와 네트워크를 정지 및 삭제한다. 볼륨과 이미지는 사게하지 않는다. 컨테이너와 네트워크 삭제 없이 종료만 하고 싶다면 stop 커맨드를 사용한다.
- 225p
도커 컴포즈와 Dockerfile 스크립트의 차이점
도커 컴포즈는 말하자면 docker run 명령어를 여러 개 모아놓은 것과 같다. 컨테이너와 주변 환경을 생성한다. 네트워크와 볼륨까지 함께 만들 수 있다. 반면 Dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.
- 226p
쿠버네티스는 도커 컨테이너를 관리하는 도구인 만큼 여러 개의 컨테이너를 다루는 것과 관계가 깊다. 따라서 도커 커모즈와도 혼동하기 쉽다. 하지만 쿠버네티스는 컨테이너를 관리하는 도구인 데 비해 도커 컴포즈의 기능은 컨테이너를 생성하고 삭제하는 것뿐으로, 컨테이너 관리 기능은 없다.
- 227p
정의 파일의 이름은 미리 정해진 docker-compose.yml 이라는 이름을 사용해야 한다.
- 229p
주 항목
services 컨테이너를 정의한다.
networks 네트워크를 정의한다.
volumes 볼륨을 정의한다.
version: "3.8" # docker-compose 파일 버전입니다.
services: # 서비스들을 선언합니다.
fast-pass-mysql: # 서비스명을 선언합니다.
container_name: mysql_local
image: mysql:8.0.30
volumes: # {호스트}:{컨테이너}
- ./db/conf.d:/etc/mysql/conf.d # MySQL 설정 파일이 있습니다.
- ./db/initdb.d:/docker-entrypoint-initdb.d # sh, sql을 파일명 알파벳순으로 수행합니다. 테이블 create, insert 쿼리 파일이 들어있습니다.
ports: # 외부로 노출시킬 port 입니다.
- "3307:3307"
environment: # 환경 변수
- MYSQL_DATABASE=pass_local
- MYSQL_USER=name
- MYSQL_PASSWORD=password
- MYSQL_ROOT_PASSWORD=password
- TZ=Asia/Seoul
쿠버네티스는 여러 대의 컨테이너가 여러 대의 물리적 서버에 걸쳐 실행되는 것을 전제로 한다.
- 258p
쿠버네티스는 전체적인 제어를 담당하는 마스터 노드와 실제 동작을 담당하는 워커 노드라는 두 가지 유형의 노드로 구성된다. 노드라는 낯선 용어가 나왔는데, 거의 물리적 서버와 일치하는 개념이라고 보면 된다.
- 259p
마스터 노드 : 관리
워커 노드 : 컨테이너가 실제 동작하는 서버
- 260p
생성, 모니터링, 유지
쿠버네티스의 기능은 어디까지나 '자동으로 상태를 유지하는' 것으로, 컨테이너를 삭제하고 싶다면 삭제 명령어를 입력하는 것이 아니라 파일에서 '바람직한 상태'를 수정해야 한다.
- 264p
로드 밸런싱이란 한 대의 서버에 모든 요청이 집중되지 않도록 여러 대의 서버를 갖추고 요청을 각 서버에 분산하는 것
- 266p
쿠버네티스에서 컨테이너는 파드pod 라는 단위로 관리된다. 파드는 컨테이너와 볼륨을 함께 묶은 것으로, 기본적으로 파드 하나가 컨테이너 하나이지만 컨테이너가 여러 개인 파드도 있을 수 있다.
- 268p
이들 파드를 모은 것이 서비스service
- 269p
동일한 구성의 파드를 레플리카
- 272p
'Book' 카테고리의 다른 글
[독서 기록] 소프트웨어 장인, 산드로 만쿠소 (0) | 2023.05.28 |
---|---|
[독서 기록] 함께 자라기 애자일로 가는 길, 김창준 (0) | 2023.05.21 |
[독서 기록] 1만 시간의 재발견, 안데르스 에릭슨 (0) | 2023.05.17 |
[독서 기록] 오브젝트 14장 일관성 있는 협력 (0) | 2023.01.18 |
[독서 기록] 오브젝트 12장 다형성 (0) | 2023.01.17 |