on my way
CI/CD-03: Podman을 사용한 컨테이너 관리 및 포트 설정 1 본문
사용한 자원 목록
- 컨테이너 이미지
- quay.io/fedora/httpd-24: Fedora 기반의 HTTP 서버 이미지
- quay.io/centos/centos:stream9: CentOS 스트림 9 이미지
- quay.io/fedora/mariadb-105: Fedora 기반의 MariaDB 데이터베이스 이미지
- quay.io/openshift-examples/tomcat-example:tomcat: OpenShift 예제 Tomcat 이미지
- quay.io/redhattraining/wordpress:5.3.0: WordPress 이미지
- docker.io/library/registry:latest: Docker 레지스트리 이미지
- docker.io/library/tomcat:9.0: Tomcat 9.0 이미지
- 소스코드
- Spring Petclinic: Spring 기반의 펫클리닉 예제 애플리케이션
- Gogs Patched: Gogs의 패치된 버전
Podman 기본 명령어
Podman을 사용하면 Docker와 유사한 방식으로 컨테이너를 관리할 수 있습니다. 주요 명령어와 옵션을 설명합니다.
주요 명령어 및 옵션 설명
- podman run: 새로운 컨테이너를 실행합니다.
- -d: 컨테이너를 백그라운드에서 실행합니다.
- --rm: 컨테이너가 중지되면 자동으로 삭제합니다.
- -p: 포트를 외부:내부로 포워딩합니다.
- -P: 컨테이너의 모든 노출된 포트를 호스트에 자동으로 매핑합니다.
- -e: 환경 변수를 설정합니다.
IP 주소와 포트 번호
IP 주소(IP Address):
- IP 주소는 컴퓨터 네트워크에서 장치를 식별하는 데 사용되는 고유한 숫자입니다.
- 예를 들어, 192.168.1.1 또는 2001:0db8:85a3:0000:0000:8a2e:0370:7334 같은 형식을 가집니다.
- IP 주소는 네트워크 상의 장치를 찾고 통신할 수 있도록 합니다.
포트 번호(Port Number):
- 포트 번호는 네트워크 상에서 특정 애플리케이션이나 서비스와 통신하는 데 사용됩니다.
- 각 포트 번호는 특정 프로세스나 네트워크 서비스에 할당됩니다.
- 예를 들어, 웹 서버는 일반적으로 포트 80(HTTP) 또는 443(HTTPS)을 사용합니다.
IP 주소와 포트 번호의 조합:
- IP 주소와 포트 번호를 함께 사용하여 특정 장치의 특정 서비스에 접근할 수 있습니다.
- 예를 들어, "192.168.1.1:8080"은 192.168.1.1 주소의 장치에서 8080 포트를 사용하는 서비스에 연결합니다.
- 이는 네트워크에서 여러 서비스가 동시에 실행될 수 있도록 해줍니다.
포트 번호와 NAT(Network Address Translation)
포트 번호(Port Number):
- 포트 번호는 컴퓨터 네트워크에서 데이터를 주고받을 때 사용하는 논리적인 접근점입니다.
- 하나의 IP 주소에서 여러 애플리케이션이나 서비스를 구분하기 위해 사용됩니다.
- 표준 포트 번호 예시:
- 80: HTTP 웹 서버
- 443: HTTPS 웹 서버
- 22: SSH 원격 접속
iptables-save:
- iptables-save는 현재 설정된 iptables 규칙을 저장하는 명령어입니다.
- iptables는 리눅스에서 네트워크 트래픽을 필터링하고 조절하는 방화벽 도구입니다.
- 이 명령어를 사용하여 설정된 방화벽 규칙을 파일로 저장할 수 있습니다.
sudo iptables-save > /etc/iptables/rules.v4
S/NAT (Source Network Address Translation):
- S/NAT는 네트워크 트래픽의 출발지 IP 주소를 변경하는 기술입니다.
- 일반적으로 내부 네트워크의 IP 주소를 공인 IP 주소로 변환하여 인터넷에 접속할 수 있게 합니다.
D/NAT (Destination Network Address Translation):
- D/NAT는 네트워크 트래픽의 목적지 IP 주소를 변경하는 기술입니다.
- 외부에서 특정 IP 주소와 포트로 들어오는 트래픽을 내부 네트워크의 다른 IP 주소와 포트로 전달할 때 사용됩니다.
- 예를 들어, 외부에서 "123.45.67.89:8080"으로 접근하는 트래픽을 내부의 "192.168.1.100:80"으로 리디렉션할 수 있습니다.
# 외부 포트 8080으로 들어오는 트래픽을 내부 포트 80으로 리디렉션
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
Docker, Docker Registry, Podman, Buildah, Skopeo의 관계
1. Docker란 무엇인가요?
- Docker는 애플리케이션을 컨테이너로 묶어주는 도구입니다. 컨테이너는 애플리케이션과 필요한 모든 것을 포함한 패키지로, 어디서나 동일하게 실행될 수 있습니다.
- 컨테이너는 애플리케이션이 실행되는 작은 가상 환경이라고 생각하면 됩니다. 여러 컨테이너가 한 컴퓨터에서 동시에 실행될 수 있습니다.
2. Docker Registry란 무엇인가요?
- Docker Registry는 Docker 이미지를 저장하고 배포하는 서버입니다.
- Docker 이미지는 컨테이너를 만들기 위한 템플릿입니다. 예를 들어, Nginx 웹 서버를 실행하기 위한 이미지가 있습니다.
- Docker 이미지를 Docker Hub와 같은 공개 레지스트리 또는 사설 레지스트리(Docker Registry)에 저장할 수 있습니다.
3. Podman이란 무엇인가요?
- Podman은 Docker와 비슷한 컨테이너 관리 도구입니다. Docker와 달리 데몬(daemon) 없이 동작합니다.
- Podman은 Docker 명령어와 거의 동일하게 사용할 수 있어서 Docker 대신 Podman을 사용하는 데 어려움이 없습니다.
- Podman은 컨테이너를 개별적으로 실행할 수도 있고, Pod로 묶어 관리할 수도 있습니다. Pod는 여러 컨테이너를 하나의 그룹으로 묶은 것입니다.
4. Buildah란 무엇인가요?
- Buildah는 Dockerfile을 사용해 컨테이너 이미지를 빌드하는 도구입니다. Docker의 이미지 빌드 기능을 대신합니다.
- Buildah는 컨테이너 이미지를 빌드하고, 수정하고, 관리하는 데 특화된 도구입니다.
5. Skopeo란 무엇인가요?
- Skopeo는 컨테이너 이미지를 검색하고, 복사하고, 관리하는 도구입니다.
- Skopeo는 이미지를 다양한 컨테이너 레지스트리(Docker Hub, Quay, 사설 레지스트리 등) 간에 이동할 수 있도록 도와줍니다.
- 예를 들어, Docker Hub에서 이미지를 가져와 로컬 레지스트리에 저장할 때 사용합니다.
관계 설명
- Docker와 Docker Registry의 관계
- Docker는 컨테이너를 만들고 실행하는 도구입니다.
- Docker Registry는 Docker 이미지(컨테이너 템플릿)를 저장하는 곳입니다.
- Docker는 이미지를 Docker Registry에서 가져와서 컨테이너를 실행합니다.
- Podman과 Docker의 관계
- Podman은 Docker와 비슷한 기능을 제공하지만, 데몬 없이 동작합니다.
- Podman은 Docker 명령어를 그대로 사용할 수 있어, Docker 대신 Podman을 사용할 수 있습니다.
- Buildah와 Docker의 관계
- Buildah는 Dockerfile을 사용해 이미지를 빌드하는 도구입니다.
- Docker와 마찬가지로 이미지를 빌드하지만, Buildah는 더 가볍고 유연하게 이미지를 빌드할 수 있습니다.
- Skopeo와 Docker의 관계
- Skopeo는 이미지를 검색하고 복사하는 도구입니다.
- Docker 이미지뿐만 아니라 다른 컨테이너 이미지도 다룰 수 있습니다.
- 이미지를 다양한 레지스트리 간에 쉽게 이동할 수 있습니다.
- Podman, Buildah, Skopeo의 관계
- Podman은 컨테이너를 실행하고 관리하는 도구입니다.
- Buildah는 이미지를 빌드하는 도구입니다.
- Skopeo는 이미지를 검색하고 복사하는 도구입니다.
- 이 세 가지 도구는 함께 사용되어 컨테이너 이미지를 빌드, 관리, 배포하는 전체 과정을 지원합니다.
요약
- Docker: 컨테이너를 만들고 실행하는 도구
- Docker Registry: Docker 이미지를 저장하고 배포하는 서버
- Podman: Docker와 비슷한 컨테이너 관리 도구, 데몬 없이 동작
- Buildah: 컨테이너 이미지를 빌드하는 도구
- Skopeo: 컨테이너 이미지를 검색하고 복사하는 도구
Podman, Buildah, Skopeo는 함께 사용되어 컨테이너를 만들고 실행하고 이미지를 관리하는 데 사용됩니다. Docker와 Docker Registry는 컨테이너 이미지의 저장 및 배포를 담당합니다. 이 도구들은 각각의 역할을 수행하며, 함께 사용되어 컨테이너 기반 애플리케이션을 효율적으로 관리할 수 있습니다.
네트워크와 볼륨의 의미와 관계
네트워크
네트워크는 컨테이너들이 서로 통신하고, 외부와 통신할 수 있도록 하는 중요한 요소입니다. 네트워크 설정은 컨테이너의 IP 주소, 포트 포워딩 등을 포함하며, 이를 통해 컨테이너 간의 통신 및 외부 서비스와의 연결을 관리합니다.
- Pod 네트워크: Kubernetes의 Pod 내에 있는 모든 컨테이너는 동일한 네트워크 네임스페이스를 공유합니다. 이는 동일한 IP 주소를 공유하고, 컨테이너 간의 통신이 로컬 네트워크를 통해 이루어진다는 것을 의미합니다. Pod 내의 컨테이너들은 서로 localhost로 통신할 수 있습니다.
- 포트 포워딩: Pod 또는 컨테이너에서 외부와 통신하기 위해 특정 포트를 열어주는 기능입니다. 예를 들어, 호스트의 포트 8080을 컨테이너의 포트 80에 연결하면, 외부에서 호스트의 8080 포트를 통해 컨테이너의 웹 서버에 접근할 수 있습니다.
볼륨
볼륨은 컨테이너에서 데이터를 저장하고 공유하기 위한 공간입니다. 컨테이너가 재시작되거나 삭제되더라도 데이터를 유지하기 위해 사용됩니다. 볼륨은 호스트의 파일 시스템과 컨테이너의 파일 시스템 간에 데이터를 공유할 수 있는 방법을 제공합니다.
- Pod 볼륨: Kubernetes의 Pod 내에서 볼륨은 여러 컨테이너가 데이터를 공유할 수 있게 해줍니다. 예를 들어, 하나의 컨테이너가 로그 파일을 생성하고, 다른 컨테이너가 이를 읽을 수 있습니다.
- 영구 볼륨(Persistent Volume, PV): Kubernetes에서 사용되는 영구적인 스토리지 자원으로, Pod의 생명주기와 상관없이 데이터를 유지합니다. PV는 다양한 스토리지 시스템(NFS, 클라우드 스토리지 등)과 연동할 수 있습니다.
네트워크와 볼륨의 관계
Pod 내에서 네트워크와 볼륨은 서로 독립적인 기능을 가지면서도, 애플리케이션의 효율적인 배포와 관리를 위해 함께 사용됩니다.
- 네트워크를 통한 데이터 전송: 네트워크 설정을 통해 컨테이너 간에 데이터를 전송하거나 외부 서비스와 통신할 수 있습니다. 이는 웹 애플리케이션이 데이터베이스와 통신하는 방식과 유사합니다.
- 볼륨을 통한 데이터 공유: 볼륨을 사용하면 Pod 내의 여러 컨테이너가 동일한 데이터를 공유할 수 있습니다. 예를 들어, 한 컨테이너가 데이터를 생성하고, 다른 컨테이너가 이를 처리하는 구조를 만들 수 있습니다.
- 데이터 일관성: 네트워크와 볼륨을 함께 사용하여 데이터의 일관성을 유지할 수 있습니다. 예를 들어, 데이터베이스 컨테이너와 애플리케이션 컨테이너가 네트워크를 통해 통신하고, 볼륨을 통해 로그나 설정 파일을 공유할 수 있습니다.
예시
- Pod 생성 및 네트워크 설정
podman pod create --name my-pod --publish 8080:80
2. 컨테이너 실행 및 네트워크 연결
podman run -d --pod my-pod --name web-server nginx
podman run -d --pod my-pod --name app-server my-app-image
3. 볼륨 생성 및 컨테이너 연결
podman volume create my-volume
podman run -d --pod my-pod --name db-server -v my-volume:/var/lib/mysql mysql
podman run -d --pod my-pod --name log-reader -v my-volume:/logs log-reader-image
위 예시에서 my-pod는 여러 컨테이너(web-server, app-server, db-server, log-reader)를 포함하며, 이들은 동일한 네트워크 네임스페이스를 공유하여 서로 통신할 수 있습니다.
또한 my-volume을 통해 db-server와 log-reader 컨테이너가 데이터를 공유할 수 있습니다.
IP 주소와 포트 번호의 실습 예시: Podman을 사용하여 Nginx 서버 실행
1. Nginx 컨테이너 실행:
podman run -d --name test-nginx -p 8080:80 --rm nginx
- -d: 컨테이너를 백그라운드에서 실행합니다.
- --name test-nginx: 컨테이너 이름을 test-nginx로 설정합니다.
- -p 8080:80: 호스트의 포트 8080을 컨테이너의 포트 80에 매핑합니다.
- --rm: 컨테이너가 중지되면 자동으로 삭제합니다.
- nginx: Nginx 이미지를 사용하여 컨테이너를 실행합니다.
2. 웹 브라우저에서 접속:
- 웹 브라우저를 열고 http://localhost:8080을 입력합니다.
- Nginx 서버의 기본 페이지가 표시됩니다.
터미널 창 나누기
터미널에서 작업을 더 효율적으로 하기 위해 창을 나누어 사용할 수 있습니다.
- Alt+Shift+-: 수평으로 화면 나누기
- Alt+Shift++: 수직으로 화면 나누기
- Ctrl+Shift+W: 창 닫기
이 포스팅에서는 Podman을 사용하여 컨테이너를 관리하고, 워드프레스와 MariaDB를 설정하는 방법에 대해 설명했습니다. 각 명령어의 사용법과 의미를 이해하면, 효율적으로 컨테이너 환경을 구축하고 관리할 수 있습니다.
설정 파일 편집
컨테이너 이미지의 검색 경로와 모드를 설정합니다.
sudo nano /etc/containers/registries.conf
# unqualified-search-registries = ["quay.io", "docker.io"]
# short-name-mode = "enforcing"
워드프레스와 데이터베이스 생성 및 구성
이번 포스팅에서는 Podman을 사용하여 워드프레스와 MariaDB 데이터베이스를 설치하고 설정하는 방법을 설명하겠습니다. 이 과정은 몇 가지 단계로 나뉩니다. 각 단계를 쉽게 이해할 수 있도록 자세히 설명하겠습니다.
1. 기본 HTTP 서버 실행
먼저, 기본 HTTP 서버를 실행합니다. 이는 나중에 워드프레스 설정을 위해 필요합니다.
podman run -d --rm -P quay.io/fedora/httpd-24
- -d: 백그라운드에서 실행
- --rm: 컨테이너가 중지되면 삭제
- -P: 노출된 모든 포트를 호스트에 자동 매핑.
- quay.io/fedora/httpd-24: 사용하고자 하는 컨테이너 이미지입니다. 이 경우 Fedora의 HTTPD(웹 서버) 이미지입니다.
2. 특정 포트로 HTTP 서버 실행
podman run -d --rm -p 18080:8080 quay.io/fedora/httpd-24
- -p 18080:8080: 호스트의 포트 18080을 컨테이너의 포트 8080에 매핑합니다.
3. CentOS 컨테이너 실행 후 Bash 쉘 접속
다음으로, CentOS 컨테이너를 실행하고 bash 쉘로 접속합니다.
podman run -d --rm --name test-centos quay.io/centos/centos:stream9 sleep 10000
- --name test-centos: 컨테이너 이름을 test-centos로 설정합니다.
- quay.io/centos/centos:stream9: 사용할 CentOS 컨테이너 이미지입니다.
- sleep 10000: 컨테이너가 실행된 상태로 유지되도록 합니다.
컨테이너 실행 후 bash 쉘로 접속합니다.
podman exec -it test-centos bash
- exec: 이미 실행 중인 컨테이너에서 명령을 실행합니다.
- -it: 인터랙티브 터미널을 엽니다.
- test-centos: 대상 컨테이너 이름입니다.
- bash: 실행할 명령입니다.
3. 워드프레스 컨테이너 실행
워드프레스 컨테이너를 실행합니다.
podman run -d --rm -p18080:89 --name wordpress quay.io/redhattraining/wordpress:5.3.0
- -p 18080:89: 호스트의 포트 18080을 컨테이너의 포트 89에 매핑합니다.
- --name wordpress: 컨테이너 이름을 wordpress로 설정합니다.
- quay.io/redhattraining/wordpress:5.3.0: 워드프레스 컨테이너 이미지입니다.
이 명령어는 모든 노출된 포트를 호스트에 자동으로 매핑합니다.
podman run -d --rm -P --name wordpress quay.io/redhattraining/wordpress:5.3.0
4. MariaDB 데이터베이스 컨테이너 실행
다음으로, MariaDB 데이터베이스를 실행합니다.
podman run -d --rm -p13306:3306 --name mariadb -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress quay.io/fedora/mariadb-105:latest
- -p 13306:3306: 호스트의 포트 13306을 컨테이너의 포트 3306에 매핑합니다.
- -e MYSQL_USER=wordpress: MariaDB 사용자 이름을 wordpress로 설정합니다.
- -e MYSQL_PASSWORD=wordpress: MariaDB 사용자 비밀번호를 wordpress로 설정합니다.
- -e MYSQL_DATABASE=wordpress: 생성할 MariaDB 데이터베이스 이름을 wordpress로 설정합니다.
- --name mariadb: 컨테이너 이름을 mariadb로 설정합니다.
- quay.io/fedora/mariadb-105:latest: MariaDB 컨테이너 이미지입니다.
또한 CentOS 컨테이너를 실행하여 데이터베이스 설정을 도와줍니다.
podman run -d --rm --name test-mariadb quay.io/centos/centos:stream9 sleep 10000
5. 데이터베이스 IP 주소 확인 및 설정
MariaDB 데이터베이스 컨테이너의 IP 주소를 확인합니다.
podman container inspect mariadb | grep -i ipaddress
- inspect: 컨테이너의 (mariadb) 상세 정보를 확인합니다.
- grep -i ipaddress: 출력된 정보 중에서 IP 주소를 찾습니다. 예를 들어, 출력 결과가 "IPAddress": "10.88.0.29"라면 이 주소를 사용합니다.
podman exec -it test-mariadb bash
확인된 IP 주소를 사용하여 MariaDB 컨테이너에 접속합니다.
dnf install iputils -y
dnf install mariadb -y
컨테이너 내부에서 필요한 패키지를 설치합니다.
- dnf install iputils -y: 네트워크 유틸리티 패키지를 설치합니다.
- dnf install mariadb -y: MariaDB 클라이언트를 설치합니다.
ping 10.88.0.X
데이터베이스 서버로 핑(ping)을 보내 연결 상태를 확인합니다.
mariadb -uwordpress -pwordpress -h 10.88.0.29 -P3306
MariaDB에 접속하여 데이터베이스 설정을 확인합니다.
- -uwordpress: MariaDB 사용자 이름
- -pwordpress: MariaDB 사용자 비밀번호
- -h 10.88.0.29: 데이터베이스 서버 IP 주소
- -P3306: 데이터베이스 포트
show databases;
use wordpress;
show tables;
접속 후 데이터베이스와 테이블을 확인합니다.
- show databases;: 데이터베이스 목록을 표시합니다.
- use wordpress;: wordpress 데이터베이스를 선택합니다.
- show tables;: 선택된 데이터베이스의 테이블 목록을 표시합니다.
이 과정을 통해 워드프레스와 MariaDB 데이터베이스를 성공적으로 설치하고 구성할 수 있습니다. Podman을 사용하면 이러한 작업을 쉽게 수행할 수 있으며, 컨테이너를 통해 일관된 환경에서 애플리케이션을 실행할 수 있습니다.
컨테이너 및 이미지 정리
모든 작업이 끝나면 사용한 컨테이너와 이미지를 정리합니다.
1. 모든 컨테이너 정지 및 삭제
podman container stop --all
podman container rm --all
- podman container stop --all: 모든 실행 중인 컨테이너를 정지합니다.
- podman container rm --all: 모든 컨테이너를 삭제합니다.
2. 모든 이미지 삭제
podman rmi --all
- podman rmi --all: 모든 이미지를 삭제합니다.
3. 컨테이너 및 이미지 목록 확인
podman container ls --all
podman images
- podman container ls --all: 모든 컨테이너 목록을 표시합니다.
- podman images: 이미지 목록을 표시합니다.
WordPress 컨테이너 포트 확인
컨테이너가 사용하는 포트를 확인하려면 다음 명령을 사용합니다:
podman container port wordpress
이 명령은 wordpress 컨테이너가 외부에서 접근할 수 있는 포트를 보여줍니다.
로컬 IP 주소 확인
로컬 머신의 IP 주소를 확인합니다. 일반적으로 ip a 명령어를 통해 확인할 수 있습니다:
ip a
터미널 창 나누기
터미널에서 작업을 더 효율적으로 하기 위해 창을 나누어 사용할 수 있습니다.
- Alt+Shift+-: 수평으로 화면 나누기
- Alt+Shift++: 수직으로 화면 나누기
- Ctrl+Shift+W: 창 닫기
이 포스팅에서는 Podman을 사용하여 컨테이너를 관리하고, 워드프레스와 MariaDB를 설정하는 방법에 대해 설명했습니다. 각 명령어의 사용법과 의미를 이해하면, 효율적으로 컨테이너 환경을 구축하고 관리할 수 있습니다.
이 그림은 두 개의 Pod(dev A와 dev B)와 그 안에 있는 컨테이너, 그리고 외부 사용자와의 상호작용을 나타냅니다.
각 요소와 그 상호작용을 설명하겠습니다.
이 이미지는 두 개의 Pod(POD(dev A)와 POD(dev B))와 각각의 Pod에 포함된 컨테이너들의 네트워크 구성을 보여줍니다. 아래는 이미지의 해석과 설명입니다.
이미지 구성 요소
- Pod(dev A):
- WordPress 컨테이너:
- 역할: 웹 애플리케이션을 제공하는 컨테이너입니다.
- 속성: namespace와 cgroup을 사용하여 컨테이너를 격리합니다.
- MariaDB 컨테이너:
- 역할: 데이터베이스 서버를 제공하는 컨테이너입니다.
- 네트워크 연결:
- 3306 포트: MariaDB 컨테이너의 MySQL 서버가 사용하는 포트입니다.
- 18080 포트: 외부 액세스용 포트입니다. Actor가 이 포트를 통해 WordPress 웹 애플리케이션에 접속합니다.
- WordPress 컨테이너:
- Pod(dev B):
- WordPress 컨테이너:
- 역할: 웹 애플리케이션을 제공하는 컨테이너입니다.
- 상태: PAUSE 모드로 표시되어 있습니다.
- MariaDB 컨테이너:
- 역할: 데이터베이스 서버를 제공하는 컨테이너입니다.
- 상태: PAUSE 모드로 표시되어 있습니다.
- WordPress 컨테이너:
- 네트워크 설정:
- Pod(dev A)의 WordPress 컨테이너는 3306 포트를 통해 MariaDB 컨테이너와 연결됩니다.
- 외부 Actor는 18080 포트를 통해 Pod(dev A)의 WordPress 웹 애플리케이션에 접속할 수 있습니다.
주요 개념 및 설명
- Pod: Kubernetes에서 사용하는 논리적 그룹으로, 하나 이상의 컨테이너를 포함할 수 있습니다. 같은 Pod 내의 컨테이너는 네트워크와 스토리지를 공유합니다.
- 컨테이너: 애플리케이션과 그 종속성을 함께 패키징하여 독립적으로 실행되는 단위입니다. 여기서는 WordPress와 MariaDB 컨테이너가 사용되었습니다.
- 네트워크 포트: 컨테이너가 외부와 통신하기 위해 사용하는 네트워크 포트입니다. 3306은 MariaDB, 18080은 외부 액세스용 포트입니다.
- PAUSE 상태: 컨테이너가 일시 정지된 상태를 나타냅니다.
- Pod(dev A)와 Pod(dev B)는 각각 별도의 네임스페이스에서 실행되며, 각 Pod에는 WordPress와 MariaDB 서버가 포함되어 있습니다.
- Pod(dev A)에서 WordPress와 MariaDB 서버가 서로 연결되어 있으며, MariaDB 서버는 3306 포트를 사용합니다.
- Pod(dev A)는 외부 Actor와 연결되어 있으며, 18080 포트를 통해 WordPress 애플리케이션에 접근합니다.
- Pod(dev B)도 유사하게 구성되어 있지만, 이 Pod는 내부 개발자(dev)가 접근합니다.
이 그림은 각각의 Pod가 독립적으로 작동하며, WordPress와 MariaDB 서버가 함께 배포되어 있는 환경을 보여줍니다.
또한, 외부와 내부 사용자가 각각 다른 포트를 통해 접근하는 방법을 시각화하고 있습니다.
이 그림은 Podman을 사용하여 여러 컨테이너를 실행하고, 네트워크와 포트 매핑을 통해 서로 연결하는 방법을 시각적으로 설명합니다. 각 구성 요소와 연결을 이해하기 쉽게 설명하겠습니다.
주요 구성 요소
- 컨테이너 httpd (Fedora HTTPD 웹 서버)
podman run -d --rm --pod pod-web-service --name httpd quay.io/fedora/httpd-24
- 이 컨테이너는 pod-web-service라는 Pod 내에서 실행됩니다.
- 웹 서버 역할을 하며, Pod 내 다른 컨테이너와 네트워크를 공유합니다.
- 컨테이너 mariadb (MariaDB 데이터베이스 서버)
- MySQL 유저, 패스워드, 데이터베이스 이름을 환경 변수로 설정하여 실행됩니다.
- 호스트의 포트 13306을 컨테이너의 포트 3306에 매핑합니다.
podman run -d --rm -p13306:3306 --name mariadb -e MYSQL\_USER=wordpress -e MYSQL\_PASSWORD=wordpress -e MYSQL\_DATABASE=wordpress quay.io/fedora/mariadb-105:latest
3. 컨테이너 wordpress (워드프레스 웹 애플리케이션)
- 워드프레스 웹 애플리케이션을 실행합니다.
- 모든 노출된 포트를 호스트에 자동으로 매핑합니다.
podman run -d --rm -P --name wordpress quay.io/redhattraining/wordpress:5.3.0
4. 컨테이너 test-centos (CentOS)
- CentOS 컨테이너를 실행하여, 다양한 테스트와 설정을 할 수 있습니다.
podman run -d --rm --name test-centos quay.io/centos/centos:stream9 sleep 10000
5. Pod pod-web-service
- 이 Pod는 여러 컨테이너를 포함하고 있으며, 모든 컨테이너는 네트워크와 볼륨을 공유합니다.
podman pod create --name pod-web-service
네트워크 및 포트 매핑
- 포트 매핑
- 8080/TCP: 웹 서버(httpd)와 워드프레스(wordpress)가 이 포트를 통해 외부와 통신합니다.
- 80/TCP: 호스트의 포트 80이 컨테이너의 포트 80으로 매핑되어 외부 트래픽을 처리합니다.
- 13306/TCP: MariaDB 데이터베이스가 이 포트를 통해 외부와 통신합니다.
- 루프백 네트워크
- Pod 내의 모든 컨테이너는 동일한 IP 주소(127.0.0.1)를 사용하여 서로 통신합니다.
- 예를 들어, test-centos 컨테이너는 /etc/hosts 파일에 다른 컨테이너들의 IP 주소를 정의하여 wordpress, mariadb, httpd와 통신합니다.
데이터 흐름
- 사용자
- 사용자는 웹 브라우저를 통해 호스트의 IP 주소와 포트를 사용하여 웹 애플리케이션에 접근합니다.
- 예를 들어, http://HOST\_IP:18080을 통해 워드프레스에 접속할 수 있습니다.
- 개발자
- 개발자는 CentOS 컨테이너에 접속하여 다양한 설정을 수행합니다.
- 예를 들어, podman exec -it test-centos bash 명령어로 컨테이너에 접속합니다.
명령어 및 설정 설명
- Pod 생성
podman pod create --name pod-web-service
- 컨테이너 실행
- HTTPD 웹 서버
podman run -d --rm --pod pod-web-service --name httpd quay.io/fedora/httpd-24
- 워드프레스
podman run -d --rm -P --name wordpress quay.io/redhattraining/wordpress:5.3.0
- MariaDB 데이터베이스
podman run -d --rm -p13306:3306 --name mariadb -e MYSQL\_USER=wordpress -e MYSQL\_PASSWORD=wordpress -e MYSQL\_DATABASE=wordpress quay.io/fedora/mariadb-105:latest
- CentOS
podman run -d --rm --name test-centos quay.io/centos/centos:stream9 sleep 10000
이 그림과 설명을 통해 Podman을 사용하여 다양한 컨테이너를 실행하고, 네트워크와 포트를 설정하는 방법을 이해할 수 있습니다.
podman pod부터 정리하기
~
이 그림은 Podman을 사용하여 두 개의 컨테이너(Gogs와 Docker Registry)를 포함하는 Pod를 구성하는 방법을 설명하는 다이어그램입니다.
주요 구성 요소
- 컨테이너 gogs (Git 서비스)
- Gogs는 경량화된 Git 서비스입니다.
- 이 컨테이너는 소스 코드 관리와 관련된 작업을 처리합니다.
- 실행 명령어는 명시되어 있지 않지만 일반적으로 다음과 같은 명령어로 실행할 수 있습니다
podman run -d --name gogs gogs/gogs
2. 컨테이너 docker-registry (Docker 이미지 레지스트리)
- Docker Registry는 Docker 이미지를 저장하고 배포하는 서비스입니다.
- 이 컨테이너는 이미지 관리와 관련된 작업을 처리합니다.
- 실행 명령어는 명시되어 있지 않지만 일반적으로 다음과 같은 명령어로 실행할 수 있습니다:
podman run -d --name docker-registry registry:latest
3. Pod
- Pod는 여러 컨테이너를 하나의 논리적 그룹으로 묶는 Kubernetes의 기본 단위입니다.
- 이 Pod는 gogs와 docker-registry 컨테이너를 포함하고 있으며, 이 컨테이너들은 동일한 네트워크와 스토리지를 공유합니다.
- 실행 명령어는 명시되어 있지 않지만 일반적으로 다음과 같은 명령어로 생성할 수 있습니다
podman pod create --name my-pod
4. YOU!! (사용자)
- 사용자는 이 Pod와 상호작용하는 엔터티로, Git 서비스와 Docker Registry를 사용하여 소스 코드를 관리하고 Docker 이미지를 저장하고 배포합니다.
5. GitHub Repository
- 이 레포지토리는 Spring Petclinic 프로젝트를 포함하고 있으며, 사용자는 Gogs를 통해 이 소스 코드를 관리할 수 있습니다.
tangt64/spring-petclinic
연결 및 데이터 흐름
- Pod 내 컨테이너 간의 연결
- Pod 내의 컨테이너들은 같은 네트워크와 스토리지를 공유하므로, gogs와 docker-registry 컨테이너 간의 통신이 가능합니다.
- 예를 들어, Gogs 컨테이너에서 Docker Registry에 이미지를 푸시할 수 있습니다.
- 사용자와 Pod 간의 상호작용
- 사용자는 Gogs 웹 인터페이스를 통해 소스 코드를 관리하고, Docker Registry를 통해 Docker 이미지를 저장하고 배포할 수 있습니다.
- 사용자는 웹 브라우저를 통해 Gogs와 Docker Registry의 웹 인터페이스에 접근할 수 있습니다.
- GitHub 레포지토리와 Gogs 간의 연동
- GitHub에 있는 tangt64/spring-petclinic 레포지토리를 Gogs에 복제하여 관리할 수 있습니다.
- 이를 통해 사용자는 로컬 Git 서비스를 통해 소스 코드를 버전 관리하고 협업할 수 있습니다.
실행 예시
Pod와 컨테이너를 생성하고 실행하는 예시는 다음과 같습니다:
- Pod 생성
podman pod create --name my-pod
2. Gogs 컨테이너 실행
podman run -d --pod my-pod --name gogs gogs/gogs
3. Docker Registry 컨테이너 실행이 그림과 설명을 통해 Podman을 사용하여 Gogs와 Docker Registry 컨테이너를 하나의 Pod로 묶어 관리하는 방법을 이해할 수 있습니다. 각 구성 요소가 어떻게 상호작용하며, 네트워크와 스토리지를 공유하는지 시각적으로 표현되어 있어 이해하기 쉽습니다.
podman run -d --pod my-pod --name docker-registry registry:latest
SSH 로그인 문제 해결
문제:
SSH 로그인이 안 될 때
해결 방법:
- 하이퍼바이저 콘솔에 로그인합니다.
- IP 주소가 변경되었는지 확인합니다.
- IP 주소가 변경되었으면 새 IP 주소로 접속합니다.
- 네트워크 연결을 재설정합니다:
nmcli con up eth0
'Computer Science > CICD' 카테고리의 다른 글
CI/CD-05: Podman을 사용한 컨테이너 관리 및 포트 설정 3 (1) | 2024.07.25 |
---|---|
CI/CD-04: Podman을 사용한 컨테이너 관리 및 포트 설정 2 (2) | 2024.07.23 |
CI/CD-02: Podman과 Docker를 활용한 Kubernetes 클러스터 구성 및 컨테이너 관리 (0) | 2024.07.18 |
네트워크 기초 이해하기: 소켓과 TCP, UDP, TLS/SSL, 포트 번호, NAT (0) | 2024.07.18 |
CI/CD-01: CI/CD와 컨테이너 기술의 이해 및 구축 (0) | 2024.07.18 |