📌 이 포스팅에서는 Docker의 명령어에 대해 정리하였습니다.
🔥 run 명령어
🔥 ps 명령어
🔥 stop, rm, rmi 명령어
🔥 logs 명령어
🔥 images, pull 명령어
🔥 network create 명령어
🔥 volume 명령어
✔️ run 명령어는 컨테이너를 실행하는 명령어로 여러가지 옵션을 가지고 있고 포맷은 아래와 같다.
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST][COMMAND] [ARG...]
✔️ OPTIONS는 아래의 종류들이 있다.
✔️ run 명령어를 사용하며 사용할 이미지가 저장되어 있는지 확인하고, 없다면 docker hub에서 자동으로 pull 받은 뒤, 컨테이너를 생성하고 시작한다.
✔️ 아래 명령어를 실행하면, docker가 바로 종료되는데, 그 이유는 컨테이너는 프로세스이기 때문에 격리되었으나 그 상태에서 요청된 프로세스가 없기 때문에 바로 종료되는 것이다.
$ docker run ubuntu:20.04
✔️ 이에 아래와 같이 -it 옵션으로 /bin/sh를 실행하라고 명령을 주면 ubuntu의 shell이 작동된다. -i옵션은 컨테이너의 표준 입력을 오픈해놓는 옵션이며, -t는 가상 tty(pseudo tty)로 리눅스 계열의 콘솔 또는 터미널을 할당하기 위한 것이다.
$ docker run --it ubuntu:20.04 /bin/sh
✔️ --rm 옵션을 함께주면, 컨테이너 종료 시(exit로 /bin/sh를 빠져나가면), 자동으로 삭제되기 때문에 자주 함께 사용한다.
$ docker run --rm --it ubuntu:20.04 /bin/sh
✔️ 참고로 inspect 명령어를 통해 이미지 또는 컨테이너를 확인하면, cmd 명령의 종류나 workingDir을 확인할 수 있다.
$ docker inspect ubuntu
✔️ -d옵션으로 백그라운드로 실행시킬 수 있는데, -it로 열어논 터미널로 진입하려면 attach를 사용한다.
$ docker run --it -d --name myubuntu ubuntu:20.04
$ docker attach myubuntu 👈 백그라운드에서 실행 중인 컨테이너에 진입
✔️ docker로 mysql 이미지를 pull받아 컨테이너화 시키는 명령은 아래와 같다.
$ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
👈 mysql 5.7 이미지를 mysql이라는 컨테이너이름을 주고, 3306:3306으로 포트포워딩 시킨 상태로 백그라운드 실행
👈 --name값을 주지않으면, random으로 이름을 지정한다.
👈 -e 옵션은 컨테이너 내의 환경변수를 설정하는 옵션으로 비밀번호를 지정하지 않겠다는 설정을 위해 사용
✔️ 아래 명령어를 실행시키면, mysql이라는 이름을 가진 컨테이너에 내부로 들어가 mysql shell로 진입할 수 있다.
$ docker exec -it mysql mysql
👈 exec는 실행 중인 컨테이너 안에서 접속할 때 무언가 요청하기 위해 사용하는 명령어다.
✔️ 실행 중인 컨테이너 목록을 확인하는 명령어이다.
$ docker ps
✔️ 중이된 컨테이너까지 확인하여면 -a 옵션을 붙인다.
$ docker ps -a
✔️ stop은 실행중인 컨테이너를 중지하는 명령이다. 하나 또는 여러개를 띄어쓰기를 통해 한번에 중지할 수 있다.
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
✔️ stop 뒤에, [CONTAINER ID]를 입력하거나, [NAMES]를 입력해주면 중지된다.
✔️ stop은 종료의 의미기 때문에 다시 시작시키려면 start 명령어로 가능하고, 일시 중지는 pause를 사용한다. 일시중지에서 다시 실행시키는 것은 unpause이다.
$ docker stop [CONTAINER ID] 👈 컨테이너 종료
$ docker start [CONTAINER ID] 👈 컨테이너 시작
$ docker pause [CONTAINER ID] 👈 컨테이너 일시중지
$ docker unpause [CONTAINER ID] 👈 컨테이너 일시중지 깨우기
✔️ rm은 컨테이너를 삭제하는 명령어이고, rmi는 이미지를 삭제하는 명령어이다. 컨테이너를 stop한 뒤 사용한다.
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
✔️ 컨테이너를 실행시키고 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것이다. 기본옵션과 -f, --tail 옵션이있다.
$ docker logs [OPTIONS] CONTAINER
👈 -f옵션은 logs를 보여주고, 대기하면서 추가적인 logs를 실시간으로 보고싶을 때 사용한다.
✔️ Docker가 다운로드(pull) 받은 이미지 목록을 보는 명령어는 아래와 같다.
$ docker images [OPTIONS] REPOSITORY:TAG
✔️ run을했을 때, 없으면 자동으로 pull을 받아 컨테이너화시키지만 pull만 받을 때는 아래 명령어를 사용한다.
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
✔️ docker 컨테이너 간에 이름으로 통신할 수 있는 가상 네트워크를 만드는 명령어는 아래와 같다.
$ docker network create [OPTIONS] NETWORK명
✔️ A라는 컨테이너와 B라는 컨테이너를 연결할 가상 네트워크를 app-network라 생성한 예시는 아래와 같다.
$ docker network create app-network
✔️ 기존에 생성된 컨테이너에 네트워크를 추가하려면 아래의 명령어를 사용한다.
$ docker network connect [OPTIONS] NETWORK명 컨테이너명
✔️ mysql 컨테이너를 mysql이름으로 만들었다면, 이를 네이트워크를 추가하는 예시는 아래와 같다.
$ docker network connect app-network mysql
✔️ docker로 mysql과 같은 DB를 실행시키기고, 데이터를 저장시키다 어떠한 이유로 docker를 중지시키고 다시 run을 시키면 기존에 데이터는 모두 사라진다.
$ docker stop
$ docker rm mysql
✔️ 예를 들어, mysql을 컨테이너화해서 서버와 연결해두었다가 중지 및 삭제시킨 뒤 다시 실행하면 컨테이너를 생성되지만 기존의 정보는 삭제될 뿐 아니라 이름이 같다고해도 이를 인식하지 못한다.
$ docker run -d -p 3306:3306 \ -e MYSQL_ALLOW_EMPTY_PASSWORD=true \ --network=app-network \ --name mysql \ mysql:5.7
✔️ 이에 volume을 통해 컨테이너 내부의 데이터가 쌓일 때마다 local 영역에도 그 데이터를 가지고 있게되면, 컨테이너가 중지되었다가 다시 실행되어도 데이터를 손실없이 다시 사용할 수 있다.
✔️ 이럴 때, volume mount 옵션을 이용해서 경로를 포워딩해주면, 로컬에 저장해두었기 때문에 다시 run을하여도 데이터가 저장된 것을 확인할 수 있다.
$ docker run -d -p 3306:3306 \ -e MYSQL_ALLOW_EMPTY_PASSWORD=true \ --network=app-network \ --name mysql \ -v /my/own/datadir:/var/lib/mysql \ mysql:5.7
✔️ 즉, 위와 같이 volume mount를 해 두었다면, local에 데이터를 안전하게 가지고 있기 때문에 다시 사용할 수 있고, DB를 컨테이너할 때 volumn 옵션을 주로 사용한다.
✔️ 아래는 mongoDB를 volumn mount하는 예시로, 콜론 왼쪽은의 path는 local 영역이고, 오른쪽은 컨테이너 내부에 매핑시킬 경로이다.
$ docker run -v ${PWD}/data:/data/db mongo 👈 PWD는 현재 dir를 반환하는 명령어입니다.
✔️ 참고로 Docker 이미지 및 컨테이너가 몇개가 존재하고 용량을 얼마나 차지하는지 확인하려면 아래 명령어를 쓴다. EC2에서 그냥 df를하면 현재 EC2에 자원 현황 보여진다.
$ docker system df
✔️ 이와 함께 아래 명령어를 사용하면 컨테이너가 CPU와 메모리를 어떻게 사용중인지도 확인 가능하다.
$ docker container stats