[생성한 이미지로 컨테이너 생성]
docker create --name test1 httpd
Error response from daemon: no command specified
[Dockerfile 생성]
# Dockerfile
FROM httpd
CMD ["httpd-foreground"]
[Dockerfile 실행]
docker build -t Dockerfile .
[첫번째]
docker create --name test1 httpd
-----------------------------
[두번째]
docker create --name test1 httpd httpd-foreground
c953d6af65092cae3513766bb6d42e3518c00c3c5824cdf29ea626b685c3b41c
현재 디렉터리 안에 DOCKERFILE
Dockerfile 없이도 실행 가능한 이유는?
도커 이미지 내부에
CMD가 기본값으로 설정
docker create나 docker run에서 명령어를 직접 입력하면,
Dockerfile 안의 CMD나 ENTRYPOINT는 무시 / 지정한 명령 실행
즉:
docker create --name test1 httpd
→ 이미지에 있는 기본 CMD 사용 (CMD ["httpd-foreground"])
docker create --name test1 httpd httpd-foreground
→ 명령어를 직접 override한 것. (Dockerfile 없어도 OK)
docker import test.tar > test11
"Docker 이미지로 가져오기(import)"를 실행하고,
표준 출력(stdout) 결과를 test11이라는 텍스트 파일로 저장
docker import는 이미지를 Docker에 정상 등록
> test11은 그 출력 결과(예: 이미지 ID) 를 텍스트 파일로 따로 저장
즉, 이미지는 정상적으로 Docker에 등록되어 있고, test11은 그 로그
🧩 docker import 주요 옵션들
1. -message, m
- 설명: 이미지 생성 시 커밋 메시지를 추가할 수 있어.
- 예시:
- docker import -m "Initial import from tar" test.tar
2. -change, c
- 설명: Dockerfile 명령어처럼 이미지 설정을 변경할 수 있어 (예: ENV, CMD, EXPOSE 등).
- 예시:이건 가져온 이미지에 환경 변수와 기본 명령어를 지정해주는 거야.
- docker import -c "ENV LANG=C.UTF-8" -c "CMD /bin/bash" test.tar
3. -platform
- 설명: 특정 플랫폼(예: linux/amd64, linux/arm64)으로 가져오고 싶을 때 사용.
- 예시:단, 플랫폼 지정은 도커 버전 및 설정에 따라 동작이 다를 수 있어.
- docker import --platform=linux/amd64 test.tar
4. URL 또는 STDIN 사용
- .tar 파일을 로컬이 아니라 URL에서 바로 가져오기도 가능해:
- docker import <https://example.com/myimage.tar> myimage:latest
- 또는 표준 입력으로 전달도 가능:
- cat test.tar | docker import - myimage:latest
[dockerfile 이용한 이미지 생성]
from : 이미지 정보
run : 컨테이너 내부에서 명령 설정
cmd : 구동시 실행프로세스/데몬설정
env : 환경 설정
-----------------------
from ubuntu
env var=1
run apt-get update
cmd ["bash"] /bin/bash
from httpd
copy ./index.html /usr/local/apache2/htdocs
상대경로 사용 가능 ./
도커 파일이 현재 start 디렉안에 있다면 b/index.html
절대경로 사용 가능 /b/index.html
Dockerfile 있는 현재 디렉터리 기준으로 경로 설정
같은 디렉터리에 있을 경우
./파일명 | 파일명
docker build -t mytest . -f Dockerfile2
파일명 변경 시 이용 -f [name]
🛠 예:
project/
├── Dockerfile
└── var/
└── www/
└── html/
└── index.html
빌드 디렉터리 = root 디렉터리
/start
/start/a - Dockerfile
/start/b - index.html
Dockerfile은 어디든지 생성가능
Dockerfile 안에 작성한
COPY ./b/index.html /usr/local/apache2/htdocs/
cd Start
docker build -f a/Dockerfile -t myhttpd .
COPY 명령에서 복사할 파일의 경로는 반드시 **"빌드 컨텍스트 내부의 상대 경로"**
다른 디렉터리에 있을 때 파일명까지 지정
docker build -t test . -f /var/www/html/index.html
start 강당 안에
a 파티션 / b 파티션있고
a에 도커파일
b에 인덱스
빌드하려면 a,b 가 보이는 강당에서 빌드 진행
상위디렉터리에서는 다 보이니까
상위디렉에서는 경로 지정해서 빌드 가능
도커 입장에서 파일이 보이기만 하면 빌드 가능
도커파일 작성 시에는
🔥 핵심 요약
구분 의미 예시
-f 옵션 | Dockerfile이 있는 위치 | -f a/Dockerfile |
마지막 인자 (.) | 빌드 컨텍스트 (파일을 찾는 기준 경로) | . = 현재 디렉토리 (예: Start/) |
Dockerfile
COPY 작성 시 복사할 경로
빌드 컨텍스트 안에서 볼 수 있는 내부 경로여야만 한다
도커파일 자체는 어느 디렉에 있든지 상관없다
빌드 진행할 디렉 안에 있는 경로에 복사할 파일을 두고
COPY 경로 설정 시 해당 경로 설정
docker build -t [name] . -> 연결 -> ./a/index.html
다른 경로인 경우 별도 지정
. -f /var/www/html/index.html
Step 1: 컨테이너 생성 이미지 a 생성
우선 Ubuntu 베이스로 아주 단순한 컨테이너 만들고, 그걸 이미지로 저장해서 a를 만들자!
# 우분투 컨테이너 실행
docker run -it --name base-test ubuntu /bin/bash
컨테이너 안에 들어가면 원하는 대로 설정해도 돼. 예를 들어 vim, curl, nano 깔아보거나 그냥 나가도 돼.
컨테이너에서 나올 땐:
exit
컨테이너가 멈춘 상태일 때, 아래 명령으로 이미지 a 생성:
bas
docker commit base-test a
이제 docker images 해보면 a 이미지가 생겼을 거야.
Step 2: a를 기반으로 한 Dockerfile 만들기
이제 CMD 명령을 추가해서 새로운 b 이미지를 만들어보자.
# Dockerfile
FROM a
CMD ["bash"]
이 파일을 현재 디렉토리에 Dockerfile 이름으로 저장해줘.
Step 3: b 이미지 빌드
docker build -t b .
이제 b 이미지가 a를 기반으로, 실행 시 bash를 기본 명령어로 갖게 된 상태야.
Step 4: b 이미지 실행해보기
docker run -it --name b-test b
→ 바로 bash 셸로 진입할 거야.
a는 실행하려면 명령어를 줘야 했지만, b는 CMD 덕분에 자동으로 실행됨!
Dockerfile
from ubuntu
run apt-get update && apt-get -y install nginx
copy ./index.html /var/www/html
cmd ["nginx","-g","daemon off"]
🗂️ 1. 디렉터리 구조
test-docker/
├── Dockerfile
├── file1
📄 2. file1 내용 (호스트에서 읽어줄 텍스트 파일)
file1
Hello from the host file!
🐳 3. Dockerfile (간단한 Alpine 이미지 기반)
Dockerfile
FROM alpine:latest
CMD ["sh"]
🛠️ 4. Docker 이미지 빌드
cd test-docker
docker build -t test .
🚀 5. 컨테이너 실행해서 file1 내용 확인
docker run --rm -v "$(pwd)/file1:/tmp/file1" test cat /tmp/file1
docker run --rm -v "$(pwd)/file1:/tmp/file1" test cat /tmp/file1
현재 디렉터리에서 명령 실행
현 디렉에
docker run --rm -v "$(pwd)/f:/var/www/html" test cat /var/www/html/index.html
여기서 핵심은 -v "$(pwd)/file1:/tmp/file1" 옵션인데,
이건 호스트의 file1 파일을 컨테이너 내부의 /tmp/file1 경로에 마운트한다는 뜻이야.
"$(pwd)/:/var/www/html" 옵션
호스트의 현재 디렉터리 내부 파일 및 전체 디렉터리 자체를
컨테이너 내부 경로에 마운트한다
🔹 file1 파일은 Dockerfile이 있는 현재 디렉터리(즉, $(pwd) 경로)에 있어야 해.
$(pwd)/file1 ← 이 경로가 실제 파일을 찾는 위치야. 여기에 file1이 없다면 에러 나고 실행이 안 돼.
✅ v 없이 파일을 사용하고 싶을 때:
- Dockerfile 작성 예시:
FROM ubuntu:20.04
COPY file /tmp/(file)
- 호스트에 file이 있어야 해:
echo "Hello from inside image" > file
- 이미지 빌드:
docker build -t test .
- 컨테이너 실행:
docker run --rm test cat /tmp/file
이렇게 하면 -v 없이도 /tmp/file을 출력할 수 있어.
즉,
- v 사용: 호스트 파일을 그대로 사용할 때 (동기화)
- COPY 사용: 이미지 안에 파일을 넣을 때 (정적 포함)
정리하자면:
방법 장점 단점
-v 사용 | 호스트 파일 바로 사용, 실시간 변경 반영 | docker run 명령이 길어짐 |
COPY 사용 | 이미지에 파일 내장, 독립적 실행 가능 | 변경 시마다 docker build 다시 해야 함 |
tar -czf docker.tar.gz Dockerfile index.html
docker build -t myweb3 - < docker.tar.gz
🔹 명령 설명
tar -czf docker.tar.gz Dockerfile index.html
- Dockerfile과 index.html을 하나의 gzip 압축된 tar 파일(docker.tar.gz)로 만든다.
- 이때 Dockerfile이 포함돼야 Docker가 빌드할 수 있어.
docker build -t myweb3 - < docker.tar.gz
-
- 는 표준 입력(stdin) 을 의미.
- < docker.tar.gz로 아카이브 파일을 표준 입력으로 전달해서 이미지를 빌드한다.
- t myweb3: 이미지 이름은 myweb3로 지정.
docker build - < docker.tar.gz 명령을 쓰면,
Docker 엔진이 내부적으로 압축을 풀고 빌드 컨텍스트로 사용
해제 명령어를 직접 입력하지 않아도, Docker가 알아서 푸는 거야.
빌드 명령어 자체가 도커파일을 통해 빌드 컨텍스트로 사용해야되기에
내부적으로 해당 파일을 풀고
Dockerfile을 찾은 다음 빌드 컨텍스트로 사용한다
빌드 명령어 자체가 도커파일을 통해 빌드 컨텍스트로 사용해야되기에
내부적으로 해당 파일을 풀고 Dockerfile을 찾은 다음 빌드 컨텍스트로 사용한다
'IT 엔지니어 > CLOUD' 카테고리의 다른 글
Docker Registry (0) | 2025.05.17 |
---|---|
Docker image build (0) | 2025.05.16 |
Docker image (0) | 2025.05.14 |
Docker Resource Limit (0) | 2025.05.13 |
Docker -1 (0) | 2025.05.13 |