Dockerfile ๋ช ๋ น์ด
๊ธฐ๋ณธ ๋ช ๋ น์ด
-
FROM : ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ง์ (ํ์)
FROM python:3.12-slim FROM python:3.12-slim AS build-stage
- FROM์ ์ฌ๋ ค ๋ฒ ์ฌ์ฉํ๋ ๋ฉํฐ ์คํ ์ด์ง ๋น๋ ์ AS ๋ฅผ ํ์ฉํด ํด๋น base ์ด๋ฏธ์ง๋ฅผ reference ๊ฐ๋ฅ (COPY ์ฐธ๊ณ )
-
RUN : ์ ธ ์ปค๋งจ๋ ์คํ (์ด๋ฏธ์ง ์์ฑ ์ ์คํ๋จ)
RUN apt update && apt install -y curl
- ๋น๋ ์ค ์ปจํ ์ด๋ ์์์ ๋ช ๋ น์ด ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฏธ์ง ๋ ์ด์ด์ ์ ์ฅ
- FROM instruction์์ ์ง์ ํ ์ด๋ฏธ์ง์์ ์คํํ ์ ์์ด์ผ ํจ
-
ENTRYPOINT : ์คํ ๋ช ๋ น์ ๊ณ ์ ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉ (CMD๋ณด๋ค ์ฐ์ )
ENTRYPOINT ["python", "main.py"]
- Dockerfile์์ ์ค์ ํ๊ฑฐ๋, docker run ๋ช ๋ น์ด์์ ๋ช ์์ ์ผ๋ก ์ง์
-
CMD : ENTRYPOINT์ ๊ธฐ๋ณธ ์ธ์ ๋๋ ๋์ฒด ๋ช ๋ น์ด
CMD ["python", "app.py"]
- CMD๋ ํ๋๋ง ์กด์ฌํด์ผ ํจ (์ฌ๋ฌ ๊ฐ ์ฐ๋ฉด ๋ง์ง๋ง ๊ฒ๋ง ์ ํจ)
- ENTRYPOINT [โechoโ], CMD [โHello, World!โ] ์ธ ๊ฒฝ์ฐ docker run ํ๋ฉด Hello, World! ์ถ๋ ฅ
- docker run test Hi GPT! ํ๋ฉด Hi, GPT! ์ถ๋ ฅ
-
WORKDIR : ์ดํ ๋ช ๋ น์ด๊ฐ ์คํ๋ ์์ ๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
-
COPY : ๋ก์ปฌ ํ์ผ์ ์ด๋ฏธ์ง์ ๋ณต์ฌ
COPY . /app COPY requirements.txt . COPY --from=build-stage /build.txt /build.txt
- build-stage๋ผ๊ณ ๋ช ๋ช ํ base ์ด๋ฏธ์ง ๋ด์ โbuild.txtโ๋ฅผ ํ์ฌ base ์ด๋ฏธ์ง์ ๋ณต์ฌ
-
ADD : COPY์ฒ๋ผ ํ์ผ ๋ณต์ฌ. +URL์์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์์ถ ํ์ผ ์๋ ์์ถ ํด์ ๊ธฐ๋ฅ ํฌํจ
ADD https://example.com/file.tar.gz /files/
- ์์ธก ๊ฐ๋ฅ์ฑ, ๋ณด์, ์ ์ง๋ณด์์ฑ ๋๋ฌธ์ ๋ณต์ฌ ๋ชฉ์ ์ธ ๊ฒฝ์ฐ COPY๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ
-
ENV : ํ๊ฒฝ ๋ณ์ ์ค์
ENV ENV_NAME=production
-
EXPOSE : ์ปจํ ์ด๋๊ฐ ์ด ํฌํธ๋ฅผ ๋ช ์ (์ค์ ํฌํธ๋ฅผ ๋ ธ์ถํ๋ ๊ฑด ์๋)
EXPOSE 8080
-
VOLUME : ์ธ๋ถ ๋ง์ดํธ์ฉ ๋๋ ํ ๋ฆฌ ์ง์
VOLUME "/data"
- ์ปจํ
์ด๋ ๋ด๋ถ
/data
ํด๋์ ๋ด์ฉ์ ๋ณผ๋ฅจ์ ์๊ตฌ ์ ์ฅ
- ์ปจํ
์ด๋ ๋ด๋ถ
-
ARG : ๋น๋ ์์ ์์ ์ฌ์ฉํ ๋ณ์ ์ง์ (โbuild-arg์ ํจ๊ป ์ฌ์ฉ)
ARG VERSION=latest RUN echo $VERSION
-
USER : ํน์ ์ฌ์ฉ์๋ก ๋ช ๋ น ์คํ
USER nobody
-
SHELL : ๊ธฐ๋ณธ ์ ธ ๋ณ๊ฒฝ (๋ณดํต Windows์ฉ ์ด๋ฏธ์ง์์ ์ฌ์ฉ)
SHELL ["powershell", "-Command"]
๊ธฐํ ๋ช ๋ น์ด
-
ONBUILD : ์์ Dockerfile์์ ์คํ๋ ๋ช ๋ น์ ๋ฏธ๋ฆฌ ์ ์
ONBUILD COPY . /app ONBUILD RUN pip install -r /app/requirements.txt
- ์ฃผ๋ก base ์ด๋ฏธ์ง ์ปค์คํฐ๋ง์ด์ง์ ํ์ฉ
- ์์ธก ์ด๋ ค์ด ๋์์ด ์๊ธธ ์ ์์ด ์ฃผ์ ํ์
-
HEALTHCHECK : ์ปจํ ์ด๋์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๋ช ๋ น ์ค์
HEALTHCHECK --interval=30s --timeout=10s \ CMD curl -f http://localhost:8000/health || exit 1
-
LABEL : ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ (๋ฒ์ , ์์ฑ์ ๋ฑ)๋ฅผ ์ถ๊ฐ
LABEL maintainer="argus@example.com" LABEL version="1.0" description="Spark ETL container"
-
STOPSIGNAL : docker stop ๋ช ๋ น ์ ๋ณด๋ผ ์ ํธ๋ฅผ ์ง์
STOPSIGNAL SIGTERM
-
COPY โchown : ๋ณต์ฌํ ํ์ผ์ ์์ ์ ์ง์ (๋น๋ฃจํธ ์คํ ์ ์ ์ฉ)
COPY --chown=appuser:appgroup . /app
Docker ๊ด๋ จ ๋ช ๋ น์ด
์์คํ /์ ๋ณด ํ์ธ
-
ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ๋ฒ์ ํ์ธ
docker version
-
๋์ปค ์์คํ ์ ๋ณด
docker info
-
์คํ ์ค์ธ ์ปจํ ์ด๋๋ค์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
docker stats
-
๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
docker system df
-
์ฌ์ฉํ์ง ์๋ ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋ณผ๋ฅจ ๋ฑ ์ ๋ฆฌ
docker system prune
์ด๋ฏธ์ง
-
๋ก์ปฌ์ ์ ์ฅ๋ ์ด๋ฏธ์ง ๋ชฉ๋ก ํ์ธ
docker image ls docker images
-
์ด๋ฏธ์ง ํ๊น
docker tag <์ด๋ฏธ์ง> <์๋ก์ด์ด๋ฆ:ํ๊ทธ>
-
DockerHub ๋ฑ์์ ์ด๋ฏธ์ง ๋ค์ด๋ก๋
docker pull <์ด๋ฏธ์ง:ํ๊ทธ>
-
Dockerfile๋ก ์ด๋ฏธ์ง build
docker build -t <์ด๋ฆ:ํ๊ทธ> <Dockerfile ๊ฒฝ๋ก>
- ํน์ Dockerfile์ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง ๋น๋
docker build -t <์ด๋ฏธ์ง์ด๋ฆ> -f <Dockerfile๊ฒฝ๋ก> .
- ๋ค๋ฅธ ์ํคํ
์ฒ๋ก ์ด๋ฏธ์ง build
docker buildx build --platform linux/amd64 -t <์ด๋ฆ:ํ๊ทธ> <Dockerfile ๊ฒฝ๋ก>
docker buildx
: ์ฐจ์ธ๋ ๋น๋ ์์ง์ผ๋ก ๋ฉํฐํ๋ซํผ ๋น๋ ์ง์- ๋งฅ ์ค๋ฆฌ์ฝ์นฉ์ ARM ์ํคํ ์ฒ์ด๊ณ ECS์์๋ ๋๋ถ๋ถ amd ์ํคํ ์ฒ
- ARM ๋งฅ์์ amd64 ์๋ฒ์ฉ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์
- ํน์ Dockerfile์ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง ๋น๋
-
์ด๋ฏธ์ง ์ญ์
docker rmi <์ด๋ฏธ์งID or ์ด๋ฆ>
-
์ด๋ฏธ์ง ์ ์ฅ
docker save -o <ํ์ผ๋ช >.tar <์ด๋ฏธ์ง๋ช >
-
์ ์ฅ๋ ์ด๋ฏธ์ง ๋ก๋
docker load -i <ํ์ผ๋ช >.tar
-
์ด๋ฏธ์ง ์์ฑ ์ด๋ ฅ ํ์ธ
docker history <์ด๋ฏธ์ง๋ช >
์ปจํ ์ด๋
-
์คํ ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก
docker ps <์ต์ >
-a
: ์ค์ง๋ ์ปจํ ์ด๋ ํฌํจ-q
: ์ปจํ ์ด๋ ID๋ง ์ถ๋ ฅ
-
์ ์ปจํ ์ด๋ ์์ฑ ๋ฐ ์คํ
docker run <์ต์ > <์ด๋ฏธ์ง>
- ์ฃผ์ ์ต์
:
docker run --help
- ๊ณตํต with
docker exec
-u <user>
: ํด๋น ์ ์ ๋ก ๋ช ๋ น ์คํ-d
: ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋ ์คํ-i
: ์ธํฐ๋ํฐ๋ธ ๋ชจ๋-t
: TTY ํ ๋น. ๊ฐ์ ํฐ๋ฏธ๋ ๋ถ์ฌ์ฃผ๋ ๊ฒ โ ๋ด๊ฐ ์ ๋ ฅํ๋ ๋ช ๋ น์ด๊ฐ ์ปจํ ์ด๋์ ๋ฐ๋ก ์ ๋ฌ๋๊ณ ์ถ๋ ฅ๋ ๋ด ํฐ๋ฏธ๋์ ๋ณด์-it
: ์ธํฐ๋ํฐ๋ธ ๋ชจ๋ + ํฐ๋ฏธ๋ ์ฐ๊ฒฐdocker run -it --name python-container python:3.11
: python shell ์ด๋ฆผ
-dit
: ์ธํฐ๋ ํฐ๋ธ + ๋ฐฑ๊ทธ๋ผ์ด๋docker run -dit --name python-container python:3.11
: container ์คํ ์คdocker exec -it python-container python
: ๋ฐ๋ก ์ ์
--workdir
,-w
: ์์ ๋๋ ํ ๋ฆฌ ์ง์ --privileged
: ์ปจํ ์ด๋์ ํน์ ๊ถํ ๋ถ์ฌ-e <key>=<val>
: ํ๊ฒฝ ๋ณ์ ์ค์
run
์ต์ --name
: container ์ด๋ฆ ์ง์ --rm
: ์คํ ์ข ๋ฃ ์ ์ปจํ ์ด๋ ์๋ ์ญ์ -p <host>:<container>
: ํฌํธ ๋ฐ์ธ๋ฉ-v <volume์ด๋ฆ>:<container๊ฒฝ๋ก>
: ๋ณผ๋ฅจ ๋ง์ดํธ- volume ์ด๋ฆ ์์ผ๋ฉด ์์์ ์ด๋ฆ์ผ๋ก ์์ฑ
-h
: ์ปจํ ์ด๋ ํธ์คํธ๋ค์ ์ง์ --network <๋คํธ์ํฌ๋ชจ๋/์ด๋ฆ>
: ์ฌ์ฉ์ ์ ์ ๋คํธ์ํฌ ์ง์ --restart
: ์๋ ์ฌ์์ ์ ์ฑ ์ง์ --env-file
: ํ๊ฒฝ๋ณ์ ํ์ผ (.env)๋ก ์ง์ --entrypoint
: ์ํธ๋ฆฌํฌ์ธํธ (๊ธฐ๋ณธ ์คํ ๋ช ๋ น) ์ง์ -c
: CPU ์ ์ ๋น์จ ์ค์ -m
: ๋ฉ๋ชจ๋ฆฌ ์ ํ--volumes-from
: ๋ค๋ฅธ ์ปจํ ์ด๋์ ๋์ปค ๋ณผ๋ฅจ์ ๊ณต์ (์ ๋ฐ์ดํธ ๊ฐ ์ํ ๋ณด์กด ์ฉ๋์ ์ ํฉ)- volume์ ๋ฐ๋ก ์์ฑํ๊ณ -v๋ก ๋ณผ๋ฅจ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋ฐ๋์งใ
--health-cmd=<๋ช ๋ น์ด>
: ํฌ์ค์ฒดํฌ์ฉ ๋ช ๋ น์ด (์คํํ๋ ์ด๋ฏธ์ง Dockerfile์ ๋ฐ๋ก HEALTHCHECK ์๋ ๊ฒฝ์ฐ)--health-interval=<๊ฐ๊ฒฉ>
: ์คํ ์ฃผ๊ธฐ. ๊ธฐ๋ณธ๊ฐ 30์ด--health-timeout=<์๊ฐ>
: ์คํจ๋ก ๊ฐ์ฃผ๋๊ธฐ ์ ๊น์ง ๊ธฐ๋ค๋ฆด ์ต๋ ์๊ฐ. ๊ธฐ๋ณธ๊ฐ 30์ด--health-retries=<ํ์>
: ๋ช ๋ฒ ์ฐ์ ์คํจํ๋ฉด Unhealthy๋ก ํ๋จํ ์ง ์ง์ --health-start-period=<์๊ฐ>
: ์ปจํ ์ด๋ ์์ ํ, health check ์์ ์ ๋๊ธฐํ๋ ์๊ฐ--no-healthcheck
: ์ด๋ฏธ ์ ์๋ health check ์์ฒด ๋นํ์ฑํ
- ๊ณตํต with
- ์ฃผ์ ์ต์
:
-
์ปจํ ์ด๋์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค ๋ชฉ๋ก
docker container top <์ปจํ ์ด๋ID>
-
์คํ ์ค์ธ ์ปจํ ์ด๋ ์ํ ํ์ธ : CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ์ฌ์ฉ๋
docker stats
-
์คํ ์ค์ธ ์ปจํ ์ด๋ ์ค์ง
docker stop <์ปจํ ์ด๋ID>
-
์ค์ง๋ ์ปจํ ์ด๋ ์์ (์ต์ ์ ์ฒ์ runํ ๋ ๊ทธ๋๋ก)
docker start <์ปจํ ์ด๋ID>
-
์ปจํ ์ด๋ ์ฌ์์ : stop + start์ ๋์ผ. ์ค์ ๋ณ๊ฒฝ ํ ์ฌ์ ์ฉ, ์์ ์ฅ์ ๋ณต๊ตฌ ๋ฑ
docker restart <์ปจํ ์ด๋ID>
-
์ปจํ ์ด๋ ์ญ์
docker rm <์ต์ > <์ปจํ ์ด๋ID>
-f
: ์คํ ์ค์ธ ์ปจํ ์ด๋๋ ๊ฐ์ ์ญ์ -v
: ํด๋น ์ปจํ ์ด๋์ ์ฐ๊ฒฐ๋ volume ์ญ์ - ๋ชจ๋ ์ปจํ
์ด๋ (์คํ ๋ฐ ์ค์ง) ์ญ์
docker rm -f ${docker ps -aq}
-
์ปจํ ์ด๋์ ์ ์
docker exec <์ต์ > <์ปจํ ์ด๋ID/์ด๋ฆ> <๋ช ๋ น์ด>
- ์ฃผ์ ์ต์
:
docker exec --help
-i
,-t
,-d
,-e
,-u
,-w
,--privileged
- ์ฃผ์ ๋ช
๋ น์ด
bash
,sh
,python
ls -al
: ํ์ผ ๋ชฉ๋ก ์์ธํ ๋ณด๊ธฐcat <ํ์ผ๋ช >
: ํ์ผ ๋ด์ฉ ๋ณด๊ธฐtail -f <๋ก๊ทธํ์ผ>
: ๋ก๊ทธํ์ผ ์ค์๊ฐ ๋ชจ๋ํฐ๋งenv
: ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก ์ถ๋ ฅps aux
: ํ๋ก์ธ์ค ๋ชฉ๋ก ๋ณด๊ธฐ
- ์ฃผ์ ์ต์
:
-
์ปจํ ์ด๋ ๋ฉ์ธ ํ๋ก์ธ์ค์ ์ ์ถ๋ ฅ์ผ๋ก ์ง์ ์ฐ๊ฒฐ
docker attach <์ปจํ ์ด๋ID/์ด๋ฆ>
- ์ปจํ
์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค(์์ ์ปค๋งจ๋)์ ํ์ค ์
์ถ๋ ฅ(stdin, stdout, stderr)์ผ๋ก ์ง์ ์ฐ๊ฒฐ
- ์ ๋ ฅํ ๋ด์ฉ๊ณผ ๊ฒฐ๊ณผ(์ถ๋ ฅ)๊ฐ ์ปจํ ์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค์ ๋ฐ๋ก ์ฃผ๊ณ ๋ฐ์์ง
- ์ฌ๋ฌ ๋ฒ attachํ๋ฉด ์ฌ๋ฌ ํฐ๋ฏธ๋์ด ๋์์ ๊ฐ์ ํ์ค ์ ์ถ๋ ฅ์ ๊ณต์ (์์ ํ ๋ ๋ฆฝ์ ์ด์ง ์์)
- attach ์ํ์์
Ctrl+C
(SIGINT) ๋ฑ ์ ํธ๋ ์ปจํ ์ด๋ ๋ฉ์ธ ํ๋ก์ธ์ค์ ์ ๋ฌ- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ์ ์์
- ์ฃผ์์
- ๋ณ๋์ ์ ํ๋ก์ธ์ค๋ฅผ ์คํํ์ง ์์ (์ ์ ธ์ด ์๋ ๊ธฐ์กด ํ๋ก์ธ์ค์ ๋ถ์)
- ๋ฐ๋ชฌ/์๋น์ค ์ปจํ ์ด๋(nginx, mysql ๋ฑ)์์๋ attachํด๋ ์ธํฐ๋ํฐ๋ธํ ์ ์ถ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ ์ ์์
- attach ํ ์ ๋ ฅ ์ถฉ๋, ์ข ๋ฃ ์ ํธ ์ฃผ์ (์ค์ ์๋น์ค ์ปจํ ์ด๋์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์)
- ์ปจํ ์ด๋๊ฐ ๋ฉ์ถ๊ฑฐ๋ ๋ฉ์ธ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด attach ์ธ์ ๋ ์ข ๋ฃ๋จ
- ์ฃผ์ ์ฌ์ฉ ์์
docker run -it ubuntu
: ์ปจํ ์ด๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์ ์ ๋, ๋์ค์ attach๋ก ๋ค์ ํ์ค์ ์ถ๋ ฅ ์ฐ๊ฒฐdocker attach <์ปจํ ์ด๋ID>
- ์ปจํ
์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค(์์ ์ปค๋งจ๋)์ ํ์ค ์
์ถ๋ ฅ(stdin, stdout, stderr)์ผ๋ก ์ง์ ์ฐ๊ฒฐ
-
๋ก๊ทธ ์ถ๋ ฅ
docker logs <์ปจํ ์ด๋ID>
-
์์ธ ์ ๋ณด ์ถ๋ ฅ (JSON)
docker inspect <์ปจํ ์ด๋ID>
๋คํธ์ํฌ
-
๋คํธ์ํฌ ๋ชฉ๋ก
docker network ls
-
๋คํธ์ํฌ ์์ฑ
docker network create <์ด๋ฆ>
-
๋คํธ์ํฌ ์ญ์
docker network rm <์ด๋ฆ>
-
๋คํธ์ํฌ ๊ฒ์ฌ
docker network inspect <์ปจํ ์ด๋ID/์ด๋ฆ>
๋ณผ๋ฅจ
-
ํธ์คํธ-์ปจํ ์ด๋ ํ์ผ ๋ณต์ฌ
docker cp <ํ์ผpath> <์ปจํ ์ด๋์ด๋ฆ/ID>:<์ปจํ ์ด๋path> // local -> container docker cp <์ปจํ ์ด๋์ด๋ฆ/ID>:<์ปจํ ์ด๋path> <๋ก์ปฌpath> // container -> local
-
๋ชจ๋ ๋ณผ๋ฅจ ๋ชฉ๋ก
docker volume ls
-
์ ๋ณผ๋ฅจ ์์ฑ
docker volume create <์ด๋ฆ>
-
๋ณผ๋ฅจ ์ญ์
docker volume rm <์ด๋ฆ>