Docker 사용법 정리

이미지 빌드하기

  • 현재 path의 Dockerfile을 빌드함
  • 동일한 이름의 이미지가 이미 존재하면, 기존의 이미지의 태그는 으로 설정되고, 빌드한 이미지는 lastest로 설정됨
  • -t : tag (이미지 이름)
    docker build -t example .
    

이미지 다운로드 받기

docker pull ndb796/docker-practice

이미지 실행

  • 이미지가 remote repo에 있는 경우에도 run으로 실행시켜도 됨(이 경우, 이미지를 다운 받고, 실행 시킴.)
  • -p : port
  • -d : detached (background에서 실행)
  • -e : environment variable
    docker run -p 8080:8080 -e VAR1=abc --rm --name zeppelin apache/zeppelin:0.9.0
    

이미지 실행명령어와 다른 명령어 호출하기

  • CMD의 명령어를 호출하는 대신에 Command를 호출함.
    sudo docker run [image_name] [Command]
    

설치된 이미지들 보기

docker images

이미지 삭제하기

  • -f : force
    docker rmi -f <image id> # find id from `docker images`
    

실행 중인 컨테이너 확인

docker ps

# 꺼져있는 것도 표시
docker ps -a

실행중인 컨테이너 삭제

  • -f : force (force stop the container then remove) ``` docker rm -f # find container id by `docker ps -a`

현재 켜져있는 모든 컨테이너 삭제하기

docker rm -f docker ps -a -q


## Run. 실행 시키기
- -p : 포트 매칭
- -v : volume (path matching) : https://docs.docker.com/storage/volumes/
    - :ro : read-only. container can't modify the volumn. only read the volumn in the host
    - image의 해당 디렉토리에 파일이 있으면, 해당 디텍토리는 host의 디텍토리로 덮어씌워져서, 파일이 사라진다.
    - 디렉토리가 아닌, 파일을 설정할 수도 있음. 이 경우, host에 파일이 이미 존재해야함.
- -d : daemon (백그라운드에서 실행. 재부팅시에는 재실행 안됨)
- -i : interactive
- -e : environment `-e AA=BB`

docker run -p 8080:80 -v /home/ec2-user/example:/var/www/html example


## Named Volume
- docker실행시키는 서버에서, docker 내부와 연결할 path를 지정하지 않고, 이름만 설정해주면, 외부의 임의 path를 생성해서 연결시켜줌
- 그래서, path를 별도로 지정해주는 번거로움 없이, 외부에 path를 지정가능
- 만약 생성하지 않고, named volume을 쓰게 되면, volume을 자동으로 만듬

docker volume create todo-db

docker run -dp 3000:3000 -v todo-db:/etc/todos -v todo-db4:/etc/todos4 getting-started

docker volume inspect todo-db # you can see where the path of the volume [ { “CreatedAt”: “2019-09-26T02:18:36Z”, “Driver”: “local”, “Labels”: {}, “Mountpoint”: “/var/lib/docker/volumes/todo-db/_data”, “Name”: “todo-db”, “Options”: {}, “Scope”: “local” } ]




## 컨테이너 start/stop/kill
- docker rm은 컨테이너를 삭제하여, 내부에 있는 데이터가 삭제된다.
- 데이터 삭제 없이 컨테이너 사용을 중단시키고 싶으면 stop이나, kill을 사용.
- 다시 실행시킬 때, start를 호출하면 됨

docker start 10ab5b8ed5c2 docker stop 10ab5b8ed5c2 docker kill 10ab5b8ed5c2


## 컨테이터 디테일 확인하기
- gateway ip address
    - mysql가 컨테이너에 설치된 경우. 해당 ip로 접속할 수 있음

docker inspect


## 컨테이너 내부에 접속하는 방법
interactive
````shell
docker exec -it <container-id> /bin/bash

non-interactive

docker exec container-name tail /var/log/date.log

-

  • mysql처럼 ip로 접속 가능한 경우 -> gateway ip address로
  • port맵핑을 통해 실행한 경우, 맵핑된 port로도 접속 가능
  • https://www.youtube.com/watch?v=gmE_8oSZ-mo&list=PLRx0vPvlEmdChjc6N3JnLaX-Gihh5pHcx&index=5
  • 배쉬 접속해서 mysql 접속하는 방법 dd

이미지의 파일 확인하기

docker run -it image_name sh

Restart Policy

  • https://www.digitalocean.com/community/questions/how-to-start-docker-containers-automatically-after-a-reboot
    docker run -d --restart unless-stopped redis
    docker run -d --restart unless-stopped -p 8090:8080 --name zeppelin apache/zeppelin:0.9.0
    

컨테이너에 있는 파일을 외부로 복사하는 방법

docker cp <containerId>:/file/path/within/container /host/path/target

도커 로그 확인하기

  • -f follow (show logs continuously)
    docker logs -f 2fe24b9564b5
    

텍스트로 컨테이너 ID 찾기

ID=$(docker ps | grep "app-name" |tr -s ' ' | cut -d " " -f 1)