지난번 포스팅에 도커에서 처음으로 이미지를 받고 컨테이너를 생성하고 실행해 보았다.
이번에는 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하게 되는경우 그 컨테이너는 중지된다.
그러나 exec /bin/bash로 컨테이너에 접속하는 경우 기존에 열려있던 PID1에 물리는 것이 아닌 별도의 프로세스를 생성하여 bash 를 실행한다. 따라서 해당 쉘 프롬포트에서 exit하게되도 그 컨테이너는 중지되지 않고 유지된다.
드디어 정상적인 MySQL 실행
여담이 길었는데 별거없다. 저번 포스팅이랑 다운, 실행 방법이 모두 같다.
백그라운드에서 돌리기 위해 -d옵션을 주었고 이번 테스트후 컨테이너를 바로 삭제하기위해 --rm을 주었다.
이후엔 그냥 MySQL과 같은듯하다.
참고 :
https://zgundam.tistory.com/132
https://waspro.tistory.com/536
https://github.com/luckymagic7/Base/wiki/Docker-attach-VS-exec
'Docker' 카테고리의 다른 글
[Docker] Dockerfile을 이용한 이미지 생성 및 docker hub에 배포하기 (0) | 2020.06.14 |
---|---|
[Docker] 데비안 컨테이너 안에 nginx설치 후 php 연동하기 (0) | 2020.05.30 |
[Docker] 윈도우에서 도커사용시 웹서버 포트포워딩 (oracle VM포트포워딩) 과 과제.. (0) | 2020.05.26 |
[Docker] 도커에 Ubuntu Image 설치하고 실행하기 (0) | 2020.05.13 |
[Docker] tool box를 이용해 윈도우에 도커 설치하기 (1) | 2020.05.12 |