소프트웨어의 지속적 통합 및 제공, 관리를 수행하는 데 가장 널리 사용되는 CI/CD 툴로, 이 소프트웨어 도구와 통합하는 방법 중 Docker, Github, SonarQube, Onelogin 등이 있는 것이다.
자유 유형의 프로젝트를 사용하는 것이 아닌, Jenkins를 사용하는 방법이 바로 DevOps 방식의 Jenkins라고 불린다.
*DevOps란, Dev(개발 )와 Ops(운영 )를 합쳐 비즈니스의 요구사항을 단기간에 반영할 수 있는 품질 높은 소프트웨어를 만들고자 하는 목적을 가진다.
파이프라인 및 Docker를 이용한 Jenkins와의 CI/CD 사용 순서는 다음과 같다.
👍🏻 GOOD
👎🏻 BAD
DinD(Docker In Docker)
도커 안에 새로운 격리된 환경을 만들 수 있지만, 보안상의 문제로 권장하지 않는 방식이다.
DooD(Docker Out of Docker)
컨테이너 내부에서 외부 도커 데몬을 사용하는 형태로, 어느 방식이든 보안에 취약하고 CI/CD 측면에서 굉장히 복잡하다.
*참고자료 - https://stir.tistory.com/237?category=835237
컨테이너 기반의 오픈소스 가상화 플랫폼
컨테이너는 안에 들어있는 화물, 제품 등의 내용물을 규격화하여 다양한 운송수단으로 이를 쉽게 옮길 수 있다. 서버에서의 컨테이너 역시 다양한 프로그램, 실행환경을 하나로 추상화하고 동일한 인터페이스를 제공해줌으로써 배포 및 관리를 단순화해준다.
백엔드 프로그램(Springboot, Node.js 등), DB 서버(MySQL, MariaDB, RDS 등) 어떤 프로그램도 컨테이너로 추상화할 수 있으며, AWS, Azure 등 어디에서든 실행할 수 있다.
ex. 구글에서는 모든 서비스들이 컨테이너로 동작하며, 매주 20억 개의 컨테이너를 구동한다.
격리된 공간에서 프로세스가 동작하는 기술
기존에 VirtualBox, VMWare를 설치하여 OS를 설치하는 가상화 방식을 OS 자체를 가상화하는 루틴으로 이루어졌다. 이 방식은 여러가지 OS를 가상화할 수 있고 사용법도 간단하지만, 무겁고 느리다는 큰 단점이 있다
이를 개선하고자 OS가 아닌 CPU의 가상화(HVM) 기술을 이용한 KVM(Kernerl-based Virtual Machine)과 반가상화(Paravirtualization) 방식의 Xen이 등장하였다. 이 방식은 게스트 OS가 필요하긴 하지만, 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식보다 훨씬 성능이 향상되었다.
이러한 기술들은 AWS 등의 클라우드 서비스에서 제공되는 가상 컴퓨팅 기술의 기반이 되었다.
추가적인 OS를 설치하는 접근은 늘 성능 문제를 초래했고, 이를 개선하고자 프로세스를 격리하는 방식이 등장했다. 리눅스에서는 이를 ****리눅스 컨테이너****라고 하며 단순히 프로세스를 격리시켜 가볍고 빠르게 동작한다. CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용되므로 성능의 손실도 거의 없다.
하나의 서버에 여러 개의 컨테이너를 실행하면, 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 듯한 느낌을 준다. 실행중인 컨테이너에 접속하여 명령어 입력이 가능하며, yum, apt-get을 사용한 패키지 설치도 가능하다. 또한, 사용자 추가, 프로세스 백그라운드 실행 등도 모두 가능하다.
Docker는 성공적인 오픈소스 컨테이너 기술로, VM과는 비교도 할 수 없이 모든 측면에서 빠르다.
컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것
컨테이너는 이미지를 실행한 상태로 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수도 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있는다.
ex. 우분투(ubuntu) 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고, MySQL 이미지는 debian 기반으로 MySQL을 실행하는 데 필요한 파일, 명령어, 포트 정보 등을 가지고 있다.
🐳 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에, 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다. **새로운 서버가 추가된다면, 미리 만들어둔 이미지를 다운받고 컨테이너를 생성하면 된다.** 즉, 한 서버에 여러 개의 컨테이너를 실행할 수 있고 무한대의 서버도 가능한 것이다.⇒ 도커 이미지는 Dockerhub 에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다.
정리하자면, Docker는 컨테이너라는 프로세스를 격리시켜 동작하는 방식을 사용하여 리눅스가 설치된 Host OS 위에 Docker 엔진을 사용하면 Application에 필요한 바이너리만 올라가게 되는 컨테이너 기반 가상화가 구현될 수 있다.
GitHub과 같은 개념의 Docker Hub를 이용하여 도커 이미지를 저장하고 관리할 수 있다.
Dockerfile, docker-compose.yml 파일 작성
*Dockerfile과 docker-compose.yml 파일의 차이점
Dockerfile | docker-compose.yml | |
---|---|---|
역할 | 하나의 도커 이미지를 생성하기 위한 파일 → run에 대한 정의 존재 (실제 run은 X) | 여러 이미지들을 빌드하고, 컨테이너 간의 네트워크를 연결하며 파일 시스템 공유방식을 결정해주는 등 환경을 제어하기 위한 파일 → build, run을 모두 실행 가능 |
특징 | 파일 이미지만 작성했다면 다른 컴퓨터에서도 동일한 환경을 올릴 수 있다. | Dockerfile만 작성했다면 docker run 명령어를 따로 실행해야 하지만, 설정값들도 한번에 주어져야 하는 경우가 대다수이기 때문에 docker-compose로 정의하고 관리하는 것이 일반적이다. |
이미지 생성
docker build -t {이름} .
이미지 확인
docker images
도커 원격 레포지토리에 올리기 위해 로그인
docker login
기존 이미지에 tag 달려면?
*로그인 후에 태그 달기 가능
docker tag {username}/{이미지명}:{태그명}
도커 원격 저장소에 push
docker push {username}/{이미지명}:{태그명}
도커 이미지 pull 받을 때
docker pull {username}/{이미지명}:{태그명}
도커 이미지 실행
docker run -d -p 서버포트:도커포트 {username}/{이미지명}:{태그명}
도커 동작 상태 확인
docker ps -a
docker logs {username}/{이미지명}:{태그명}
*참고 자료 -https://velog.io/@rodom1018/github-push-docker-자동-배포