$ docker exec 5d4da2695441 ls
- docker exec {컨테이너 아이디} {명령어 키워드}
- docker run은 새로운 컨테이너를 만들어서 실행한다.
- 반면 docker exec은 이미 실행중인 컨테이너에 새로운 명령어 키워드를 전달하고 적용한다.
간단히 실습도 진행해보자.
- 터미널 2개가 필요하다.
- 첫번째 터미널에서 컨테이너 하나를 실행한다.
- ex) docker run alpine ping localhost
- 두번째 터미널에서 컨테이너 리스트를 확인하고, exec으로 생성된 컨테이너에 새로운 키워드를 전달한다.
- ex) docker ps
- ex) docker exec 5d4da2695441 ls
- 출력 결과:
- ls는 파일리스트를 출력하는 명령어이다.
- 컨테이너 내부에 있는 파일리스트가 정상적으로 출력되었음을 알 수 있다.
$ docker run redis
$ docker exec -it 580637a989f9 redis-cli
- docker exec -it {컨테이너 아이디} {명령어 키워드}
- 컨테이너 내부에 명령어를 전달하여 해당 커맨드를 실행하는 방법이다.
- 여기에서 새롭게 확인할 수 있는 -it은 컨테이너 내부에 들어갈 수 있게 해주는 키워드이다.
- -it이 없으면 그냥 전달된 명령어를 수행하기만 하고 접속은 하지 않는다. 접속해서 해당 컨테이너의 기능을 사용하고 싶다면 필수이다.
역시나 실습으로 이해해보자
- docker run redis 로 redis 컨테이너를 생성하고 실행한다.
- 레디스가 연결되었음을 확인할 수 있다.
- 그러고 redis-cli를 실행해보자.
- 명령어를 찾을 수 없다는 메시지만 출력된다.
- 그 이유는 단순히 컨테이너 외부에서 컨테이너 내부에 명령어를 전달할 수가 없기 때문이다.
- 내부에 명령어를 전달하려면, 위에서 실습했던대로 exec 키워드를 활용해야한다.
- docker ps로 컨테이너 ID를 확인한다.
- 그리고 docker exec -it {컨테이너 아이디} redis-cli 를 입력해보자.
- redis 클라이언트에 접속되었음을 확인할 수 있다.
- 언급했듯이 만약 -it을 빼면 접속이 이루어지지 않는다.
- 접속한 redis 클라이언트에서 key-value 세팅을 진행해보자.
- set {key} {value} 명령어로 간단하게 세팅할 수 있다.
- get {key} 명령어로 value를 가져올 수 있다.
- set hello world 이후, get hello를 수행해보자.
- 정상적으로 key-value가 set, get 됨을 확인할 수 있다.
$ docker exec -it 3d04c4444b19 sh
- docker exec -it {컨테이너 아이디} {터미널 환경}
- 매번 docker exec -it {컨테이너 아이디} {명령어 키워드} 와 같이 전체 커맨드를 입력하기란 번거로울 수 있다.
- 특정 환경을 통하면, 앞부분을 생략하고 마지막 명령어 키워드만 기입할 수 있다.
- 이를 위해선 {명령어 키워드} 대신, 그 자리에 구축하고자 하는 {터미널 환경} 을 기입해주어야 한다.
- 그렇게 특정 터미널 환경에 진입하면, 그때부터는 실질적인 실행 명령어만 입력해도 된다.
- 터미널 환경의 종류로는 sh, zsh, bash, powershell 등이 있다.
(윈도우에서는 powershell을 지원하고, 맥에서는 bash나 zsh을 지원한다. sh은 어디에서나 지원되는 터미널 환경이다.)
그럼 sh을 활용해 실습해보자.
- 기본적인 커맨드 전달 방식
- 새로운 명령어를 전달하려면 또 다시 docker exec -it...를 전부 기입해줘야 한다.
- sh 터미널 환경에서의 전달 방식
- sh 환경으로 진입한 모습이다. 이제 중복되는 커맨드를 생략하고 실행 명령어만 입력해도 된다.
- 추가 테스트 1: 새로운 파일 만들고 파일리스트 확인
- 정상적으로 명령어가 적용되고 있음을 확인할 수 있다.
- 추가 테스트2: 환경변수 적용해보기
- 환경변수도 마찬가지로 잘 세팅된다.