나이가 들어서 그런가... docker 를 조금만 안 쓰면 금새 사용법을 까먹는다.
그래서 간단한 사용법을 아래처럼 정리해둔다.
docker login
# 로그아웃은 반대로 docker logout
docker search image_name # 이미지명을 다 적지 않아도 검색됨
docker pull image_name[:tag]
docker images # 방법1
docker image ls # 방법2
## 참고 : 이미지 아이디만 뽑아내기
docker images -q
docker image ls -q
docker rmi image_name # image_id 도 가능
docker create image_name
docker create --name custom_name image_name
--name
옵션을 통해서 컨테이너 이름을 지정할 수 있고, 만약 안 하면 자동 생성.docker run
명령어를 쓰다보니 잘 사용하지 않는다.docker start container_name # (재)실행
docker stop container_name # 정지
start
는 아래 2가지 기능 제공create
로 생성된 컨테이너를 실행한다.stop
을 통해서 Exit
된 컨테이너를 재실행한다.docker ps -a # `-a` 옵션을 안 주면 실행 상태가 아닌 컨테이너는 조회가 안된다.
docker ps -a -q # 컨테이너 아이디만 출력
출력 정보는 아래와 같다.
구분 | 의미 |
---|---|
CONTAINER ID | 컨테이너 아이디 |
IMAGE | 컨테이너를 생성할 때 쓴 이미지의 이름 |
COMMAND | 컨테이너 실행 시 초기에 실행되는 명령어 |
CREATED | 컨테이너 생성되고 나서 경과된 시간 |
STATUS | 컨테이너 상태 |
PORTS | 포트 포워딩을 했을 때의 포트 정보 |
NAMES | 컨테이너 이름 |
참고로 COMMAND 는 여러 방법으로 지정할 수도 있다.
docker rm container_name
docker run image_name
# 사용 예시
docker run \
--name myNewContainer \ # 컨테이너 이름
-d \ # 백그라운드에서 실행
-it \ # -i: "컨테이너의 STDIN OPEN" / -t :"tty 생성"
-p 8080:80 \ # 포트 포워딩
-v "호스트 리눅스 경로":"container 내부 경로" # 컨테이너 내부 경로와 호스트 경로 동기화
run 명령어는 이미지가 없으면 먼저 pull
을 실행하고
그 이후에 컨테이너를 생성(create
)하고 이어서 실행(start
)한다.
쉽게 표현하면 pull + create + start
을 한방에 해주는 것이다.
궁금증:
-it
는 언제 써야될까?사실 이걸 써야할지 말아야할지는
docker inspect image_name
를 통해서 알 수 있다.
docker inspect 를 하면 json 형태로 정보가 표출된다.
여기서Config
안쪽의Cmd
가 있다.
이것은 컨테이너 실행시 초기에 실행되는 명령어다.
여기서 중요한 건 명령어가 실행되어서 작업을 끝내거나,
또는 명령어 실행 자체를 실패했을 때 컨테이너는 종료된다.ubuntu 이미지의 경우는
Cmd
가/bin/bash
로 적혀 있다.
bash는 쉘 프로그램이고, 쉘을 실행하기 위해서는 표준입력(STDIN
)과
표준 입력에 키보드 타이핑을 가능하게 하는터미널(tty)
가 필요하다.
그러니 ubuntu run 명령어는-it
옵션이 써야한다.
만약 안 쓰면 컨테이너 실행과 동시에 종료된다.반대로
httpd
이미지의 경우에는Cmd
가 웹 서버를 실행시키는 명령어가 적혀있다.
그리고 서버는 기본적으로 24시간 항상 돌고 있기 때문에,-it
같은 옵션 없이도
컨테이너 실행시 ubuntu 처럼 바로 종료되지 않고, 실행 상태를 유지한다.
docker exec -it running_container_name /bin/bash # 이렇게 하면 컨테이너 내에서 bash 쉘 실행
docker attach running_container_name
exec
: container 내에 새로운 명령어를 실행한다.attach
: container 를 run 했을 때의 상태를 그대로 포어그라운드로 가져온다.조금 다르게 동작하는 것이니 잘 구분해서 사용하자.
docker logs -f container_name # 생성되는 로그를 계속 출력해준다. ctrl + c 로 빠져나온다.
docker logs -f --tail 0 container_name # 이전 로그 싹다 무시하고 새로운 로그부터 출력.
# 방법 1 , 단점은 docker volume ls 에 표시되지 않음.
docker run -d -it -v /host/path:/container/path ubuntu:20.04
## 방법 2 , docker volume ls 에 표시됨.
docker create volume volume_name
docker run -d -it -v volume_name:/container/path ubuntu:20.04
도커 태그를 통한 검색 명령어는 존재하지 않는다.
불편하더라도 직접 도커 허브 사이트에 접속해서 해당 이미지의 태그를 직접 찾아봐야 한다.
docker stop $(docker ps -a -q) # 실행 중인 모든 컨테이너 정지
docker rm -v $(docker ps -a -q) # 컨테이너 다 지우기
docker rmi -f $(docker images -q) # 이미지 다 지우기
docker rm -v
옵션은 관련된 volume
도 모두 삭제하기 위함docker stop $(docker ps --filter name=^/<컨테이너 명칭 작성>$ -q -a) 2>/dev/null # stop container
docker rm -v $(docker ps --filter name=^/<컨테이너 명칭 작성>$ -q -a) 2>/dev/null # remove container
docker rmi -f $(docker images <이미지 명칭 작성> -q) 2>/dev/null # remove image
docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y