docker run {image 이름}:{tag} {명령어}{인자}
다음과 같이 명령어와 인자를 전달해주면, 컨테이너가 실행될 때 해당 명령어가 실행된다.
예를 들어 docker run ubuntu sleep 10
이라는 명령어를 입력했을 때, sleep은 명령어이고, 10은 인자가 된다. 따라서 ubuntu라는 이미지를 컨테이너로 실행할 때 10초간 잠에 들게 된다.
docker run을 통해 컨테이너를 실행시키면, 컨테이너는 기본적으로 표준 입력을 받지 않습니다.
container를 실행시켰을 때 나오는 출력이 있다면, 이것은 해당 컨테이너 안에 속한 어플리케이션의 출력입니다.
따라서 docker run을 하고 console에 입력을 해도 동작하지 않습니다. 이 입력값을 읽어들일 수 있는 터미널이 없기 때문입니다. 즉, 특별한 option 없이 docker run을 하면 비 대화형 모드로 실행됩니다.
입력값을 받게 하기 위해서는 docker run을 할 때 -i 옵션을 추가해줄 수 있습니다.
-i는 대화형 모드를 의미합니다. 그런데, -i를 입력했다고 하더라도 이 표준 입력에 접근할 수 있는 프롬프트나 터미널은 여전히 없습니다.
왜냐하면 docker prompt에서 container를 run하게 되면, 이 docker prompt에서 빠져나가기 때문입니다.
이 때 사용할 수 있는 옵션이 -t 입니다. 이 옵션을 사용하는 경우 docker prompt를 컨테이너의 터미널과 연결하게 됩니다.
따라서 컨테이너를 대화형 모드로 실행시키는 i옵션과, 대화를 위해 컨테이너의 터미널을 docker 프롬프트로 연결시키는 t옵션을 합쳐 -it 옵션을 사용할 수 있습니다.
만약 포트 5000을 쓰는 웹 어플리케이션을 실행하는 컨테이너가 있다고 가정했을 때, 외부에서 이 어플리케이션에 접속하기 위해서는 docker host의 ip를 통해 접근할 수 있습니다. 웹 어플리케이션의 ip는 컨테이너 내부의 ip이기 때문에, docker host의 웹 브라우저를 통해서만 접근이 가능할 뿐, 외부에서는 접근이 불가능합니다.
여기서 docker host의 ip와 port를 http://192.168.1.5:80이라고 가정하고, web application의 ip와 port를 172.17.0.2:5000이라고 가정했을 때, 외부에서 http://192.168.1.5:80를 통해 접근했을 때 docker host 내부에서 이 요청을 172.17.0.2:5000으로 처리할 수 있어야 합니다. 이 때, docker host의 port와 web application의 port 번호를 mapping 해주기 위해 다음과 같은 명령어를 사용할 수 있습니다.
docker run -p 80:5000 simple-webb
이 명령어를 통해 다음과 같이 여러대의 인스턴스를 docker host의 다른 포트에 매핑해서 여러대의 인스턴스를 실행할 수 있습니다.
docker run -p 80:5000 simple-webb
docker run -p 8000:5000 simple-webb
docker run -p 8001:5000 simple-webb
예를 들어 mysql 인스턴스를 실행하고자 할 때 아래와 같이 명령어를 입력하면 여러대의 mysql 인스턴스를 실행할 수 있습니다.
docker run -p 3306:3306 mysql
docker run -p 8306:3306 mysql
mysql instance를 docker container를 통해 실행하고 있고, 많은 양의 data가 들어있다고 가정해 보겠습니다.
docker container는 자체적으로 분리된 파일 시스템을 갖고 있습니다. 그리고 database에 들어있는 data file은 /var/lib/mysql 안에 저장되어 있습니다. 파일에 대한 변경은 오직 해당 컨테이너 내부에서만 진행됩니다.
docker stop mysql
docker rm mysql
만약 위와 같은 명령어를 실행하면, docker container가 사라지면서 그 안에 들어있는 모든 data들도 사라집니다.
안에 들어있는 data들을 유지하고 싶다면, docker container 외부에 있는 디렉토리와 컨테이너 내부 디렉터리를 매핑해야 합니다.
docker run -v /opt/datadir:/var/lib/mysql sql
위 명령어를 실행하면, docker host 내의 디렉토리가 docker 컨테이너 내의 폴더로 마운트됩니다. 또한 container 내부의 모든 데이터가 외부 볼륨인 /opt/datadir에 저장됩니다. 또한 도커 컨테이너를 삭제해도 내부 데이터는 유지됩니다.
docker inspect {컨테이너 이름 || id}
위 명령어를 사용하면 특정 컨테이너에 대한 모든 정보를 json 형식으로 확인할 수 있습니다
docekr logs {컨테이너 id || name}
위와 같은 명령어를 실행하면, 백그라운드에서 실행중인 컨테이너의 표준 입출력인 로그를 확인할 수 있습니다.