다음 두가지 방법으로 Git 저장소 사용 가능
- 로컬 디렉토리 선택해서 적용 (적용할 디렉토리에서 git init)
- clone 해서 사용 (git clone url)
- 파일 상태 확인 (git status)
- 파일 새로 추적 (git add file)
- 변경사항 커밋 (git commit)
- 파일 삭제 (git rm file)
- 파일 이름 변경 (git mv file)
- 히스토리 조회하기 (git log) 시간 순으로 출력하고 각 커밋의 SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 보여준다.
- 다양한 옵션 존재 (ex -p, --stat 등등)
- 완료한 커밋을 수정할때 (git commit --amend)
- unstaged 상태로 만들기 (git reset)
- 수정된 파일 되돌리기 (git checkout -- file)
- 프로젝트 공유할때 (git push 리모트 저장소 이름, 브랜치 이름)
- 현재 프로젝트에 등록된 리모트 저장소 확인 (git remote)
- 리모트 저장소에서 데이터 가져오기 (git fetch remote)
- 리모트 저장소 이름 바꾸기 (git remote rename)
- 리모트 저장소 삭제하기 (git remote rm)
- 태그 조회하기, 생성하기
- 태크 종류 (lightweight, annotated)
- config 사용하여 각 명령의 alias 쉽게 만들 수 있다.
- 브랜치란 커밋 사이를 가볍게 이동할 수 있는 포인터 같은 것
- 처음 커밋하면 master 브랜치(기본)거 생성된 커밋을 가리킨다.
- 새 브랜치 생성 (git branch name)
- 브랜치 이동하기 (git checkout name)
- git log로 정보 확인 가능
- merge의 진행 방식은 다음과 같다.
- 작업 진행 -> 새로운 이슈 처리할 새 branch 생성 -> 새 branch에서 작업 진행 -> 이전 브랜치에서 merge 진행
- 브랜치 목록 확인 (git branch)
- -v 사용하면 커밋 메시지 확인가능
- -d 명령으로 삭제 가능
- 배포한 코드는 master 브랜치에 두고 개발을 진행하거나 안정화하는 브랜치는 추가로 따로 브랜치를 만들어서 관리한다.
- 테스트를 거쳐서 안정적이라 판단하면 해당 브랜치를 master 브랜치와 merge 하는 원리
- 리모트 트래킹 브랜치 일종의 북마크 같은 역할 (로컬에 있지만 임의로 움직일 수 없음)
- 리모트 트래킹 브랜치의 이름은 remote/branch 형식
- git fetch로 서버의 데이터 내려받을 수 있음
- 리모트 트래킹 브랜치를 로컬 브랜치로 checkout하면 자동으로 트래킹 브랜치 만들어짐
- git pull 명령은 fetch 명령 이후에 merge 명령을 실행하는 것일 뿐이다.
- 변경된 사항을 patch로 만들고 이를 원래에 다시 적용시키는 방식
- git checkout... -> git rebase... 식으로 실행
- merge와는 달리 히스토리가 깔끔해진다. merge와 기능은 같다.
- 주의) 공개 저장소에 push한 커밋을 rebase 하면 코드가 엉키게 된다.
- 프로젝트 fork 하기 (프로젝트를 통째로 복사해준다)
- pull request (push 한 변경 내용을 원래 저장소로 보내는 것) 1.Fork 한 개인 저장소를 로컬에 Clone 한다. 2.무슨 일인지 설명이 되는 이름의 토픽 브랜치를 만든다. 3.코드를 수정한다. 4.잘 고쳤는지 확인한다. 5.토픽 브랜치에 커밋한다. 6.GitHub의 개인 저장소에 토픽 브랜치를 Push 한다.
- pull request는 토론을 통해 결정
- 서비스 (설정하면 누군가 저장소에 push 할 때마다 이메일이 날라감, 다양한 이벤트 처리가능, 보통은 push 할 때 그 데이터를 가지고 한다.)
- 훅 (서비스에 없는 사이트나 외부 서비스와 연동하고 싶을 때 사용, url로 http 페이로드를 보내줌)
- API (API에 연결하면 이슈에 코멘트하고, pull request의 상태 변경 등 가능)
-
시스템 기반의 구성 요소
- 하드웨어
- 시스템 기반을 구성하는 물리적인 요소
- 네트워크
- 원격지에서 액세스 할 수 있도록 서버들을 연결
- OS (운영체제)
- 하드웨어나 네트워크 장비를 제어하기 위한 기본 소프트웨어
- 미들웨어
- OS 상에서 서버가 특정 역할을 하기 위한 기능을 갖고 있는 소프트웨어
- 하드웨어
-
클라우드와 온프레미스
- 온프레미스
- 자사에서 데이터센터를 보유하고 모든 과정을 수행하는 형태
- 퍼블릭 클라우드
- 인터넷을 통해 불특정 다수에게 제공되는 클라우드 서비스
- 프라이빗 클라우드
- 특정 그룹에게만 제공되는 클라우드 서비스
- 온프레미스
-
시스템 기반의 구축/ 운용 흐름
- 시스템화 계획 요구사항 정의 -> 인프라 설계 -> 인프라 구축 -> 운용
-
서버 장비
- CPU
- 프로그램의 설계나 처리를 수행하는 전자회로 부품
- 메모리
- CPU가 직접 액세스 할 수 있는 기억장치
- 스토리지
- 데이터베이스에 기록하는 데이터 등과 같은 영구적인 데이터를 저장하는 디바이스
- CPU
-
네트워크 주소
- MAC 주소 (물리 주소, 이더넷 주소, 16진수로 표기)
- IP 주소 (네트워크 장비에 할당되는 식별 번호, 10진수 4개를 나열하여 나태냄)
- 리눅스 커널
- 리눅스 커널은 하드웨어 제어에 관한 OS의 핵심이 되는 기능을 말하는 것
- 주요 기능
- 디바이스 관리
- 프로세스 관리
- 메모리 관리
- 웹 서버
- 클라이언트의 브라우저가 보내온 HTTP의 요청을 받아, 웹 콘텐츠를 응답으로 반환하거나 다른 서버사이드 프로그램을 호출하는 기능을 가지고 있는 서버
- 데이터베이스 서버
- 시스템이 생성하는 다양한 데이터를 관리하기 위한 미들웨어
- 시스템 감시 툴
- 시스템이 안정적으로 가동되는지 감시
-
인프라 구성 관리
- 인프라를 구성하는 하드웨어, 네트워크, OS, 미들웨어, 애플리케이션의 구성 정보를 관리하고 적절한 상태로 유지하는 작업
-
대표적인 인프라 구성 관리 툴
- KickStart, Vagrant, Chef, Puppet, Kubernetes 등
-
지속적 인티그레이션
- 애플리케이션의 코드를 추가 및 수정할 때마다 테스트를 실행하고 확실하게 작동하는 코드를 유지하는 방법
-
지속적 딜리버리
- 모든 기능을 한 번에 다 만드는 것이 아니라 기능을 추가할 때마다 애플리케이션을 제품 환경에 배포하는 방법
- 컨테이너
- 호스트 OS상에 논리적인 구획을 만들고 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아 별도의 서버인 것처럼 활용
- 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모음
- 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용
- 오픈 소스 플랫폼, 내부에서 컨테이너 기술을 사용
- 도커는 인프라 환경을 컨테이너로 관리
- 도커 이미지를 만드는 기능
- 애플리케이션 실행에 필요한 파일들이 저장된 디렉토리
- 도커 이미지를 공유하는 기능
- 도커 레지스트리에서 공유가능(도커 허브)
- 도커 컨테이너를 작동시키는 기능
- 도커는 컨테이너 단위로 서버 기능을 작동(이미지 필요)
- 도커는 컨테이너를 독립된 공간으로서 관리
-
컨테이너를 구획화하는 장치(namespace)
- namespace : 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념
- 리눅스 커널의 namespace 기능은 리눅스의 오브젝트에 이름을 붙여 총 6개의 독립된 환경 구축 가능
-
릴리스 관리 장치
- 도커는 리눅스 커널의 기능인 'control groups' 기능을 사용하여 자원의 할당 등을 관리
- 컨테이너 안의 프로세스에 대해 그룹별로 제한을 둘 수 있다.
- 프로세스를 그룹화하여 관리 가능
-
네트워크 구성
- 가상 브리지 / 가상 NIC 이용
-
도커 이미지의 데이터 관리 장치
- Copy on Write 방식으로 컨테이너의 이미지를 관리
-
도커 버전 롹인 (docker version)
- 도커의 버전, Go 언어의 버전, OS, 아키텍처 확인 가능
-
도커 실행환경, 디스크 이용 상황 확인 가능
- nginx 예제 확인
-
도커 허브
- 도커의 공식 리포지토리 서비스 (이미지 배포나 다운로드 가능)
-
이미지 다운로드 (docker image pull)
-
이미지 목록 표시 (docker image ls)
-
이미지 상세 정보 확인 (docker image inspect)
- 이미지 ID, 작성일, 도커 버전, CPU 아키텍쳐 표시
-
이미지 태그 설정 (docker image tag)
-
이미지 검색 및 삭제 (docker search & dockeer image rm)
-
이미지 업로드 (docker image push)
- 컨테이너 생성 및 시작 (docker container run 콘솔에 결과를 출력하는 옵션, 컨테이너명, 이미지명, 컨테이너에서 실행한 명령)
- 컨테이너 백그라운드 실행 (docker container run 실행 옵션, 이미지명, 인수)
- 컨테이너 로그를 통해서 실행되고 있는지 확인 가능 (restart를 통해 재시작 조건 설정 가능)
- 컨테이너 네트워크 설정 (docker container run 네트워크 옵션, 이미지명, 인수)
- 자원 지정하여 컨테이너 생성 및 실행(docker container run 자원 옵션, 이미지명, 인수)
- CPU 시간의 상대 비율과 메모리 설정 등
- 가동 컨테이너 목록 표시 (docker container ls 옵션)
- 컨테이너 가동 확인 (docker container stats 컨테이너 식별자)
- 컨테이너 시작 (docker container start 옵션, 컨테이너 식별자)
- 컨테이너 정지 (docker container stop)
- 컨테이너 재시작 (docker container restart)
- 컨테이너 삭제 (docker container rm)
- 컨테이너 중단/재개 (docker container pause/docker container unpause)
- 네트워크 목록 표시 (docker network ls)
- 옵션으로 ID, 네트워크 타입 등의 정보 확인 가능
- 네트워크 작성 (docker network create)
- 지정할 수 있는 네트워크 드라이버는 'bridge' 또는 'overlay'
- 네트워크 연결 (docker network connect/docker network disconnect)
- 네트워크 상세 정보 확인 (docker network inspect)
- 네트워크 삭제 (docker network rm)
- 가동 컨테이너 연결 (docker container attach)
- 가동 컨테이너에서 프로세스 실행 (docker container exec)
- 가동 컨테이너의 프로세스 확인 (docker container top)
- 가동 컨테이너의 포트 전송 확인 (docker container port)
- 컨테이너의 이름 변경 (docker container rename)
- 컨테이너 안의 파일을 복사 (docker container cp 컨테이너 식별자 : 컨테이너 안의 파일 경로, 호스트의 디렉토리 경로)
- 컨테이너 조작의 차분 확인 (docker container diff)
- 컨테이너로부터 이미지 작성 (docker container commit 옵션, 컨테이너 식별자, 이미지명)
- 컨테이너를 tar 파일로 출력 (docker container export)
- tar 파일로부터 이미지 작성 (docker image import 파일 또는 URL | - 이미지명)
- 이미지 저장 (docker image save)
- 이미지 읽어 들이기 (docker image load)
- 불필요한 이미지/컨테이너를 일괄 삭제 (docker system prune)
- 도커파일은 인프라 구성을 기술한 파일이다.
- 베이스가 될 도커 이미지
- 도커 컨테이너 안에서 수행한 명령
- 환경 변수 등의 설정
- 도커 컨테이너 안에서 작동시켜둘 데몬 실행
- from 명령(필수)를 통해 어떤 도커 이미지로부터 생성할지 작성
- 도커 파일로부터 도커 이미지 만들기 (docker build -t 생성할 이미지명 : 태그명, 도커파일의 위치)
- 도커파일을 빌드하여 도커 이미지를 작성하면 도커의 명령별로 이미지를 작성하는데 작성된 여러 개의 이미지는 레이어 구조를 가짐
- 작성한 이미지는 다른 이미지와 공유됨 (베이스 이미지의 레이어가 공유됨)
- 두 개의 부분으로 되어 있는 도커파일
- 개발 환경용 도커 이미지
- 제풀 환경용 도커 이미지
- 도커 이미지의 빌드
- 도커 컨테이너의 시작
-
도커 이미지를 만들려면 필요한 미들웨어 설치 필요
-
이미지 컨테이너를 생성했을 때 서버 프로세스 등을 데몬으로서 작동시켜야함
-
명령 실행
-
- Shell 형식으로 기술
-
- Exec 형식으로 기술
-
-
데몬 실행 (CMD 명령)
- 생성된 컨테이너 안에서 명령을 실행하려면 CMD 명령을 사용해야함
- 명령 실행과 기술 방법 동일
-
데몬 실행 (ENTRYPOINT 명령)
- docker container run 명령을 실행했을 때 실행됨
- 명령 실행과 기술 방법 동일
-
빌드 완료 후에 실행되는 명령 (ONBUILD 명령)
- ONBUILD 명령을 통해 어떤 명령을 실행하도록 설정하여 빌드하고 이미지를 작성함
-
시스템 콜 시그널의 설정
- 컨테이너 종료할 때 송신하는 시그널 설정
-
컨테이너의 헬스 체크 명령
- 컨테이너 안의 프로세스가 정상적으로 작동되고 있는지 체크하고 싶을 때 사용
- 환경 변수 설정 (ENV 명령)
-
- key value 형으로 지정
-
- key=value로 지정
-
- 작업 디렉토리 지정 (WORKDIR 명령)
- 도커 파일에서 정의한 명령을 실행하기 위한 작업용 디렉토리를 지정할 때
- RUN, CMD, ENTRYPOINT, COPY, ADD 명령일 때
- 사용자 지정 (USER 명령)
- 이미지 실행이나 도커파일의 RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 사용자를 지정할 때 사용
- 라벨 지정 (LABEL 명령)
- 이미지에 버전 정보, 작성자 정보, 코멘트 등과 같은 정보 제공할 때 사용
- 포트 설정 (EXPOSE 명령)
- 컨테이너의 공개 포트 번호를 지정할 때
- 도커 파일 내 변수의 설정 (ARG 명령)
- 변수의 값에 따라 생성되는 이미지의 내용 바꿀수 있음
- 기본 쉘 설정 (SHELL 명령)
- 쉘 형식으로 명령을 실행할 때 사용
- 파일 및 디렉토리 추가 (ADD 명령)
- 도커 이미지 안으로 복사 (파일 제외 명령도 가능)
- 파일 복사 (COPY 명령)
- 이미지에 호스트상의 파일이나 디렉토리를 복사 할 때 사용
- 볼륨 마운트 (VOLUME 명령)
- 이미지에 볼륨 할당
- Automated Build 기능을 통해 도커파일을 바탕으로 도커 이미지를 자동으로 빌드할 수 있다.
- 도커 이미지를 관리하기 위한 레지스트리를 로컬 한경에 구축하기
- 도커에 공개되어 있는 공식 이미지인 registry를 사용 -> 프라이빗 레지스트로 구축
- 도커 이미지 업로드
- 태그 설정 주의
- push를 통해 업로드, 업로드 완료되면 로컬에 있는 건 rm을 통해 삭제
- 도커 이미지 다운로드 (pull 사용), run을 통해 실행
- 이미지 중에서는 용량이 큰 것도 있기 때문에 온프레미스 환경에서 관리하긴 비용 부담이 큼
- Google Cloud Platform은 도커 이미지를 프라이빗으러 관리할 수 있는 Google Container Registry 제공함
- 구글 컨테이너 레지스트리 준비하기
- API 사용 허가 필요
- 구글 컨테이너 레지스트리에 이미지 업로드 하기
- 규칙 지켜야함 (pg 211)
- 나머지는 동일
-
웹 시스템 실행 환경은 웹 서버, 프록시 서버 같은 여러 개의 서버를 연계해 작동시킴
-
웹 3계층 시스템 아키텍쳐
- 프론트 서버 (웹 브라우저랑 소통)
- 애플리케이션 서버 (업무 처리)
- 데이터베이스 서버 (영구 데이터 관리)
-
Docker Compose (여러 컨테이너를 모아서 관리하기 위한 툴)
- docker-compose.yml라는 파일에 컨테이너의 구성 정보를 정의함으로써 컨테이너를 일괄적으로 관리
- Compose 정의 파일은 웹 애플리케이션의 의존관계(데이터베이스, 큐, 캐시, 애플리케이션 등)을 모아서 설정 가능
- docker-compose up을 통해 여러 도커 컨테이너 시작 가능
- docker-compose stop으로 정지 가능
= docker compose 정의 파일 (버전 지정, 서비스 정의, 네트워크 정의, 데이터 볼륨 정의) 순으로 작성
- 베이스 이미지 지정 (태크 지정 안하면 자동으로 최신 버전이 다운로드됨)
- 이미지 빌드 (build) (도커 파일에 기술되어 있는 이미지를 빌드)
- 컨테이너 안에서 작동하는 명령 지정 (command/entrypoint)
- 컨테이너 간 연결 (links)
- 컨테이너 간 통신 (ports/expose)
- 서비스의 의존관계 정의 (depends_on)
- 컨테이너 환경변수 지정 (environment/env_file)
- 컨테이너 정보 설정 (container_name/labels)
- 컨테이너 데이터 관리 (volumes/volumes_from)
- 여러 컨테이너 생성 (up)
- 여러 컨테이너 확인 (ps/logs)
- 컨테이너에서 명령 실행 (run)
- 여러 컨테이너 시작/정지/재시작 (start/stop/restart)
- 여러 컨테이너 일시 정지/재개(pause/unpause)
- 서비스의 구성 확인 (port/config)
- 여러 컨테이너 강제 정지/삭제 (kill/rm)
- 여러 리소스의 일괄 삭제 (down)