01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot
19. 중간프로젝트 (1M)
10. Linux 명령어
11. AWS
12. Docker(v)
13. React JS [Front-end]
14. App - Android
15. 최종프로젝트 (1M)
지속적인 통합
을 의미지속적인 서비스 제공
또는 지속적인 배포
의미
- 개발팀과 운영팀이 서로 협력하여 소프트웨어를 개발, 배포, 유지보수
- 두 팀이 공동으로 책임
- 코드 빌드, 테스트, 배포 등 반복적인 작업을 자동화하여 시간을 절약하고 오류를 줄임
- 지속적 통합(CI) : 코드가 변경될 때마다 자동으로 통합, 테스트, 빌드가 실행
- 지속적 배포(CD) : 검증된 코드를 자동으로 프로덕션 환경에 배포
- 배포 후에도 모니터링과 로그 분석을 통해 문제를 빠르게 발견하고 개선
- Git, GitHub : 코드를 관리하고 팀 협업 지원
- GitHub Actions : GitHub에서 바로 사용 가능한 자동화 도구
- Jenkins : 오픈소스 CI/CD도구로 강력한 확장성 제공
- Docker : 애플리케이션을 컨테이너로 패키징 하여 어디서나 실행 가능
- Kubernetes : 여러 컨테이너를 자동으로 관리하고 배포
- Prometheus, Grafana : 애플리케이션 상태를 모니터링하고 시각화
- ELK Stack(Elasticsearch, Logstash, Kibana) : 로그 데이터를 분석하고 대시보드로 시각화
- AWS, Azure, Google Cloud : ;클라우드 환경에서 서버를 설정하고 관리
- 개발자가 코드를 작성 > 운영팀에 전달 > 수동 배포
- 각 팀간의 협업 부족, 배포 중 오류 발생 가능성이 높음
- 개발자가 코드를 작성하고 Git에 업로드 > CI/CD 도구가 자동으로 코드를 빌드, 테스트 > Docker로 컨테이너화 > Kubernetes가 배포 및 관리
- 자동화된 워크플로우로 시간 절약, 오류 감소
도커
는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리 기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트
- 컨테이너 박스를 만들고 어플리케이션 구동에 필요한 OS, 라이브러리, 실행 파일 등을 하나의 이미지로 묶어서 컨테이너에 배포하는 방식
- 이런 이미지를 만들었을 때 용량 또한 대폭 줄어들음
- 컨테이너는 각각 프로세스들의 서로 영향을 미치지 않고 독립적인 환경을 갖게 됨
- 가상 머신은 하이퍼바이저와 OS를 부팅하는데 자원을 크게 사용하는데 반해, 도커는 호스트OS 위에서 가동되기 때문에 보다 가벼움
도커
는컨테이너를 만들어주는 도구
이미지
는 앱 + 실행환경(Linux, 패키지 등)을 통째로 묶은 파일
컨테이너
는 이미지를 기반으로 실제 실행중인 인스턴스(상태)로컬환경 뿐만 아닌 다른 환경에서도 실행 가능
도커 흐름
- Dockerfile작성 : 어떤 앱인지, 어떻게 설치할지 작성
- 이미지 빌드(docker build) : 설치 방법을 기반으로 실행 가능한 이미지 생성
- 컨테이너 실행 : 이미지 기반으로 실제 앱 실행
- 포트 연결, 파일마운트, 네트워크 설정 등(컨테이너 실행시(docker run) 설정)
도커 호스트
: 운영체제(리눅스)도커 엔진
: 호스트위에서 동작하는 실행파일(도커 컨테이너 전체 관리)컨테이너
: 리소스(소스 코드)를 패키징해서 담아놓은 박스
기존의 가상화 기술인 가상머신(VM)
은 하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해서 사용하는 방식
하이퍼바이저
- 하드웨어에서 시스템의 운영 체제와 리소스를 분리해 VM에 할당하여 가상 머신을 생성하고 구동하는 소프트웨어
- 대표적으로 VMware가 있음
- 독립적인 OS를 실행시킬 수 있음
- 가상머신이 하드웨어의 성능도 많이 사용하게 되고, 용량자체가 커서 가상머신을 만들고 배포하는 작업이 부담스러움
컨테이너 하나는 애플리케이션 (권장)
컨테이너는 이미지로 구성
예시
- 데이터베이스 1개, 스프링백엔드 app1개, react프론트 app1개 라면 3개의 앱 -> 컨테이너 3개
- 기존 어플리케이션 배포는 하나의 운영체제에 설치 (모놀리식 아키텍쳐)
- 컨테이너는 완벽히 독립된 형태로 관리되고 운영
- CPU, 메모리, 디스크공간, 네트워크 등등이 완전히 독립
컨테이너를 생성할 때 필요한 요소
이미지는 레이어로 구성
예시
- 스프링이 동작되기 위해서 필요한 소스 코드 (스프링프로젝트 이미지1)
- 스프링은 톰캣에서 동작 (톰캣 이미지2)
Docker Client
: 도커를 설치하면 그것이 Client이며 build, pull, run등의 도커 명령어 수행DOCKER HOST
: 도커가 띄워져 있는 서버를 의미하여 DOCKER_HOST에서 컨테이너와 이미지를 관리Docker daemon
: 도커 엔진Registry
: 외부 이미지 저장소로 다른 사람들이 공유한 이미지를 내부(local) 도커 호스트에 pull할 수 있고 이렇게 가져온 이미지를 run하면 컨테이너가 됨
- public 저장소 : Docker Hub
- private 저장소 : AWS ECR / Docker Registry를 직접 띄워서 비공개로 사용하는 방법 등이 존재
docker login
docker version docker info
docker search <찾을이미지>
docker pull <이미지이름:태그> docker pull tomcat:9
docker image docker image + 커맨드 docker images
docker inspect <이미지명:태그 or 컨테이너명> docker inspect tomcat:9
docker create --name <컨테이너명> <이미지명:태그명>
docker run <옵션> <이미지:태그> docker run --name myserver tomcat:9 docker run --name myserver -d -p 8888:8080 tomcat:9
- 주요옵션
옵션명 기능 --name[컨테이너 이름] 컨테이너의 이름을 직접 지정 --net[네트워크 명] 네트워크를 추가함 --d 컨테이너를 백그라운드에서 동작하는 애플리케이션을 실행할 때 설정 -p[호스트 포트]:[컨테이너 포트] 호스트의 N번 포트를 컨테이너의 N번 포트와 연결(여러번 사용 가능) -p[호스트 IP]:[호스트 포트]:[컨테이너 포트] 특정 바인딩 IP인 호스트의 N번 포트를 컨테이너의 N번 포트와 연결(여러번 사용 가능) -v[호스트 디렉토리]:[컨테이너 디렉토리] 볼륨.호스트의 디렉토리와 컨테이너의 디렉토리 공유 -e[키=값] 컨테이너 실행시 필요한 환경변수 전달
docker ps -a
docker start <아이디 or name명>
- 도커 start는 중지 되어 있는 컨테이너를 실행하고, run은 (pull + create + start)를 같이 처리리
docker stop <아이디 or name명>
docker restart <아이디 or name명>
docker rm -f <아이디 or name명>
docker rmi <이미지:태그> docker rmi tomcat:9
docker system prune -a -f
docker search mysql
docker pull mysql
- host에서 3307 접속시 컨테이너의 3306으로 포트포워딩
- -e옵션으로 초기 root비밀번호 전달
docker run --name <container_name> -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=비밀번호 mysql:8.0.41
attach
- 가동중인 컨테이너에 연결
- 백그라운드로 프로세스가 돌고 있으면 가동되는 프로세스 진입
docker ps docker attach <가동중인컨테이너>
exec
- 가동중인 컨테이너에 새로운 프로세스로 연결
- mysql서버는 백그라운드로 돌기 때문에 이렇게 접근
- 진입시 우분투 이미지가 설치된 우분투 환경으로 접속
- -i : 인터렉티브(상호작용), -t : tty(터미널)
docker exec -it <가동중인컨테이너> /bin/bash docker exec -it <가동중인컨테이너> /bin/sh
docker exec -it <container_name> /bin/bash mysql -u root -p