레시피 생성과 이미지 빌드

알파로그·2023년 4월 25일
0

Linux 와 Docker

목록 보기
16/28

✏️ 필요성

  • 범용 이미지를 실행해 그 때 그 때 프로젝트에 맞게 변형시켜 사용해도좋지만,
    이 방법은 프로젝트를 세팅할 때 마다 원하는 방식으로 설정을 변경해줘야하는 번거로움이 있다.
    - 범용 이미지를 나의 상황에 맞게 바꾼뒤 도커 허브에 저장해두면 이 번거로움을 해결할 수 있다.

✏️ Dockerfile (레시피) 만들기

  • 위의 문제점을 해결하기위해 몇가지 방법이 있지만,
    레시피를 사용한 해결방법이 가장 많이 사용하는 방법이다.

📍 레시피

  • 레시피는 작업할 OS 가 다를경우 일률적으로 동일한 컨디션의 프로젝트를 빠르게 복사시킬 수 있게 해준다.
    • 만약 기존 OS 에 이미 다른버전의 프로그램이 설치되어있거나 실행프로그램 자체가 없더라도,
      레시피 내부에 실행할 프로그램도 입력해주면 도커가 기존 OS 와 격리된 환경에서 프로그램이 작동할 수 있게 만들어준다.

📍 소스코드 생성

  • 아래의 명령어를 입력해 소스코드가 적힌 파일을 생성한다.
    • 디렉토리는 정해진것이 없다.
    • 임의로 만든 디렉토리이다.
# 디렉토리 생성
mkdir -p /docker_projects/nginx_1/project

# 디렉토리 이동
cd /docker_projects/nginx_1/project

# 파일 생성
echo '<h1 style="color: blue">Hello Nginx</h1>' > index.html

# 제대로 생성되었는지 확인
cat index.html

📍 이미지 생성을 위한 레시피 만들기

  • vim 을 사용해 레시피를 저장할 파일을 만든다.
vim Dockerfile

  • 생성한 파일에 레시피를 입력하면 생성이 완료된다.
    • i 버튼을 눌러 끼워넣기 모드를 실행해야 편집할 수 있다.
    • 저장안하고 나가기 :q!
    • 저장하고 나가기 :wq!
# 베이스 이미지
FROM nginx

# 도커 컨테이너 내부의 디렉토리 이동
WORKDIR /usr/share/nginx/html

# 호스트 폴더(./) 의 내용을 /usr/share/nginx/html 폴더로 이동한다.
# 기존의 index.html 이 지워지고 우리가 만든 재료(index.html)가 저장된다.
COPY ./ ./

# 이 컨테이너는 80을 사용한다는 뜻 (설정해 놓는 편이 좋다.)
EXPOSE 80

✏️ 레시피를 사용해 이미지 생성하기

📍 레시피 대로 이미지를 생성하기

  • 아래의 명령어를 입력해 레시피를 기반으로 이미지를 생성할 수 있다.
    • -t : 생성할 이미지의 이름과 태그를 지정하는 옵션
    • . : 현재 폴더를 뜻한다.
      • Docker file 이 위치한 디렉토리에서 이미지를 빌드하겠다는 의미

docker build -t {이름, 태그} {레시피가 위치한 디렉토리}

# 현재 디렉토리에서 레시피를 찾아 
# nginx_custom_1 라는 이름과 태그를 가진 이미지를 빌드해라.
docker build -t nginx_custom_1 .

⚠️ 이미지를 pull 할 OS 버전이 맞지 않는다면 BUILD 할 때 버전을 명시해주서 해결할 수 있다.

docker build --platform linux/amd64 -t choidaekuk/project

⚠️ 같은 레시피를 두번 이상 Build 할 경우

  • 같은 이름의 레시피를 두번 이상 build 하면 기존 이미지의 이름은 <none> 으로 변경되고 새로운 이미지가 만들어진다.
    • 둘은 image id 값이 다르기 때문에 다른 이미지로 취급된다.

📍 이미지 확인

  • 아래 명령어를 사용해 빌드한 이미지가 잘 생성되었는지 확인할 수 있다.
docker images

  • 잘 생성 되었다.
    • 두번째 nginx 는 최초로 실행시켰던 기본 nginx 이다.
[root@localhost project]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
nginx_custom_1   latest    d013c87f1b6b   37 seconds ago   135MB
nginx            latest    9e7e7b26c784   12 days ago      135MB

✏️ 전부 다 삭제하고 레시피로 다시 실행해보기

📍 컨테이너 삭제

  • 아래 명령어를 사용해 컨테이너의 흔적 제거
    • ⚠️ 이미지를 직접 만든다고 해서 볼륨을 안써도 되는것은 아니다.
      • index.html 파일 수정이 필요할 경우,
        실무에서는 새 도커 이미지를 받아 실행하는 방식을 사용하기 때문에 볼륨도 삭제했다.
# 기존 도커 컨테이너 삭제
docker rm -f nginx_1

# 도커 볼륨 삭제
rm -rf /docker_projects/nginx_1/volumes

📍 레시피 기반 이미지 실행

  • 아래 명령어로 이전에 만들어뒀던 이미지를 실행한다.
    • 다 똑같지만 명령어 마지막 실행할 이미지만 우리가 빌드했던 이미지 이름을 입력해주면 된다.
docker run \
	--name=nginx_1 \
	-p 80:80 \
	-d \
	--restart="always" \
	nginx_custom_1 # 직접 빌드한 이미지 이름 입력

  • 실행중인 이미지를 확인하면 정상적으로 레시피 기반의 이미지가 생성된 것을 확인할 수 있다.
[root@localhost project]# docker ps
CONTAINER ID   IMAGE            COMMAND                   CREATED          STATUS          PORTS                               NAMES
e9f5d08cb84d   nginx_custom_1   "/docker-entrypoint.…"   17 seconds ago   Up 16 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx_1

📍 브라우저로 접속해보기

  • DNS 로 도매인을 만들어주었다면 url 로 접속할 수 있고,
    그렇지 않다면 ip 주소로 접속이 가능하다.
    [🔗  DNS 파일 수정하기](https://velog.io/@shdrnrhd113/DNS-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0)


🔗 노드 이미지 기반으로 실습해보기


✏️ 이미지 삭제하기

  • 아래 명령어를 입력해 보유한 이미지를 삭제할 수 있다.
docker rmi -f {이미지명}

  • 만약 이미지가 실행되고 있다면 삭제가 실패한다.
    • 이럴땐 이미지 실행을 멈추고 다시 삭제 명령어를 입력하면 된다.
docker rm -f {컨테이너 아이디}
profile
잘못된 내용 PR 환영

0개의 댓글