Docker

Docker 이미지 만들기-docker build, docker commit

thxxyj 2023. 3. 23. 00:16
728x90

docker image 만드는 방법

1. docker build: Dockerfile을 이용하여 이미지 생성

2. docker commit: docker container에서 수정 후 이미지 생성

 

1. docker build로 이미지 만들기

Dockerfile 만들기

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

  • FROM : base image 지정하는 명령어
    ex) FROM ubuntu:latest
  • RUN : build 과정에서 실행하는 명령어
    ex) RUN apt-get update &&  apt-get -y install apt-transport-https
  • WORKDIR : 작업 디렉토리 지정하는 명령어 / 해당 디렉토리가 없으면 생성
  • COPY : host에 있는 파일을 image 에 복사하는 명령어
    ex) COPY ["index.html", "."]   # host의 index.html 파일을 WORKDIR(.)에 복사 (. 이 아닌 다른 경로로 설정 가능)
  • CMD : 컨테이너 생성하여 최초로 실행할때 실행될 명령어
    ex) CMD ["/usr/sbin/sshd", "-D"] 또는 CMD ["echo", "CMD test"]
  • ENTRYPOINT : 컨테이너 생성하여 최초로 실행할때 실행될 명령어
    ex) ENTRYPOINT ["echo", "ENTRYPOINT test"]
더보기

* CMD vs ENTRYPOINT

CMD는 컨테이너 실행할때 변경 가능 / ENTRYPOINT는 컨테이너 실행할때 항상 실행

ex) CMD ["echo", "CMD test"] / ENTRYPOINT ["echo", "ENTRYPOINT test"] 내용이 있는 이미지로 컨테이너 실행

--> docker run ${image} echo hello

--> CMD: hello 출력 / ENTRYPOINT: ENTRYPOINT test hello 출력

 

* Dockerfile 예시 https://github.com/cseelye/docker-linux-shell/blob/master/Dockerfile

 

Dockerfile로 이미지 빌드하기

docker build [OPTIONS] PATH | URL | -

# 사용 예시
# .: Dockerfile 위치 (PATH)
# -t: image:tag 
# -f: PATH에 Dockerfile이 아니라 다른 이름으로 저장된 경우 파일 경로/이름

docker build -t ${image_name}:${tag_name} -f ${Dockerfile_path} .
ex) docker build -t thxxyj/test_app:1.0 .
ex) docker build -t thxxyj/test_app:1.0 -f /data/docker_setting/Dockerfile_test .

 

* docker build 시작했는데 "Sending build context to Docker daemon xxx MB" 로그가 나온다면, 

Dockerfile이 위치한 디렉토리와 그 하위의 모든 파일이 Docker daemon으로 전송될때 나오는 로그이다.

파일의 개수가 많거나 용량이 큰 경우 빌드하는데 시간이 오래걸린다.

해결) .dockerignore 파일을 통해 불필요한 파일은 docker context에서 제외하도록 한다.

https://docs.docker.com/engine/reference/builder/#dockerignore-file

 

2. docker commit으로 이미지 만들기

1. ubuntu:20.04 이미지 설치 >> docker pull ubuntu:20.04

2. 컨테이너 실행 >> docker run -d --name ubuntu -p 22:22 -it --privileged ubuntu:20.04

3. 컨테이너에서 패키지 설치

# 1. ifconfig 동작안함
root@eed4a3935379:/# ifconfig
bash: ifconfig: command not found

# 2. 패키지 설치
root@eed4a3935379:/# apt install net-tools

# 3. ifconfig 동작
root@eed4a3935379:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
(....)
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0

4. commit 명령어로 이미지 생성 >> docker commit ${conatiner_name}  ${new_image}:${tag}

root@test-server:~# docker commit ubuntu_2004 ubuntu/net-tools:20.04
sha256:6ca5f532080153dfadd502084238cfe6ab2847bdf1b34c5e8a34608be7823455

root@testworks-tfs:~# docker images
REPOSITORY                              TAG       IMAGE ID       CREATED              SIZE
ubuntu/net-tools                        20.04     6ca5f5320801   About a minute ago   213MB
ubuntu                                  20.04     1c5c8d0b973a   2 weeks ago          72.8MB

 

3. docker hub에 push하기

1. docker login (username, password 입력)

root@server:~# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.                           com to create one.
Username: MYDOCKERID
Password:
WARNING! Your password will be stored unencrypted in /home/user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 

2. docker push ${new_image}:${tag}

root@server:~# docker push MYDOCKERIMG:1.0
The push refers to repository [docker.io/MYDOCKERID/MYDOCKERIMG]
b0e9d35cb0e8: Pushed
(.....)
cf2e8433dbf2: Layer already exists
1.0: digest: sha256:073...893 size: 5133

 

728x90