테스트를 위해 사용하고 있는 오라클 클라우드의 로키 리눅스에 도커를 설치하고 웹서버를 컨테이너로 구동해야 할 일이 생겼다. 그 과정을 기록으로 남기기로 했다. 먼저 로키 리눅스의 최신 패티를 적용한다.
도커 설치를 위한 사전 준비사항 (dnf update 및 필수 패키지 설치)
로키(rocky) 리눅스는 이전 CentOS 버전에서 사용하던 yum 명령어 대신 새롭게 추가된 dnf. 명령을 통해 원격 리포지토리에서 최신 패치를 받아와 설치해 주는 것이 좋다. 다음 명령어로 최신 업데이트를 설치한다.
dnf update -y

리눅스의 최신 업데이트 설치가 완료되었다면 다음으로는 Docker를 설치하고 사용하는데 필수적인 패키지를 다음 명령어를 실행하여 설치한다.
dnf install -y yum-utils device-mapper-persistent-data lvm2

다음은 도커 관련 패키지를 다운로드 받을 수 있는 공식 리포지토리를 yum-config-manger 명령을 사용하여 미리 등록해 둔다.
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

로키 리눅스의 공식 리포지토리에는 응용프로그램 가상화에 사용되는 도커를 설치할 수 없다. 그래서 도커를 개발하는 docker.com에서 제공하는 리포지토리를 추가해줘야 한다.
도커(Docker) 설치 및 호스트 리부팅 시 자동 실행 설정
다음과 같이 dnf 명령을 통해 리눅스 응용프로그램 가상화 컨테이너를 실행시켜 주는 도커 패키지를 설치한다.
dnf install -y docker-ce docker-ce-cli containerd.io

도커 패키지가 정상적으로 설치 완료되면 다음과 같이 패키지 목록이 보인다.

도커가 설치되었다면 컨테이너가 실행되는 호스트 리눅스 서버를 리부팅 했을 때 도커 서비스가 자동으로 실행되도록 systemctl 명령을 통해 설정해준다.
systemctl enable docker

호스트 리눅스를 리부팅 했을 때 잘 자동으로 잘~ 실행되는지 확인하기 위해 서버를 리부팅 해볼 것을 권한다. 만약 수동으로 실행하고자 한다면 enable을 start로 바꿔서 실행 해주면 된다.
도커를 사용할 때 가장 많이 사용하게 되는 명령은 docker 다. 그런데 이 docker 명령은 기본적으로 root 계정에서만 실행할 수 있다. 하지만 보안 문제로 인해 docker 명령을 사용할 수 있는 root 이외의 다른 계정을 등록하고 해당 계정에서 docker 명령을 사용하는 것이 권장된다. 다음의 명령과 같이 root 이외의 계정을 도커 관리자 계정을 등록해준다.
usermod -aG docker taeho
이 명령은 taeho 라는 계정을 docker 사용자 그룹에 추가해준다는 의미다. 즉 docker 명령을 사용할 수 있는 관리자로 등록되는 것이다.

도커 서비스가 정상적으로 잘 실행되었는지 확인하고자 한다면 다음과 같이 ps 명령으로 확인할 수 있다.
ps -ef | grep docker

dockerd 대몬이 잘 실행 중이라면 컨테이너를 생성하여 응용프로그램 가상화 서버를 실행할 수 있다. 하지만 이 dockerd만 실행되었을 때는 호스트에 그 어떤 가상 응용프로그램이 실행되어 있지 않은 상태다.
이제 실행하고자 하는 응용프로그램 가상머신의 이미지를 다운로드 받아 실행해보자.
웹서버 가상 머신 이미지 다운로드 및 실행하기
VMWare나 Hyper-V는 호스트 머신의 운영체제와 게스트 머신의 운영체제가 완벽하게 격리되어 실행된다. 즉 호스트와 게스트가 하나의 물리적인 서버에서 실행되지만 완전하게 다른 컴퓨터다. 물리적인 자원은 공유하지만 사용하는 메모리, 운영체제의 커널, 파일시스템 등은 모두 별개로 독립적으로 격리되어 사용된다. 따라서 호스트의 운영체제나 호스트에 접속한 사용자 및 응용프로그램이 게스트의 메모리나 운영체제 그리고 파일에 접근할 수 없다. 하지만 도커(Docker)와 같은 응용프로그램 가상화는 호스트가 사용하는 메모리, 운영체제, 커널, 파일시스템 등을 공유한다.
이제 호스트에서 실행할 응용프로그램 가상화 이미지 중에서 alpine 리눅스와 nginx가 포함되어 있는 응용프로그램 가상화 이미지를 docker pull 명령을 실행하여 다운로드 받아보자.
docker pull nginx:alpine

이 명령은 docker.com의 공식 레지스트리에서 alpine 리눅스와 nginx를 하나로 묶은 응용프로그램 가상화 이미지를 다운로드(pull) 한다. alpine 리눅스가 포함되어 있다고 하지만 실제로는 운영체제 전체가 포함된 것이 아니라 nginx를 가상화하는데 필요한 일부 라이브러리와 기본적인 명령어만 포함되어 있는 운영체제다.
다운로드 받은 이미지는 docker images 명령으로 확인할 수 있다.
docker images

이 명령은 도커 레지스트리에서 로컬의 도커 이미지 저장소로 내려받은(docker pull)한 이미지와 직접 빌드하여 로컬 도커 이미지 저장소에 등록(docker load)한 이미지의 목록을 보여준다.
Nginx컨테이너 실행하기
원하는 이미지를 다운로드 받은 다음 곧바로 컨테이너를 생성해 실행할 수 있다. 만약 표준 설정이 아닌 추가적인 설정을 원하거나 호스트의 특정 디렉토리를 응용프로그램 가상머신에 마운트하여 사용하고 싶다면 Dockerfile 등을 작성하여 관련 설정을 추가한 다음 이미지를 빌드하여 등록할 수도 있다.
여기서는 일단 Nginx 응용프로그램 가상머신에 기본적인 웹 서비스 포트를 연결하는 정도의 설정만 추가하여 컨테이너를 생성하고 실행하는 방법을 설명한다. 도커 이미지를 기반으로 새로운 컨테이너를 생성하고 실행하고자 한다면 다음과 같이 docker run 명령을 사용하면 된다.

run 옵션은 이미지를 실행할 수 있는 컨테이너로 생성하여 실행하는 옵션이고 –name은 생성하는 컨테이너의 이름이며 -d 옵션은 컨테이너를 생성할 이미지의 이름이다. -p 옵션은 컨테이너의 8080 포트를 호스트의 80과 연결해준다는 의미다. 즉 호스트의 80 포트로 접근하게 되면 컨테이너의 8080 포트로 연결해주는 것이다. 당연히 컨테이너의 Nginx는 8080으로 설정해줘야 한다. 만약 아래 화면처럼 컨테이너의 80과 호스트의 80을 연결해주고 싶다면 -p 80:80 으로 변경해주면 된다.
run 옵션으로 실행한 컨테이너는 다음과 같이 docker ps 명령으로 실행중인지 여부를 확인할수 있다.
docker ps

만약 이렇게 잘 실행 중인데 외부의 브라우저에서 호스트의 80으로 접속했을 때 컨테이너의 Nginx에 연결되지 않는다면 호스트의 방화벽 정책을 확인해야 한다. 통신 포트가 정상적으로 열려있고 포트 포워딩이 잘 동작한다면 다음과 같이 Nginx 초기 페이지가 보일 것이다.

브라우저의 주소창에 입력된 IP는 컨테이너의 내부 IP 주소가 아니라 컨테이너가 실행중인 호스트의 IP 주소와 Port 번호다.
도커 컨테이너의 이름 변경하기
도커 컨테이너의 이름은 변경할 수 있다. 변경하기 위해서는 먼저 실행중인 컨테이너를 정지한다. 컨테이너를 정지할 때는 docker stop 명령을 사용한다.
iptables -L

정지할 때는 일반적으로 도커 컨테이너의 이름을 지정한다. 이름은 docker ps 명령으로 실행 중인 컨테이너의 목록에서 확인할 수 있다.
만약 정지되어 있는 컨테이너의 이름을 바꾸고자 한다면 다음과 같이 docker ps -a 명령으로 확인할 수 있다.

컨테이너의 이름은 다음과 같이 docker rename 명령을 통해 변경한다.
docker rename my-nginx nginx-godlife

이름을 변경한 컨테이너를 실행할 때는 변경된 이름을 지정하여 실행하면 된다. docker run 명령으로 생성하고 최초 실행한 컨테이너는 이후 정지 후 실행할 때는 docker exec 명령으로 실행하면 된다.
docker start nginx-godlife

#도커 #도커컨테이너 #도커이미지 #도커설치
답글 남기기