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
'Docker' 카테고리의 다른 글
Docker request timeout 이슈 해결 (0) | 2024.04.03 |
---|---|
[Docker] DEBIAN_FRONTEND=noninteractive (0) | 2023.03.26 |
Docker private(local) registry/Harbor 구축 (0) | 2023.03.17 |
[Docker] 다른 서버의 도커 이미지 가져오기-docker save, load (0) | 2023.01.24 |
docker, docker-compose 설치 on Ubuntu (0) | 2022.12.19 |