이전 실습에서는 컨테이너를 생성하자마자 바로 삭제했지만 이번에는 컨테이너를 생성하고, 생성한 컨테이너에 접근해 보겠다.
웹 브라우저를 통해 컨테이너에 접근하기 위해서는 외부와 접속하기 위한 설정이 필요한데, 포트를 통해 설정할 수 있다.
포트란 통신 내용이 드나드는 통로를 의미한다.
아파치는 서버에서 정해둔 포트(80번)에서 웹 사이트에 대한 접근을 기다리다가,
사용자가 이 포트를 통해 접근해 오면 요청에 따라 웹 사이트의 페이지를 제공한다.
그러나 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
그래서 컨테이너를 실행 중인 물리적 컴퓨터가 접근을 대신 받아 전달해준다!
-p [호스트 포트 번호:컨테이너 포트 번호]
➡️-p 8080:80
구체적으로 말하면, 실행 중인 컴퓨터의 포트(8080)를 컨테이너의 포트(80)와 연결하는 것이다.
이를 가능하게 해주는 옵션이 -p
옵션이고, 그 뒤로 호스트 포트 번호와 컨테이너의 포트 번호를 연결해 함께 기재한다.
여기서 주의해야 할 부분이 있다🤚🏻
여러 개의 웹 서버를 함께 실행하는 상황에서, 호스트 포트 번호를 모두 같은 것으로 사용하면 안 된다.
요청이 왔을 때 어떤 컨테이너로 가야 하는 지 정확하게 알 수 없기 때문에, "A 컨테이너는 8080, B 컨테이너는 8081" 과 같이 호스트의 포트 번호를 겹치지 않게 설정해야 한다.
컨테이너 포트 번호는 동일해도 무방하다.
아파치 컨테이너를 생성하는 실습에 포트 번호 설정을 추가해, 외부에서 접근할 수 있는 아파치 컨테이너를 만드는 실습을 진행해보자.
docker run --name apa000ex2 -d -p 8080:80 httpd
아파치 이미지를 사용해 apa000ex2
라는 이름의 컨테이너를 생성하자.
(이미 이전에 이미지를 내려받았으므로 이번에는 pull 관련 정보는 출력되지 않음)
-p
옵션을 사용해 호스트의 포트 8080을 컨테이너 포트 80으로 포워딩한다.
docker ps
명령어를 통해 컨테이너가 생성된 것을 확인할 수 있다.
웹 브라우저에서 http://localhost:8080/
에 접근하면 위와 같이 아파치의 초기 화면이 나타난다.
docker stop apa000ex2
명령어로 컨테이너를 종료하고, 현재 존재하는 컨테이너의 목록을 확인한다.
docker rm apa000ex2
명령어로 컨테이너를 삭제한다.
컨테이너 및 이미지의 상태는 위와 같이 도커 데스크톱에서도 확인할 수 있다.
앞서 컨테이너 생성의 흐름을 살펴봤으니 이번에는 다양한 유형의 컨테이너를 생성하고 실행하며, 컨테이너 생성에 익숙해지는 연습을 하겠다.
소프트웨어의 가짓수만큼 컨테이너의 종류는 다양하다.
아파치 이외의 소프트웨어가 담긴 컨테이너를 생성해보는 실습을 진행할 것이다.
아파치 외에 자주 사용되는 대표적인 컨테이너인 nginx와 MySQL을 사용할 건데, 이 컨테이너들의 이미지 또한 공식 이미지로 제공되고 있다.
-d
옵션으로 백그라운드 실행, -p
로 포트 번호 지정-d
옵션으로 백그라운드 실행-e MYSQL_ROOT_PASSWORD
와 같이 루트 패스워드 지정주의🤚🏻
컨테이너를 여러 개 실행할 때 호스트 컴퓨터의 포트 번호가 중복되어서는 안 된다.
포트 번호를 다르게 하여 3가지 컨테이너를 생성한다.
3가지 컨테이너가 모두 실행중인지 확인한다.
웹 브라우저에서 http://localhost:8081/
http://localhost:8082/
http://localhost:8083/
에 접근하면 위와 같이 아파치의 초기 화면이 나타난다.
stop
커맨드를 사용해 컨테이너를 종료하고, rm
커맨드로 컨테이너를 삭제한다.
nginx는 아파치와 같은 웹 서버 소프트웨어로 최근 점유율이 급격하게 늘어나고 있다.
자세한 사용법은 다르지만, 똑같은 웹 서버 기능을 제공하는 소프트웨어이므로 아파치와 거의 비슷한 설정으로 컨테이너를 만들 수 있다.
nginx의 이미지를 사용해 nginx000ex6
이라는 이름으로 컨테이너를 생성한다.
웹 브라우저에서 http://localhost:8084/
로 접근해 nginx의 초기 화면을 확인한다.
stop
커맨드를 사용해 컨테이너를 종료하고, rm
커맨드로 컨테이너를 삭제한다.
MySQL은 데이터베이스 기능을 제공하는 소프트웨어로, RDBMS 라고도 한다.
MySQL 컨테이너를 만들기 위해서는 인자를 반드시 지정해야 한다.
-e MySQL_ROOT_PASSWORD
옵션을 통해 루트 패스워드를 지정한다.
그런데 위 명령어를 사용하면 docker: no matching manifest for linux/arm64/v8 ...
과 같은 에러가 발생한다.
해결 방법💡
--name
옵션 앞에--platform linux/amd64
옵션을 추가하면 정상적으로 생성이 가능하다.
생성 후에는 docker ps
커맨드를 통해 컨테이너가 정상적으로 실행 중인지 확인한다.
stop
커맨드를 사용해 컨테이너를 종료하고, rm
커맨드로 컨테이너를 삭제한다.
컨테이너를 삭제해도 이미지는 그대로 남아있다.
이미지가 늘어나면 스토리지 용량을 압박하게 되므로, 사용하고 필요없어진 이미지는 그때그때 삭제해야 한다.
이미지를 삭제할 때는 컨테이너와 비슷하게 이미지 ID 또는 이미지 이름을 사용한다.
해당 이미지로 실행한 컨테이너가 남아있으면 이미지를 삭제할 수 없으므로 docker ps -a
명령어를 통해 컨테이너가 남아있는지 확인하고,
남아있다면 컨테이너를 종료 및 삭제한 뒤에 이미지를 삭제해야 한다.
docker image rm httpd
명령어를 통해 아파치 이미지를 삭제한다.
docker image rm mysql nginx
와 같이 여러 개의 이미지를 한번에 삭제할 수도 있다.
📌 이미지 버전과 이미지 이름
이 실습에서는 편의상 이미지의 버전을 지정하지 않았다.
그러나 시스템 구성에 따라 특정 버전을 사용해야 할 때가 있는데 이런 경우에는docker run
커맨드에서 이미지 이름과 함께 버전을 지정할 수 있다.
➡️docker run --name apa000ex8 -d -p 8080:80 httpd:2.2