컨테이너의 통신

아파치란?

  • www(World Wide Web)서버 용 소프트웨어이다. 대부분의 운영체제에서 사용할 수 있는 크로스 플랫폼으로, 구축이 쉽고 다양한 기능들을 가지고 있다.
  • HTTP, HTTPS, SSL 등 다양한 기술과 프로토콜을 지원한다.
  • 서버를 사용자가 요구 사항에 맞게 정의하고, 확장할 수 있는 모듈형 아키텍처이다.
  • 아파치 웹 서버는 클라이언트로부터 Http 요청을 수신하고, 해당 클라이언트에 HTTP 응답을 전송하는 방식을 사용한다.

컨테이너와 통신하기 위한 방법

통신이 가능한 컨테이너 만들기

  • docker run 명령어를 사용하면 컨테이너 실행에 필요한 이미지를 pull, 컨테이너를 생성 후, 실행하면 통신 가능한 컨테이너가 생성된다.
  • 컨테이너 내에 있는 애플리케이션은 3가지 방법으로 통신할 수 있다.
    1. 웹 API 호출
      • 컨테이너에서 동작 중인 애플리케이션이 웹 API와 통신하는 경우, 별다른 조치 없이 통신 가능하다.
    2. 로컬 PC(Host)와 통신
    3. 컨테이너 간 통신

컨테이너 생성에 익숙해지기

다양한 유형의 컨테이너

  • 컨테이너는 이미지에 따라 워드 프레스, OS, WebServer, DB 등 다양한 유형의 컨테이너로 생성된다.

아파치 컨테이너를 여러 개 실행하기

Nginx 컨테이너 실행하기

MySQL 컨테이너 실행하기

  • docker run 명령어로 mysql 이미지를 다운, mysqlcontainer라는 이름의 컨테이너를 생성 후, 실행 시켰다.
  • xrZoBR1.png
  • 하지만 docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 라는 에러가 떴고, 3306 포트가 이미 사용중이라 해서, 프로세스 강제 종료 후, 다시 실행했다.

이미지 삭제

docker image ls 커맨드

  • docker image ls 커맨드를 사용하여 현재 내 로컬 이미지 저장소에 있는 이미지 목록을 불러왔다. 위 실습을 위해 docker run 명령어로 pull 해 온 이미지들이 있었다.

docker image rm 커맨드

  • docker image rm 커맨드를 사용하여 mysql 이미지를 지워보려고 했다.
  • 하지만 f78d2d0491c3 컨테이너가 실행 중이라 삭제가 불가능하다는 에러가 출력 됐다.
  • 이럴 때는 강제 삭제 옵션(-f)을 이용하면 삭제가 된다.

이미지 삭제 하는법

  • 이미지를 삭제할 때 위 실습 처럼 -f 옵션을 사용하면 편리하지만, 권장하지 않는 방법이다.

  • 이유는 해당 이미지를 사용하는 실행 중인 컨테이너가 있을 때, 이미지를 삭제하는 경우, 이미지는 정상적으로 삭제 되지만, 컨테이너는 그대로 남아있기 때문이다.

  • 위 실습의 경우, mysql 이미지를 사용하는 컨테이너를 미리 멈춰뒀기에 언태깅 후, Deleted 까지 정상적으로 됐지만, 아래 nginx 이미지를 삭제할 때는 컨테이너를 멈추지 않았다.

  • 그 결과, nginx 이미지를 사용하는 컨테이너가 여전히 실행 중이었고, 이미지도 <none>으로 변경되었을 뿐, 삭제되지 않았다.

  • 그렇다면 이 컨테이너는 정상 작동할까?

    • 컨테이너는 이미지의 인스턴스이므로, 당연히 작동은 한다.
  • <none>으로 된 이미지들을 dangling 된 이미지라 하는데, 도커는 이러한 이미지를 필요 없는 이미지라 판단하여, dangling 된 모든 이미지들을 삭제하는 docker image prune이라는 명령어를 제공한다.

    • dangling 된 이미지의 상세 정보
    • 기존 nginx 이미지의 상세 정보
    • 기존 이미지의 상세 정보와 비교했을 때, reporTags와 repoDigests 부분이 비어있다.
      • 이 뜻은 Docker registry와 연동되지 않고, 로컬 docker 내에만 존재한다는 뜻이다.
  • docker image prune 명령어는 컨테이너에서 사용하지 않는 이미지까지 같이 삭제 시켜주는 -a 옵션을 제공한다.

  • 현재 컨테이너에서 사용되지 않은 이미지인 hello-world 이미지가 삭제된 모습이다.

  • 삭제하고자 하는 이미지를 사용하는 컨테이너가 여러 개일 경우, -aq--filter옵션으로 삭제하고자 하는 이미지로 동작하는 컨테이너를 모두 종료하고, docker image prune 명령어로 해당 이미지를 삭제하면 된다.

  • 도커 컨테이너의 외부 통신 이슈