Docker

디하·2024년 6월 20일
1

배포

목록 보기
7/8
post-thumbnail

CI/CD 란?

Continuous Integration/Continuous Deployment(Delivery)의 약자
지속적인 통합과 지속적인 제공란 의미를 가지고 있다

  1. 지속적인 통합 : 코드의 지속적인 통합
    • 자동화된 빌드와 자동화된 테스트를 제공
    • 안정적인 코드를 빠르게 제공할 수 있는 밑거름이 된다
  2. 지속적인 서비스 제공
  3. 지속적인 배포 :
    • 배포를 자동화하여 배포 시간을 단축, 코드 결과물을 빠르게 지속적으로 제공

단계

1) 코드작성 : 개발자들은 소스코드를 작성하고 저장소에 업로드
2) 빌드: 저장소에서 최신 소스코드를 가져와 빌드를 수행 / 빌드는 소스코드를 컴파일하고, 라이브러리를 추가하고 필요한 파일을 생성하는 과정
3) 테스트: 빌드된 결과물을 대상으로 테스트를 수행. 테스트는 기능이 정상적으로 작동하는지 확인하고, 버그를 발견하고 수정하는 과정.
4)배포: 테스트를 통과한 결과물을 배포. 배포는 서버에 업로드하거나, 사용자에게 제공하는 과정


Docker를 사용하는 이유?

  1. 애플리케이션 개발과 배포가 편해짐

    • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없다
    • CI/CD 에서 지속적인 통합 과정의 테스트에서 Docker 를 활용함
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있음
  2. 여러 애플리케이션의 독립성, 확장성이 높아짐

  3. Docker가 가상화에서 사실상 표준의 위치이다


Docker 및 Docker Compose 설치 (MacOS용)

  1. brew 다운로드 하기
    https://brew.sh/ko
# docker for mac설치
brew install docker docker-compose

# docker version 확인
docker --version

# docker compose version 확인
	docker-compose --version
  1. Docker desktop 다운로드 하고 설치해주기
docker info
# docker에 nginx image 다운받기 
docker image pull nginx:1.25.3-alpine

# docker image 확인하기 
docker images

# image가 어떻게 구성되었는지 확인
docker image history nginx:1.25.3-alpine

# nginx 실행 (서버 이름 : webserver01)
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine

# nginx 서버가 잘 싱행되고 있는지 확인
docker ps | grep webserver01

# nginx 서버 port가 어떤건지 확인 -> 8001
docker port webserver01

# 8081 포트에 어떤 내용이 나오는지 확인 가능
curl localhost:8001


Docker Image 관리

  1. docker pull : Docker 이미지 내려받기
docker pull 
  1. docker image inspect: Docker 이미지 구조 확인
docker image inspect nginx:latest
[
    {
        "Id": "sha256:593aee2afb642798b83a85306d2625fd7f089c0a1242c7e75a237846d80aa2a0",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:add4792d930c25dd2abf2ef9ea79de578097a1c175a16ab25814332fe33622de"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-10-25T01:21:47.343274012Z",
        "Container": "1e4063a23e5d6d56cbf5478ff7227b8c6940152770a0770585c3ae9480478b66",
        "ContainerConfig": {
            "Hostname": "1e4063a23e5d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
…
  1. docker image history: Dockerfile에 대한 정보

-> 여러개의 계층 구조로 구성

  1. Docker login/logout : hub.docker.com에서 회원가입 후 실행
  • login

  • logout


Dokcer Container 와 Container를 다루는 CLI

Dokcer Image: 컨테이너에 대한 OS, Application, Library 등의 정보를 담고 있음
Docker Container : Image를 실행한 상태
- 1개의 Image로 부터 N개의 container를 생성할 수 있는 1:N의 관계

-> image : 붕어빵 틀 ( 만들고 싶은 붕어빵의 정보를 갖고 있는 틀)
-> container : 구워낸 붕어빵

- docker run 자주 사용하는 옵션
    - `-d`: detached mode; 백그라운드 모드
    - `-p`: 호스트와 컨테이너의 포트를 연결(포워딩)
    - `-v`: 호스트와 컨테이너의 디렉토리를 연결(마운트)
    - `-e`: 컨테이너 내에서 사용할 환경변수 설정
    - `-name`: 컨테이너 이름 설정
    - `-rm`: 프로세스 종료 시 컨테이너 자동 삭제
    - `-ti`: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션

docker container 정리

  • docker container prune : 실행 중이 아닌 모든 컨테이너를 삭제
# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트
docker container ls -a

# 
docker container prune
  • docker image prune: 태그가 붙지 않은(dangling) 모든 이미지 삭제
# 
docker image prune

# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls
  • docker system prune : 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
docker system prune

추가적으로 공부

Docker Container 실행 테스트

Docker Container 란?

컨테이너란 애플리케이션과 운영환경이 모두 들어있는 독립된 공간

  • 애플리케이션의 가상화
    - 경량의 독립 실행 형 소프트웨어 패키지
    - 코드, 런타임, 시스템도구, 시스템 라이브러리 및 설정과 같이 응용 프로그램을 실행하는데 필요한 모든 것을 포함

    ![](https://velog.velcdn.com/images/younssue/post/0d71648d-518e-4930-a844-0fba7587dc0a/image.png)

    출처: https://docs.docker.com/get-started/overview/

  • 컨테이너: 컨테이너느 하나의 프로세스 호스트 운영체제의 커널을 공유
    컨테이너 내의 프로세스는 격리되어 운영

  • 컨테이너 이미지 : 읽기 전용의 컨테이너 탬플릿 애플리케이션 실행환경, 소스, runtime 이 포함된 독립된 컨테이너 애플리 케이션

  • 컨테이너 레지스트리 : 컨테이너 이미지가 보관된 저장소 , 컨테이너 이미지는 읽기 전용


⚡️ docker container 실행 구조

공부하다가 docker container 실행 구조 가 이해가 가지 않아서 찾아보았다
docker container 실행 구조는 두가지로 나뉠 수 있다

docker 에서 컨테이너가 동작되기 위해서는 1) container 직접 build를 해서 이미지를 만들거나 2) 빌드된 컨테이너를 다운받아 (registry에서 이미지 pull) 만들어진
하나의 컨테이너 이미지를 저장시켜놓는다

그리고 저장된 상태의 이미지를 container 실행시켜 하나의 프로세스 (host)에서 동작될 수 있도록 한다

정리하자면,

  1. 컨테이너 직접 빌드하여 이미지 생성

    • Dockerfile 작성: 컨테이너의 설정 및 환경을 정의한 Dockerfile을 작성
    • 이미지 빌드: docker build 명령어를 사용하여 Dockerfile을 기반으로 이미지를 빌드
        docker build -t my-image 
    • 이미지 저장: 빌드된 이미지는 로컬 시스템에 저장됩니다.
  2. 빌드된 이미지 다운로드 (image pull)

    • 이미지 검색: Docker Hub 또는 다른 레지스트리에서 원하는 이미지를 검색

    • 이미지 다운로드: docker pull 명령어를 사용하여 이미지를 다운로드

      docker pull nginx:latest
    • 이미지 저장: 다운로드된 이미지는 로컬 시스템에 저장

  3. 실행 과정

    • 컨테이너 실행: 저장된 이미지를 기반으로 컨테이너를 실행합니다.
    docker run -d --name my-container my-image
    • 프로세스 실행: 컨테이너는 호스트 시스템에서 독립적인 프로세스로 실행됩니다.

profile
🖥️ ⌨️🖱️🩵

0개의 댓글

관련 채용 정보