Skip to content
jaeseok.an edited this page Jun 20, 2024 · 16 revisions

사용과정

* 이미지 빌드
docker image build . -t myflask
* container bash 실행
docker run -it myflask:latest sh
* container daemon 으로 실행
docker run -D -p 5000:5000 -e PORT=5000 myflask:latest

command

  • CMD
    • container시작시 수행 명령
    • docker file당 1개
    • 시작시 override 가능
  • ENTRYPOINT
    • container시작시
    • override불가 . 즉 변경없이 무조건 실행되어야 할 내용.
    • run image arg 로 argument받을수 있음
  • CMD vs ENTRYPOINT
    • runtime에 override될 default argument가 있다면 CMD 좋음
    • excutable을 실행하거나, 매번 변경없이 실행하고자 하면 ENTRYPOINT가 좋음
  • WORKDIR
    • cd와 같음
  • COPY/ADD
    • ADD는 tar를 풀어서 올림

환경 변수 사용

Docker file 에서 $환경변수 로 사용

 ex) CMD exec gunicorn --bind :$PORT manager:app --timeout 3600 --pythonpath='/' --workers 2

유용한 cli command

  • Containers
    • Use docker container my_command
    create — Create a container from an image. 
    start — Start an existing container. 
    run — Create a new container and start it. 
    ls — List running containers. 
    inspect — See lots of info about a container.
    logs — Print logs. 
    stop — Gracefully stop running container. 
    kill —Stop main process in container abruptly. 
    rm— Delete a stopped container.
    
  • Images
    • Use docker image my_command
    build — Build an image.
    push — Push an image to a remote registry.
    ls — List images. 
    history — See intermediate image info.
    inspect — See lots of info about an image, including the layers. 
    rm — Delete an image.
    
  • Misc
    docker version — List info about your Docker Client and Server versions.
    docker login — Log in to a Docker registry.
    docker system prune — Delete all unused containers, unused networks, and dangling images.
    

tip

  • image size
    • docker image ls

multistage

  • 이전 stage의 결과만 재사용
    • COPY --from=
FROM golang:1.7.3 AS build
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=build /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

image 사이즈 줄이기

  • 되도록 RUN에서 여러 command 실행. 각 run마다 layer가 생성되기 때문
RUN apt-get update && apt-get install -y \
    package-one \
    package-two 
 && rm -rf /var/lib/apt/lists/*

copy 파일

docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt . 

save/load

$ sudo docker save -o nginx.tar nginx:latest
$ sudo docker save -o redis.tar redis:latest
$ sudo docker save ubuntu:14.04 > ubuntu14.04.tar
$ sudo docker save ubuntu > ubuntu.tar

$ sudo docker load < ubuntu.tar
$ sudo docker images

Network

  • bridge 네트워크
  • host 네트워크

Mac tip

Opening 2375 port for dockerd in Mac
by Yoonjae ParkFebruary 29, 2020 ~1 min read

Mac Mini에 Docker Desktop을 설치했고, windows 컴의 pycharm에서 tcp로 연결해서 쓰려고 했는데, Mac용 Docker Desktop에는 TCP 소켓여는 옵션이 없다는 것을 깨달았다.

일단 brew도 안깔았었기 때문에 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 로 brew 부터 설치하고

brew install socat으로 socat 설치 후

shell script socat TCP-LISTEN:2375,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock & 으로 2375 TCP 포트로 /var/run/docker.sock를 연결해주었다.

지금 windows 컴의 elastic search configure 파일을 mini의 docker에 mount 해줘야하는데 그걸 어떻게 설정해야할지 알아봐야겠다.

Docker network

  • user defined bridge network사용시 container name으로 naming service 제공
  • 관련 명령어
    • bridge 환경 보기
      • docker network inspect bridge
    • Host 환경 보기
      • docker network inspect host

권한 문제

  • docker 실행은 root만 가능. 다른 계정으로 실행하려면 docker 권한 주면 됨
  • container 내부에서 기본은 root로 실행. writing한 file도 root로 저장
    • 내부 process를 다른 계정으로?
    FROM ubuntu:focal
    
    RUN apt-get update
    RUN apt-get install -y git
    RUN groupadd -g 999 appuser
    RUN useradd -r -u 999 -g appuser appuser
    
    USER appuser
    

실행 Tip

  • Shell script로 docker 실행하기
    docker run -it myflask:latest sh
    
  • container에서 종료없이 나가기
    Ctrl + P + Q
    
  • 실행중인 container에 환경변수 설정 확인하기
    docker exec my-nginx env