[DOCKER] Docker 이미지 만들기

Posted by Albert 784Day 15Hour 25Min 31Sec ago [2023-02-25]

Docker 이미지 만드는건 2가지가 있다.

1. commit 방식: 기존 이미지를 특정이름으로 접근 후 필요한 작업을 해놓고 해당 이름으로 commit 하여 신규 이미지 만든다.

2. Dockerfile 에 어떠한 이미지 기반에서 어떤 프로그램들을 어떻게 설치할지 텍스트로 나열하여 build 시 나열된 업무를 수행하게 되고 수행완료된 이미지가 생성된다.

(1번보다 2번Dockerfile 을 만들어 사용하는것이 일상적다.)


commit 방식

1) ubuntu 이미다운로드 및 abt-ubuntu라는 이름으로 실행

[albert@docker ~]$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
677076032cca: Pull complete
Digest: sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
[albert@docker ~]$ docker run -it --name abt-ubuntu ubuntu bash


2) 실행된 컨테이너에 git 설치

root@ff33b6506455:/' apt update
root@ff33b6506455:/' apt install git
root@ff33b6506455:/' exit


3) ubuntu와 git 설치된 abt-ubuntu 컨테이너로 신규 이미지 생성

[albert@docker ~]$ docker commit abt-ubuntu albert:ubuntu-git
sha256:748ee2c3abf25cd32772169a2fdfb60ca30592026ef3334ce6f5fc31c31c7f47
[albert@docker ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
albert ubuntu-git 6cc08eca0cff 17 minutes ago 195MB
ubuntu latest 58db3edaf2be 4 weeks ago 77.8MB


Dockerfile 방식

1) 파일을 만들 위치로 이동하여 Dockerfile 파일 만들고 않에 git 설치하는 명령어 추가하고 build진행

[albert@docker ~]$ cd /home/albert/
[albert@docker ~]$ ls
공개 다운로드 문서 바탕화면 비디오 사진 서식 음악
[albert@docker ~]$ pwd
/home/albert
[albert@docker ~]$ touch Dockerfile
[albert@docker ~]$ vi Dockerfile

Dockerfile 내용(ubuntu 이미지 기반으로 만들며 apt 업데이트 및 git 설치하는 로직이 들어있다.)

FROM ubuntu
RUN apt update && apt install -y git

build 하기(명령문중 뒤에 .을 잊지말기 ^^)

[albert@docker ~]$ docker build -t albert:ubuntu-git2 .
[+] Building 240.5s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 145B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [1/2] FROM docker.io/library/ubuntu 0.0s
=> [2/2] RUN apt update && apt install -y git 239.8s
=> exporting to image 0.6s
=> => exporting layers 0.6s
=> => writing image sha256:6cc08eca0cffd1399e428b295798227ca1eb8177db83ea0c9ed29793e7aff731 0.0s
=> => naming to docker.io/library/albert:ubuntu-git2

생성된 이미지 리스트 확인하면 ubuntu-git2이미지가 생성된걸 확인할 수 있다.

[albert@docker ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
albert ubuntu-git2 6cc08eca0cff 9 seconds ago 195MB
albert ubuntu-git ed00e2cd0f56 23 minutes ago 195MB
ubuntu latest 58db3edaf2be 4 weeks ago 77.8MB


Dockerfile 내용은 제일간단한거고 실제운영 및 배포시에는 많은 라인이 추가될수있다. 

Dockerfile 명령어 키워드
Dockerfile에서 사용되는 명령어 키워드를 간단하게 알아보자.

FROM : DockerfileFROM으로 시작한다.
FROM <IMAGE_NAME>
커스텀 이미지의 기반이 되는 이미지 이름을 지정해준다.
이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 바로 사용하고, 없으면 Docker Hub에서 받아온다.

RUN : 명령어를 실행하는 키워드. 쉘 스크립트 구문이 실행됨.
FROM으로 설정한 이미지에 포함된 /bin/sh 실행 파일을 사용하게 되며 /bin/sh 실행 파일이 없으면 사용할 수 없음.
RUN <COMMAND>
** RUN이 실행될 때마다 Layer가 생성되어 저장된다.

WORKDIR : 해당 디렉터리가 없다면 만들고, 사용자를 해당 디렉터리로 이동시킨다.
작업할 디렉터리를 설정하는 것이다.
WORKDIR <PATH>

COPY : 호스트OS의 로컬 파일 또는 디렉토리를, 이미지(컨테이너) 내의 경로로 복사한다.
COPY <Host복사할 파일 경로> <이미지에서 파일이 위치할 경로>

CMD : 컨테이너가 시작될 때 스크립트 혹은 명령을 실행한다.
docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행되는 명령어를 지정. CMDDockerfile에서 한 번만 사용할 수 있다.
CMD <COMMAND>

** CMD에 쓴 명령어는 컨테이너 실행(run)시에 오버라이딩 될 수 있다 **
docker run --name web-server web-server-build pwd 라는 명령어로 컨테이너가 실행될 때 pwd가 실행되도록 한다면, CMD에 설정된 커맨드 대신 pwd가 실행되는 것이다.

** RUNCMD의 차이점 **
RUNBuild가 되는 시점에 실행되는 명령어 -> 이미지에 반영된다.
CMDContainer가 실행되는 시점에 실행되는 명령어 -> 컨테이너에 반영된다.


참고: https://velog.io/@monadk/Docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0




LIST

Copyright © 2014 visionboy.me All Right Reserved.