컨테이너 통신

변현섭·2023년 12월 19일
0

도커란 무엇인가

목록 보기
4/8

1. 컨테이너 통신

1) 이론

저번 포스팅에서는 컨테이너를 만들고 바로 삭제했지만, 이번에는 웹 브라우저를 통해 컨테이너에 접근해볼 것이다. 웹 브라우저를 통해 컨테이너에 접근하려면, docker run 커맨드의 옵션으로 포트를 설정해야 한다.

아파치 서버는 80포트를 통한 사용자의 접근에 대해서만 웹 페이지를 제공하므로, localhost의 8080번 port를 80번 포트에 연결해야 한다. 포워딩하는 방법은 -p 옵션을 사용하여, localhost의 포트번호와 컨테이너의 포트 번호를 콜론으로 연결하는 것이다.

-p 8080:80

2) 실습

외부에서 접근 가능한 아파치 컨테이너를 만들어보자. 이번에는 apa000ex2라는 이름의 아파치 컨테이너를 만들고, 8080 포트를 포워딩할 것이다.

① docker run 커맨드

docker run --name apa000ex2 -d -p 8080:80 httpd

  • -p 8080:80: 호스트 포트 8080을 컨테이너 포트 80으로 포워딩한다.
  • httpd 이미지를 이미 내려받았으므로, pull 관련 정보는 출력되지 않는다.

② docker ps 커맨드

docker ps // 컨테이너가 정상적으로 실행 중인지 확인

③ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아래는 아파치의 초기 화면이다.

④ docker stop 커맨드

docker stop apa000ex2 // 컨테이너 종료

⑤ docker rm 커맨드

docker rm apa000ex2 // 컨테이너 삭제
docker ps -a // 컨테이너의 삭제 여부를 확인

2. 여러 개의 컨테이너 실행하기

이전 포스팅에서 잠깐 설명했듯, 컨테이너를 활용하면 하나의 물리 서버에 여러 웹 서버를 함께 실행할 수 있다. 이 때, 각 컨테이너에 연결되는 포트번호는 모두 달라야 한다. 즉, A 컨테이너에는 8080 포트를 할당하고, B 컨테이너에는 8081 포트를 할당하는 방식으로 포트 번호를 구성해야 한다.

이제 배운 내용을 바탕으로 apa000ex3, apa000ex4, apa000ex5라는 이름의 아파치 컨테이너를 만들어보자.

① docker run 커맨드

docker run --name apa000ex3 -d -p 8080:80 httpd
docker run --name apa000ex4 -d -p 8081:80 httpd
docker run --name apa000ex5 -d -p 8082:80 httpd

② docker ps 커맨드

docker ps // 컨테이너가 정상적으로 실행 중인지 확인

  • 포트 포워딩을 한 이후부터는 PORTS 항목에 ->가 나타난다.

③ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080, localhost:8081, localhost:8082를 입력한다.

④ docker stop 커맨드

docker stop apa000ex3 
docker stop apa000ex4
docker stop apa000ex5

⑤ docker rm 커맨드

docker rm apa000ex3 
docker rm apa000ex4 
docker rm apa000ex5 
docker ps -a // 컨테이너의 삭제 여부를 확인

3. Nginx 컨테이너 실행하기

nginx 이미지의 이름은 nginx이다. nginx000ex6이라는 이름의 nginx 컨테이너를 생성해보자.

① docker run 커맨드

docker run -d --name nginx000ex6 -p 8080:80 nginx

② docker ps 커맨드

docker ps // 컨테이너가 정상적으로 실행 중인지 확인

③ 웹 브라우저를 통해 nginx 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아래는 nginx의 초기 화면이다.

④ docker stop 커맨드

docker stop nginx000ex6

⑤ docker rm 커맨드

docker rm nginx000ex6 
docker ps -a // 컨테이너의 삭제 여부를 확인

4. MySQL 컨테이너 실행하기

MySQL 이미지의 이름은 mysql이다. MySQL 컨테이너의 생성은 다음 포스팅에서 자세히 다루기로 하고, 지금은 MySQL의 root 패스워드를 지정하는 옵션과 -dit 옵션만 사용하여 MySQL 컨테이너를 생성하기로 한다.

① docker run 커맨드

docker run -dit --name mysql000ex7 -e MYSQL_ROOT_PASSWORD=pwd mysql
  • -dit: -d는 백그라운드 실행을, -it는 키보드를 통해 컨테이너 내부의 파일 시스템을 조작할 수 있음을 의미한다.
  • -e MYSQL_ROOT_PASSWORD=: MySQL의 root 패스워드를 지정한다.

② docker ps 커맨드

docker ps // 컨테이너가 정상적으로 실행 중인지 확인

③ docker stop 커맨드

docker stop mysql000ex7 

④ docker rm 커맨드

docker rm mysql000ex7 
docker ps -a // 컨테이너의 삭제 여부를 확인

5. 이미지 삭제하기

1) 이론

컨테이너를 생성할 때 pull 받은 이미지는 컨테이너 삭제 이후에도 계속 남아있다. 따라서, 더 이상 필요하지 않은 이미지를 삭제해주어야 한다. 이미지를 삭제할 때에는 이미지의 ID나 이미지의 이름을 사용해야 하며, 해당 이미지로 생성된 컨테이너가 먼저 삭제되어야 한다. (정지되어 있는 상태에서도 삭제할 수 없다.)

① 이미지 삭제

  • 이미지 이름을 열거하여 한번에 여러 개의 이미지를 삭제할 수 있다.
  • docker rm으로는 이미지를 삭제할 수 없다.
docker image rm 이미지 이름
// 또는 docker rmi 이미지 이름

② 이미지 목록 출력

docker image ls
  • 이미지 삭제에 필요한 이미지의 이름이나 이미지의 ID를 알기 위한 목적으로 사용한다.
  • -a 옵션은 사용할 수 없으며, 항상 존재하는 모든 이미지를 표시한다.
  • docker image ls 커맨드를 실행하면, REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 항목이 나타난다.
    • REPOSITORY: 이미지의 이름을 의미한다.
    • TAG: 버전 정보를 나타내는 것으로, 이미지를 pull 받을 때 버전을 별도로 지정하지 않았으면, latest(최신버전)로 나타난다.
    • IMAGE ID: 이미지의 ID로, 원래는 64글자이지만 앞의 12글자만으로도 식별자의 역할을 수행할 수 있기 때문에 12글자만 출력한다.
    • CREATED: 이미지 생성 후 경과된 시간을 나타낸다.
    • SIZE: 이미지의 전체 용량을 나타낸다.

2) 실습

지금까지 다운로드 받은 apache, nginx, mysql의 이미지를 모두 삭제해보자.

① 삭제하려는 이미지를 사용하는 컨테이너가 존재하는지 확인

docker ps -a // 중지된 컨테이너까지 검사해야하므로 -a 옵션을 사용해야 한다.

② 삭제하려는 이미지의 이름이나 ID를 알아내기 위해 이미지 목록을 출력

docker image ls

③ 이미지 이름을 이용해 이미지를 삭제

docker rmi httpd nginx mysql
docker image ls

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글