BackEnd Skils
[Backend] Dorker 총 정리
JellyApple
2024. 12. 30. 18:41
이번에 백엔드를 조금씩 맡으면서 도커를 사용할 일이 생겼으나 실제 설명과 그 때마다 검색하는 것으로는 영 이해가 되지 않아 이 참에 한 번 크게 정리하고자 했다.
- Docker?
- 애플리케이션을 실행하는 상자(컨테이너)를 만드는 도구
- 이 상자(컨테이너) 안에는 애플리케이션과 그것을 실행 하는 데 필요한 모든 것이 들어 있음.
- 즉, 애플리케이션이 어디서든 동일한 환경에서 실행되도록 상자(컨테이너)를 만들어서 이 문제를 해결함
- Docker는 이사박스 , 즉 물건을 상자에 넣으면, 어디로 이사를 가든 그 상자 안에 있는 물건은 똑같이 유지됨.
- Docker는 어플리케이션이 어디서든 동일한 환경에서 실행되도록 상자(컨테이너)를 만들어서 이 문제를 해결해줌
- 컨테이너?
- 컨테이너는 Docker가 만든 애플리케이션을 실행하는 상자
- 컨테이너 특징
- 상자 안에는 애플리케이션과 그 실행에 필요한 모든 것이 들어 있음(운영체제 일부, 라이브러리, 코드 등)
- 가볍고 빠르게 실행 가능함
- 각각의 컨테이너는 서로 독립적이다.
- 흔히 컵라면으로 비유할 수 있다.
- 컵라면 안에는 면 , 스프 , 포크 등 필요한 모든 것이 들어 있음.
- 물만 부으면 어디서든 바로 먹을 수 있음
- 컨테이너도 이렇게 필요한 모든 것을 포함해서, 어디서든 실행 가능하다.
- Docker Compose?
- 여러 개의 컨테이너를 한꺼번에 관리하는 도구
- 애플리케이션은 보통 여러 부분으로 구성된다.
- 예: 웹 서버, 데이터베이스 , 캐시 등
- 이걸 각각의 컨테이너로 만들고 실행하고자 하면 굉장히 번거로움.
- Docker Compose는 하나의 설정 파일(docker-compose.yml)로 여러 컨테이너를 정의하고 관리할 수 있게 해줌.
- 흔히 음식 배달 세트로 비유할 수 있다.
- 피자, 치킨, 음료 등 각각을 따로 주문하려면 번거롭지만, 세트 메뉴를 주문하면 한꺼번에 다 옴.
- Docker Compose도 여러 컨테이너를 한꺼번에 실행하고 관리한다.
- Docker, Docker Compose, 컨테이너의 관계
- Docker
- 컨테이너를 만드는 도구
- 상자를 하나씩 만들고 실행
- 컨테이너
- Docker가 만든 상자
- 애플리케이션을 실행하는 독립적인 환경
- Docker Compose
- 여러 컨테이너를 한꺼번에 실행하고 관리.
- 컨테이너 간의 네트워크, 데이터 연결 등을 설정
- Docker
- 실제 예시
- Docker
- 단일 컨테이너 실행
docker run -d -p 8080:80 nginx // Nginx 웹 서버가 실행되며, 로컬에서 8080번 포트로 접근 가능
- Docker Compose
- docker-compose.yml 파일로 여러 컨테이너 정의
b. 실행version: '3.8' services: web: image: nginx ports: - "8080:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: mydb
- docker-compose up
- Docker
⇒ Nginx 웹 서버와 MySQL 데이터베이스가 함께 실행 됨.
- 사용 이유
- 환경 일관성
- 내컴퓨터에서 잘 되던 애플리케이션이 서버에서도 동일하게 실행됨
- 빠른 배포
- 애플리케이션을 어디든 몇 초 만에 배포 가능
- 복잡한 애플리케이션 관리
- Docker Compose로 여러 컨테이너를 쉽게 정의하고 실행
- 효율성
- 가상머신보다 빠르고 가벼우며, 리소스를 적게 사용
- 환경 일관성
- Docker Hub?
- Docker 이미지를 저장하고 공유하는 공식 이미지 레지스트리
- Docker 컨테이너를 실행하기 위한 이미지들을 저장하고 다운로드 할 수 있는 클라우드 기반 이미지 저장소
- Docker Hub 역할
- 이미지 저장소
- Docker 이미지를 업로드 하고 저장.
- 로컬에서 만든 이미지를 Docker Hub에 업로드해 다른 사람과 공유 가능
- 이미지 다운로드
- 애플리케이션을 실행하기 위한 이미지를 Docker Hub에서 다운로드 가능
- 예: Nginx, MySQL, Node.js 등 인기 애플리케이션 이미지 바로 사용 가능
- 협업 도구
- 팀원이 같은 이미지를 사용하도록 공유 가능
- Private repository를 통해 민감한 이미지를 안전하게 관리
- 자동 빌드 지원
- GitHub 등과 연동해 코드 변경 시 자동으로 이미지를 빌드하고 업로드
- Docker Hub 주요 개념
- 이미지(Image)
- Docker 컨테이너 실행에 필요한 애플리케이션과 환경을 포함
- Docker Hub에서 제공되는 이미지:
- 공식 이미지(Official Images)
- Docker에서 인증한 이미지
- 안정성과 보안이 검증됨
- 예: nginx, mysql, node
- 커뮤니티 이미지
- 커뮤니티 사용자가 만든 이미지
- 다양하지만 신뢰성을 검증해야함
- 공식 이미지(Official Images)
- 레포지토리(Repository)
- Docker 이미지를 저장하는 공간
- GitHub 처럼 이미지 버전을 관리하고 공유 가능.
- 예:
- nginx: 공식 Nginx 레포지토리
- myusername/myapp : 사용자 정의 애플리케이션 레포지토리
- 태그(Tag)
- 레포지토리 내 이미지 버전을 식별
- 예 :
- nginx:lateset: 최신 버전의 Nginx.
- nginx:1.20: Nginx 1.20 버전.
- Docker Hub 사용 방법
- Docker Hub 계정 생성
- 로그인 후 레포지토리 만들거나 이미지 탐색 가능
- Docker CLI와 Docker Hub 연동
- 로그인 : Docker CLI에서 Docker Hub 계정에 로그인
docker login
- 사용자 이름과 비밀번호 입력
- 이미지 다운로드
docker pull <이미지이름>:<태그>
// docker pull nginx:lateset
- 이미지 실행
docker run -d -p 8080:80 nginx
⇒ 브라우저에서 http://localhost:8080 접속 시 Nginx 화면 확인
- 이미지 업로드
- 로컬 이미지에 태그 추가
docker tag <로컬이미지이름> <dockerhub계정명>/<레포지토리명>:<태그>
// docker tag myapp myusername/myapp:1.0
2. Docker hub로 푸시
docker push <dockerhub계정명>/<레포지토리명>:<태그>
// docker push myusername/myapp:1.0
- Docker Hub 에서 레포지토리 확인
- DockerHub 웹 사이트 → 로그인 → Repositories 탭에서 업로드된 이미지 확인 가능.
- 자동 빌드 설정
- GitHub 연동하여 코드 변경 시 자동으로 Docker 이미지를 빌드하고 Docker Hub에 업로드:
- Docker Hub → Create Repositiory 클릭
- Build Settings → Github 계정 연결
- 코듶 ㅜ시 시 Docker 이미지가 자동으로 빌드 및 업데이트
- GitHub 연동하여 코드 변경 시 자동으로 Docker 이미지를 빌드하고 Docker Hub에 업로드:
- Docker Hub와 Local Docker 간의 흐름
- 이미지를 다운로드
- docker pull mysql:8.0
2. 컨테이너 실행
- docker run -d mysql:8.0
3. 로컬에서 만든 이미지를 Docker Hub에 업로드
- docker push myusername/myapp:1.0
- Docker Hub를 사용하는 이유
- 이미지 공유
- 팀이나 커뮤니티와 이미지를 쉽게 공유 가능
- 공식 이미지 활용
- 안정적이고 신뢰할 수 있는 이미지 제공
- 자동화 지원
- GitHub와 연동하여 CI/CD 파이프라인 구축
- 클라우드 백업
- 로컬 이미지 손실 시 Docker Hub에서 다시 가져올 수 있음
- 이미지 공유
- Docker 이미지?
- Docker 이미지는 컨테이너를 실행하기 위한 청사진.
- 애플리케이션과 그 실행에 필요한 모든 파일(코드, 라이브러리, 의존성, 설정 등)이 포함된 불변의 파일 시스템 스냅샷
- 컨테이너는 이 이미지를 기반으로 실행되며, 이미지 자체는 실행되지 않는다. 즉, 이미지는 컨테이너를 생성하기 위한 설계도 또는 템플릿 역할을 한다
- Docker 이미지 주요 개념
- 이미지 구성
- Docker 이미지는 여러 계층(Layer)로 구성됨.
- 각 계층은 하나의 명령어 실행 결과를 저장한 결과물
- 계층은 읽기 전용(immutable)이며, 이미지를 업데이트 하면 새로운 계층이 추가됨.
- Docker 이미지는 여러 계층(Layer)로 구성됨.
- 이미지 특징
- 불변성
- 이미지 자체는 변경되지 않음. 변경이 필요하면 새로운 이미지를 생성함
- 경향성
- 여러 이미지가 동일한 계층을 공유하며 디스크 공간을 절약함
- 이식성
- Docker 이미지는 운영체제, 하드웨어, 클라우드에 상관없이 동일하게 실행됨
- 불변성
- 이미지 구성
- 이미지와 컨테이너의 관계
- 이미지
- 실행 준비가 완료된 정지된 설계도
- 컨테이너가 실행되기 위한 사전 정의된 상태
- 컨테이너
- 이미지를 실행한 실행 중인 상태
- 이미지를 기반으로 애플리케이션이 동작하며, 컨테이너 내부는 읽기/쓰기 가능함
- 이미지
- Docker 이미지의 주요 구성 요소
- 애플리케이션 코드 : 이미지에 포함된 프로그램 코드
- 필요한 라이브러리/패키지 : 애플리케이션 실행에 필요한 모든 파일(의존성)
- OS 레이어 : 최소한의 운영체제 파일(우분투, Alpine)
- Dockerfile 명령 실행 결과 : 이미지 생성 시 Dockerfile에서 실행된 명령 결과가 포함
- Docker 이미지와 계층(Layer)
- Docker 이미지는 계층으로 구성되며 , 계층은 이전 계층 위에 쌓여서 최종 이미지를 만든다.
- 계층의 특징
- 계층은 읽기 전용
- 계층은 변경되지 않으며, 새로운 계층이 추가될 때마다 업데이트됨
- 계층의 동작
- 여러 Docker 이미지는 동일한 계층을 공유할 수 있다.
- 예를 들어, python: 3.9 이미지를 기반으로 새로운 이미지를 생성하면, Python 계층은 여러 이미지에서 공유됨.
- Docker 이미지 사용법
- Docker Hub에서 이미지 다운로드
docker pull <이미지이름>:<태그>
2. 로컬 이미지 목록 확인 docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest d1a364dc5483 2 days ago 133MB
mysql 8.0 57f7eb58b147 4 days ago 500MB
3. 이미지 기반 컨테이너 실행
: Docker 이미지 기반으로 컨테이너를 실행함
docker run <이미지이름>:<태그>
- 이미지 생성
: 새로운 이미지는 Dorkerfile을 사용하여 생성함.
dorker build -t my-python-app:1.0 .
- Docker 이미지 사용하는 이유
- 환경 일관성
- 이미지는 개발 환경과 배포 환경을 동일하게 유지
- 모든 종속성과 설정이 포함
- 이식성
- 이미지가 클라우드, 로컬 , 서버 등 어디서나 동일하게 작동
- 경량성
- 가상머신보다 가볍고 빠르게 실행가능
- 버전 관리
- 이미지 버전별로 태그를 추가해 관리
⇒ Docker 컨테이너는 조립된 레고 결과물 → 이미지를 기반으로 실제로 실행되는 상태.
⇒ 블록 세트에 모든 재료와 조립 설명서(Dorkerfile)가 들어 있음 - 환경 일관성