Docker

skyju·2023년 4월 4일
1

Dev-ops

목록 보기
2/3

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/

  1. 구버전 Docker를 사용하고 있다면, 삭제합니다.
sudo apt-get remove docker docker-engine docker.io containerd runc
  1. Docker를 처음사용한다면 docker repository 환경을 구성해야 합니다.
    우선, 패키지들이 최신 버전인지 확인하고,
    HTTPS 를 통해 repository를 이용하는 것을 허용해주어야 하는 필수 패키지를 설치합니다.
sudo apt-get update & upgrade
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. Docker 공식 GPG key 생성합니다. 변조된 도커 이미지를 받는 것을 방지하는 데 사용됩니다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 환경에 따라 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
  1. Docker 설치합니다.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Jenkins를 이용하여 Docker in Docker 환경 구축하기 (CI/CD를 구성해보자..)

  1. 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
  1. Jenkins Container로 접속하고 Docker를 설치합니다. 구버전을 삭제합니다.
docker exec -it jenkins /bin/bash
apt-get remove docker docker-engine docker.io containerd runc
  1. 위의 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 전체 과정 요약

  1. ec2에 docker(1)와 jenkins, nginx, certbot install
  2. docker(1)이용하여 jenkins를 컨테이너로 띄우기
  3. jenkins 컨테이너에 접속하여 docker(2) install
  4. 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
profile
https://github.com/skyju

0개의 댓글