1) 2차원 배열에 0이 물, 1이 섬이라고 할 때, 섬의 갯수를 구하는 문제
2) 이진힙
삽입
삽입한 노드의 부모의 값과 비교하여 최소값을 root로 올리면 최소 힙 반대는 최대 힙
삭제
루트 삭제
마지막 노드를 루트로 이동
자식값과 비교, 최소힙의 경우 더 작은 값을 루트로, 최대힙인 경우 더 큰 값을 루트로
while문으로 루트까지 올라가며 반복
Docker
리눅스 컨테이너 기술 기반의 오픈 소스 서비스
애플리케이션 실행 환경을 코드로 작성할 수 있음
OS 격리화 관리
리눅스 컨테이너(Linux Container)
필요한 라이브러리와 애플리케이션을 모아 마치 별도의 서버처럼 구성한 것
컨테이너를 이루는 네트워크 설정, 환경 변수 등 시스템 자원을 각 컨테이너가 독립적으로 소유
1) 프로세스의 구획화
특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 가능, 또 다른 컨테이너의 프로세스에 영향을 줄 수 없음
2) 네트워크의 구획화
기본으로 컨테이너 하나에 IP 주소가 할당되어있음
3) 파일 시스템의 구획화
해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있음
Docker가 해결 가능한 문제
환경 표준화 - 사용자의 운영체제마다 다른 환경에서 빌드하고 테스트를 수행할 수 있음
리소스 격리성 - 하나의 컴퓨터를 사용하면서, 여러 개의 컴퓨터를 사용하는 것 처럼 사용하는 방법
가상머신과 도커가 가능
가상머신과 도커의 차이
VM - 견고한 격리성, 애플리케이션에 대한 환경 격리성 중심
도커 - 컨테이너의 관점
도커의 Lifecycle
도커의 이미지가 실행되면 도커의 컨테이너가 됨
도커 이미지 구분
관계
이미지 : 컨테이너
이미지 : 인스턴스 (AWS)
클래스 : 인스턴스 (JS) 관계와 유사한 듯!
레지스트리
도커 허브
도커의 이미지를 관리하는 공간
도커 허브, private 도커 허브, 회사 내부용 레지스트리 등으로 나뉠 수 있음
레포지토리
레지스트리 내에 이미지가 저장되는 공간
이미지 이름이 사용되기도 함
태그
같은 이미지라도 여러 버전이 있어, 내용이 다를 수 있음
해당 이미지를 설명하는 버전 정보
특별히 지정이 없다면, latest 태그를 붙인 이미지를 가져옴
Registry_Account / Repository_Name : Tag
docker / whalesay :latest
docker 레지스트리
whalesay 이미지 or 레포지토리
latest 태그
sudo
가 붙어야 함!docker image pull {이미지}
레지스트리에서 이미지 혹은 레포지토리를 가져옴
docker container run [Options] {이미지} [command] [ARG..]
options 옵션
command 초기 컨테이너 실행 시 수행되는 명령어
ARG.. argument, 커맨드에 넘겨질 것
docker container run --name 컨테이너_이름 {이미지} cowsay boo
run
컨테이터 실행
--name
실행할 컨테이너 이름 할당 옵션
--rm
일회성 실행, 종료시 삭제
-it
-i
와 -t
를 동시에 사용한 옵션
--interactive
, -i
--tty
, -t
cosway
컨테이너 실행 시 cosway 명령어 호출
boo
위 명령어 cosway
에 넘겨질 파라미터
docker container ps -a
컨테이너 리스트 출력
-a
는 종료된 컨테이너를 포함
기본값은 실행되는 컨테이너만 출력
docker container rm {컨테이너}
컨테이너 삭제
로컬 파일을 도커 이미지에 연결하는 방법
CP, Volume
CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사
Volume : 호스트와 컨테이너 사이에 공간을 마운트, 하나의 저장 공간처럼 보이게 함
httpd(http daemon)
Apache HTTP server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어
httpd 는 /usr/local/apache2/htdocs/
경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 함
컴포즈로 한번에 실행시킨 것들은 같은 네트워크를 공유(?)
docker container run --name 컨테이너_이름 -p 818:80 httpd
-p 로컬포트:컨테이너포트
옵션은 로컬호스트 포트와 컨테이너 포트를 연결
-d
백그라운드에서 컨테이너 실행
docker container cp ./복사할 파일경로 컨테이너 이름:/usr/local/apache2/htdocs/
cp
는 앞 경로 파일을 뒷 경로에 복사
현재 터미널 위치를 주의
위 작업으로 만들어 놓은 컨테이너를 이미지로 만들 수 있음
작업을 또 수행하지 않아도 되고, 배포 및 관리가 유용하다
docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
사용예시
docker container commit 컨테이너_이름 my_pacman:1.0
또 다른 방법은 Dockerfile로 만드는 방법이다
docker build --tag name:tag .
지정한 경로에 있는 dockerfile을 찾아서 빌드
docker exec 컨테이너 커맨드
컨테이너에 등록된 커맨드를 실행
docker exec 컨테이너 bash
와 같이 컨테이너의 bash shell을 실행시킬 수 있음
docker-compose.yaml
파일을 만들어 docker-compose up
명령어를 사용하면 한번에 여러 개의 컨테이너를 뽷! 만들어 사용할 수 있음 >> 중요
AWS
이미지(AMI) -> 인스턴스
운영체제 템플릿 -> 한대의 컴퓨터
Docker
이미지 -> 컨테이너
애플리케이션 레벨의 템플릿 -> 하나의 아키텍처를 구성하는 구성요소
내 컴퓨터 (localhost)에 node, nginx, mysql 등이 없어도 컨테이너 안에 설치 되어있어서 문제없이 작동된다 => Docker가 강력한 이유