Docker?
- 출처 : https://www.redhat.com/ko/topics/containers/what-is-docker
- Docker를 사용하면 컨테이너를 매우
가벼운
모듈식가상 머신
처럼 다룰 수 있습니다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을클라우드에 최적화
하도록 지원합니다.- Docker 기술은 Linux 커널과 Cgroups 및 네임스페이스 등
커널의 기능
을 사용하여 프로세스를 분리함으로써독립적
으로 실행할 수 있도록 합니다. 이러한 독립성은 컨테이너의 본래 목적입니다. 다시 말해서, 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고개별 시스템을 사용할 때와 동일한 보안
을 유지할 수 있습니다.- Docker를 포함한 컨테이너 툴은
이미지 기반 배포 모델
을 제공합니다. 따라서 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유할 수 있습니다. 또한 Docker는 이 컨테이너 환경 내에서 애플리케이션(또는 애플리케이션을 구성하는 결합된 프로세스)배포를 자동화
합니다.
우리는 왜 도커를 쓰는가?
- 빠르게 필요한 서버를 증설할 수 있다.
- 기존에는 vm을 증설하는 방식을 사용했었다. vm이 부팅되는 1분이면 서비스 전체가 중지되기에 충분한 시간이다.
- 운영체제를 부팅해야 하는 기존의 방식보다 빠르다.
- 이미지를 만들어두면 찍어내기만 하면 되는 배포의 편의성(w/k8s)을 갖추고 있다.
어디까지 도커화 해야할까?
- 프론트엔드 / 백엔드를 나누는 것 까지는 필수로 생각해봅시다.
- 배포의 효율성 / 편의성을 생각해봅시다.
- DB / Jenkins / nginx는 선택적 사항입니다.
- db는 케바케. 하나의 db에 서비스가 몰려있으면 이미지화 잘 하지 않는다.
- 생각해 볼 문제
- db를 이미지화해서 새로 배포할 일이 많이 있을까? 옮긴다면 데이터는?
- 빌드 서버를 병렬적으로 추가 증설하는 경우는?
도커 사용 메모
▼ AWS EC2 ubuntu환경 입니다.
▼ Docker docs
https://docs.docker.com/engine/install/ubuntu/
- 구버전 Docker를 사용하고 있다면, 삭제합니다.
sudo apt-get remove docker docker-engine docker.io containerd runc
- Docker를 처음사용한다면 docker repository 환경을 구성해야 합니다.
우선, 패키지들이 최신 버전인지 확인하고,
HTTPS 를 통해 repository를 이용하는 것을 허용해주어야 하는 필수 패키지를 설치합니다.sudo apt-get update & upgrade sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release
- Docker 공식 GPG key 생성합니다. 변조된 도커 이미지를 받는 것을 방지하는 데 사용됩니다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 환경에 따라 Docker repository를 등록합니다.
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker 설치합니다.
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
Jenkins를 이용하여 Docker in Docker 환경 구축하기 (CI/CD를 구성해보자..)
- Docker를 이용하여 Jenkins를 컨테이너로 빌드합니다.
docker run -u 0 -d -p 9090:8080 -p 50000:50000 -v /var/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins jenkins/jenkins:lts
※ docker 설치 후 /var/run/docker.sock permission denied가 발생하는 경우
sudo chmod 권한 /var/run/docker.sock
- Jenkins Container로 접속하고 Docker를 설치합니다. 구버전을 삭제합니다.
docker exec -it jenkins /bin/bash apt-get remove docker docker-engine docker.io containerd runc
- 위의 Docker설치와 마찬가지로 필수 패키지 환경을 구성합니다.
apt-get update apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
D in D 전체 과정 요약
- ec2에 docker(1)와 jenkins, nginx, certbot install
- docker(1)이용하여 jenkins를 컨테이너로 띄우기
- jenkins 컨테이너에 접속하여 docker(2) install
- jenkins를 통해 띄울 서버를 docekr(2)를 통해 build
5-1. nginx에 deault(/etc/nginx/sites-available/default) 설정파일에 도메인명 작성
5-2. certbot사용하여 nginx에서 관리하는 domain에 대한 ssl인증서 획득
필수 Docker 명령어
# 상태 확인 systemctl status docker #도커 버전 확인 sudo docker versio # 삭제 sudo apt-get purge --auto-remove docker-ce docker-ce-cli containerd.to sudo rm -rf /var/lib/docker/ sudo rm -rf /var/ib/containerd/ # 이미지 저장 경로 확인 및 변경 sudo docker info | grep Root # 확인 sudo mkdir /<path>/Docker Images # 변경 경로에 dir 생성 sudo nano /lib/systemd/system/docker.service # docker 환경 세팅 변경 -- data-root=/<path>/Docker images/ # ExecStart 끝에 입력 # 도커 중지 sudo service docker stop # 도커 시작 sudo service docker start # 도커 상태 확인 sudo service docker status # 도커 컨테이너 ls sudo docker ps (-a) # 도커 볼륨 ls sudo docker volume ls # 도커 이미지 ls sudo docker image ls # 도커 컨테이너 rm sudo docker rm <container> # 도커 볼륨 rm sudo docker volume rm <volume> # 도커 이미지 rm sudo docker rmi <image> # 컨테이너 종료 sudo docker stop <container> # 컨테이너 시작 sudo docker start <container> # 컨테이너 진입 docker exec -it <container> /bin/sh # (또는 /bin/bash) # 컨테이너 로그 보기 docker logs <container> # 컨테이너 중지 없이 빠져나오기 ctrl + p + q
Docker Build
chmod 755 gradlew ./gradlew build CONTAINER_NAME=#server-name# if [ $( docker ps -a | grep ${CONTAINER_NAME} | wc -l ) -gt 0 ]; then docker stop ${CONTAINER_NAME} docker rm ${CONTAINER_NAME} fi docker build -t back-server . docker run -d -v /home/ubuntu/image:/home/ubuntu/image --name ${CONTAINER_NAME} -p 8080:8080 back-server
Docker compose 사용시
cd #server-dir# docker-compose up -d --build --force-recreate docker image prune -f