지난번 포스팅에 도커에서 처음으로 이미지를 받고 컨테이너를 생성하고 실행해 보았다.

이번에는 MySQL을 받아 실행해볼 것이다.

 

$ docker run -it --name con_mysql -p 33006:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

run으로 한번에 해버린다.

 

위에 나온 옵션 설명은 저번 포스팅에도 했지만

-p와 -e는 처음 사용한다. 자세히 보면

 

-p 에 : 앞 포트는 Host PC의 포트이며 : 뒤 포트는 컨테이너의 포트이다. 잘 와닿지 않는데 사례로 풀어 설명하면

외부 또는 다른 컨테이너에서 MySQL에 접속하기 위해서는 3306포트가아니라 33006포트로 접속해야 한다는 것이다.

 

-e는 환경변수 옵션으로 MYSQL_ROOT_PASSWORD로 MySQL root계정 비밀번호를 설정했다.

 

이미지가 없으니 이미지 먼저 다운받고 순조롭게 되는듯 했으나..

 

 

ubuntu에 접속했을때 처럼 프롬포트가 쉘처럼 바뀔줄 알았는데 MySQL 로그가 찍히고 있다..

알아보니 exec 명령어를 통해 MySQL은 접속해야한다고 한다.

$docker exec -it con_mysql /bin/bash 이렇게 말이다

 

 

run명령어는 create, start, attach 명령어를 한번에 수행하는데

여기서 attach와 exec는 그럼 무슨차이가 있을까??

 

우선 attach는 현재 실행중인 컨테이너에 접속하는것이다. 도커에서 컨테이너는 프로세스 개념으로 run이나 start로 컨테이너가 실행되면 /bin/bash를 실행하는 이미지도 있어서 attach로 붙어도 바로 쉘 프롬포트가 나오는 경우가 있지만 그렇지 않은 이미지도 있기에 위와같은 결과가 나왔다.
실행시 바로 bash를 실행하지 않는 이미지에서 run명령어시 인자로 /bin/bash를 주면 attach로 쉘 프롬포트 접속 가능하다.

 

반면 exec는 현재 실행중인 컨테이너에 특정 쉘스크립트를 실행하는 것이다. 그래서 위에 exec명령어로 mysql에 접속하면 해당 컨테이너에 bash shell을 실행시켜 쉘 프롬포트가 화면에 나오게 된다.

 

또한 attach로 바로 쉘 프롬포트에 접속하게되면 /bin/bash로 실행된 1번 PID에 접속하게 되는 것이고 그러므로 해당 콘솔에서 exit하게 되는경우 그 컨테이너는 중지된다. 

 

attach로 붙은후 해당 쉘을 나가니 컨테이너가 중지되어있다.

그러나 exec /bin/bash로 컨테이너에 접속하는 경우 기존에 열려있던 PID1에 물리는 것이 아닌 별도의 프로세스를 생성하여 bash 를 실행한다. 따라서 해당 쉘 프롬포트에서 exit하게되도 그 컨테이너는 중지되지 않고 유지된다.

반면 exec로 붙은경우 bash프로세스가 하나더 생김을 볼 수 있고 exit로 나가도 여전히 컨테이너가 Up상태임을 알 수 있다.

 

 

드디어 정상적인 MySQL 실행

 

여담이 길었는데 별거없다. 저번 포스팅이랑 다운, 실행 방법이 모두 같다.

백그라운드에서 돌리기 위해 -d옵션을 주었고 이번 테스트후 컨테이너를 바로 삭제하기위해 --rm을 주었다.

 

이후엔 그냥 MySQL과 같은듯하다.

 

 

참고 :

https://zgundam.tistory.com/132

https://waspro.tistory.com/536

https://github.com/luckymagic7/Base/wiki/Docker-attach-VS-exec

+ Recent posts