Docker & Dockerfile

Coodori·2024년 1월 16일
0

Study

목록 보기
7/10
post-custom-banner

Docker

Docker는 개발자가 컨테이너를 빌드, 배포, 실행, 업데이트, 관리할 수 있는 오픈 소스 플랫폼입니다.

기존에 우리에게 익숙한 VM같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용.

OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없습니다.


하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진위에서 바로 동작하며 Host의 커널을 공유합니다. 커널을 공유하게 되면 io처리가 쉽게 되어 성능의 효율을 높일 수 있습니다.

컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다.

HOST에서 실행되는 격리된 각각의 환경을 Container라고 부른다.
이미 운영체제를 공유하므로 설치할 필요가 없음

Window는?
자신의 컴퓨터가 리눅스가 아니라면, 도커를 쓸 수 없을까? 그건 아니다. windows나 mac이라면 가상 머신을 설치하고, 그 가상머신에 리눅스를 깔면 리눅스 위에서 도커와 같은 컨테이너 기술을 사용할 수 있다
그래서 깔때마다 Hypervisor 나옴 - 해결방법 https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=brainkorea&logNo=222208329797&categoryNo=86&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search

Docker 명령어

  • docker pull
    도커도 docker hub에서 이미지를 다운 받는다. 이 이미지를 실행하는 주체를 Container, 한 이미지는 여러 컨테이너를 가질 수 있다.

  • docker images
    만들어진 이미지를 확인할때 쓴다

  • docker run [OPTIONS] IMAGE [COMMAND][ARG...]
    컨테이너를 만들 때 사용한다 즉, 새로운 컨테이너 환경을 만든다.


    -p 옵션 경우 호스트 80번 포트로 들어오는 요청을 컨테이너85번 포트를 연결하고 싶을떄 -p 80:85사용

  • docker ps
    컨테이너 목록을 출력하는 명령어

  • docker logs

    docker container 정보는 대부분 /var/lib/docker/containers/[Container-ID] directory 에 저장한다. 또한 로그역시 /var/lib/docker/containers/[Container-ID]/[Container-ID]-json.log에 저장

컨테이너 로그를 출력하는 명령어
docker logs test [Container-ID] -t --since 2023-12-15T02:00:00 | head -n 5
하면 2023/12/15 02:00:00 이후로그를 출력하되 timestamp를 적용하여 상위 5개만 출력

  • docker inspect
    컨테이너 모든 정보 확인

  • docker start/stop
    run 상태의 컨테이너를 그만 사용하고 싶다. 중지하고 싶다

  • docker rm
    만들어 놓은 컨테이너를 제거하려면 rm 을 사용한다.

    docker rmi 는 이미지를 삭제한다.

  • docker exec
    이미 실행중인 특정 컨테이너 환경을 디버깅 하는 용도이다.

    docker exec로 컨테이너 환경에서 다른 명령어를 실행하더라도, 기본적으로 컨테이너의 메인 프로세스에는 영향을 끼치지 않습니다.
    자세한 내용은 해당 링크 참조 https://www.lainyzine.com/ko/article/docker-exec-executing-command-to-running-container/

$ dokcer exec -it [Container name] bash처럼 bash 셸을 통해 탐색하는 것도 가능

docker exec [Container name] /bin/sh 도 가능하지만 bash 가 유저 정보가 담겨있어

  • docker tag (이미지:태그) (새로 명명할 이름:태그)

<Docker Hub 사용자명>/이미지명:[태그명]

이미지에게 새롭게 이름을 붙이는 것, 기존 이름을 변경하는 것이 아닌 새로 추가하는 것

태그는 추가하는 것이라 만약

에서 alicek106:test를 지운다고하면 태그만 사라진다.

고로 태그는 추가적인 명명일 뿐이지 이미지는 아니다.

  • docker build [OPTIONS] PATH | URL | -
    Dockerfile 을 이용해 구체적으로 시간의 순서에 따라 이미를 생성

    -t옵션은 태그를 가져오는것

  • docker commit
    현 상태를 시점으로 저장하여 이미지를 생성한다. 백업의 개념이다.

  • docker push
    다시 docker hub로 보내는 과정이다.

    사용법

    1. docker commit -m [image 설명] -a [ 사용자 mail ][ container Name or ID ] [ 생성할 image name : Tag ]
    2. docker tag [ image name or Tag ][ docker hub ID 혹은 private registry ip:port ] / [ push image이름 ]
    3. docker login
    4. docker push

Dockerfile은 DockerImage를 생성하기 위한 스크립트 파일

  • 관례상 대분자 사용
  • 주석은 # 뒤에 작성
  • 시간적 순서대로 실행

https://docs.docker.com/engine/reference/builder/

  • 장점1: 이미지가 어떻게 만들어졌는지를 기록
  • 장점2: 배포에 용이
  • 장점3: 컨테이너 이미지가 특정 행동을 수행(RUN, CMD)

Dockerfile 작성법

  • Dokcerfile을 작성 할 땐 실제 파일의 이름을 Dockerfile 로 해야함

ex) ubuntu에 아파치 서버를 설치하는 Dockerfile

ARG CODE_VERSION = latest
FROM ubuntu:${CODE_VERSION}

RUN apt-get update && apt-get install -y apache2

EXPOSE 80

CMD["apachectl","-D","FOREGROUND"]
  1. FROM - Base Image: 시작하는 이미지, 해당 문서 앞에 모든 것을 지운다.
  • ARG : 변수명 선언 (유일하게 FROM 앞에 선언 가능)
  1. RUN - 새로운 레이어에서 명령어를 실행하고 새로운 이미지를 생성

  2. EXPOSE: Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트

  3. ADD: Build 명령 중간에 호스트 파일 또는 폴더를 이미지에 가져오는 것

  • COPY와의 차이점: COPY는 진짜 복사만 실행, ADD는 압축파일이면 해제한 상태로 복사, 이외에도 파일을 복사하지 않고 다운로드 하는 기능이 있다.
  1. CMD: 컨테이너가 실행될 때 실행되는 명령어로 컨테이너에 반영
  • 도커파일에는 오직 1개의 CMD 명령어가 있을 수 있다. 주요 목적은 실행 컨테이너에 대한 기본 값제공

최종적으로 실행은?

Docerfile로 image 빌드

docker build -t apache-image .

확인

docker images 

COPY, ADD를 사용하면 정적인 시점의 파일을 옮겨준다.

그렇다면 지속적으로 변경하는 파일을 생성한 컨테이너에 연결하고 싶으면 어떻게 해야할까?

바로, 도커 볼륨을 사용해 호스트의 html 파일을 만들어 놓고 도커 컨테이너에서 그 파일에 접근해서 사용하는 방법으로 지속적 동기화

일단 index.html 생성

cd ~
mkdir html && cd html
vi index.html

한 이미지는 여러 컨테이너를 가질 수 있다. Image로 Container를 생성

docker run --name apache-container -d -p 80:80 -v ~/html/:/var/www/html apache-image
profile
https://coodori.notion.site/0b6587977c104158be520995523b7640
post-custom-banner

0개의 댓글