https://hub.docker.com/_/nginx

이번에는 도커 허브에서 제공하는 DOI(Docker Official Image) 컨테이너인 Nginx를 설치하고자 한다.
Nginx는 웹서버 만드는데 사용되는 자주 사용되는 프로그램이라 하며.. 잘은 모르겠는데 속도가 빠르고 가볍다고 한다.
뭐 일단 이렇게 넘어가고 하단부에 여러가지 버전 링크가 제공되는데
Nginx 단독으로만 사용되는건 아니고 이거랑 좀 같이 사용되는 도구를 각 상황별로 엮은 도커 이미지 파일이 제공된다 보면 된다.
간단하게 mainline는 Nginx이 기능을 수행하기 위한 최소 도구만 포함된 것 같고.. perl, otel은 모니터링이나 개발언어가 추가된 버전으로 보인다.
alpine는 Alpine Linux에 Nginx만 포함된 패키지라 보면 되는데
필자는 이 alpine버전을 설치하고자 한다.

설치 명령어는 아래와 같다.
docker pull nginx:1.27.3-alpine

이미지를 빌드까지 했다면 이미지에 대한 정보를 확인하고자 아래의 명령어를 수행하자
docekr image history [기록을 확인할 이미지]

음.. 이게 필자의 경우 위 명령어로 확인을 해보려고 해도 뭔가 이상하게 PowerShell로 나오지를 않는다
따라서 좀 무식하게 아래의 방식을 사용한다
docker history [기록을 확인할 이미지ID]

이렇게라도 image의 기록을 확인하는 것이 가능하다.
여기서 중요하게 봐야하는것은 EXPOSE map으로 시작하는 구문인데
컨테이너 내부에서 특정 포트를 사용하는지에 대한 내용이 정의된 부분이다.
이게 있으면 호스트 PC <-> 도커 컨테이너간 포트 매핑을 해줘야
해당 도커 내에서 구동되는 Nginx서버에 접근이 가능해진다.
따라서 해당 도커를 제대로 컨테이너 등록 및 초기 설정을 진행하려면 아래와 같이 docker run을 해야한다.

명령어에 대해 상세설명을 하자면
-d : 백그라운드에서 실행
-p : 호스트 - 컨테이너간 포트 매핑

docker ps 명령이나
docker port [확인하고 싶은 컨테이너]
를 통해서도 위 정보를 확인이 가능하다.
내용을 확인했으니 등록한 컨테이너 nginx가 잘 동작하는지 확인해보자
curl localhost:8001

명령창에서만 확인하면 이해가 좀 안가긴 하는데 웹 브라우저에 해당 명령어를 쳐 보면 현재 웹 서버인 nginx의 홈페이지에 접속하는 것과 같은 기능을 수행한다 보면 된다.
마지막으로 ngix 폴더 접속 후 핸들링 방식은 vscode IDE를 적극 활용하자


다음으로 수행할 내용은 도커 컨테이너 중 mySQL 항목이 있어서 이를 설치하고 실습해보기 이다.
설치할 버전은 위 노란색 박스로 표시한
mysql:8.0-debian 버전을 설치하고자 한다.
docker pull mysql:8.0-debian

이미지를 다운받았으니 정보를 확인해보자
# 현재 빌드한 이미지 목록 확인
docker images
# 빌드한 이미지 중 히스토리 확인하고 싶은 이미지
docker history [빌드한 이미지명 or 이미지 ID]

빌드를 완료한 도커 이미지는 아래의 코드로
컨테이너 등록 및 실행을 진행한다
docker run -it -e MYSQL_ROOT_PASSWORD=pass123 mysql:8.0-debian /bin/bash
각 항목에 대한 설명을 하자면
-e MYSQL_ROOT_PASSWORD=pass123
이 부분은 환경변수 설정 + 루트의 계정은 pass123으로설정하겠다는 뜻이다.
참고로 루트계정의 PW는 반드시 지정하라고 한다..
위 코드에서는 등록한 컨테이너의 이름 등록부분이 빠져있다.
이런 경우에는 docker에서 자체적으로 랜덤한 이름으로 컨테이너명을 등록해 버린다.

만약 컨테이너를 종료 후 재시작하는 상황이라면 아래의 코드를 추가로 활용하자
# 컨테이너 시작
docker start [랜덤으로 등록되버린 컨테이너명]
# 컨테이너의 bash 쉘 스크립트 실행
docker exec -it affectionate_kilby /bin/bash
참고로 /bin/bash는 bash 쉘 스크립트 파일의 경로이다.
그래서 /bin/bash 가 아닌 그냥 bash만 써도 동일한 경로에서 쉘 스크립트가 실행된다.

음.. 뭐가 꼬였으면 아에 컨테이너 삭제 후 다시 run하면 된다
docker stop [실행중인 컨테이너]
docker rm [삭제하고 싶은 컨테이너]
# 삭제 후 도커 컨테이너 재 등록
docker run -it --name my-mysql-container -e MYSQL_ROOT_PASSWORD=pass123 mysql:8.0-debian /bin/bash

아무튼 실행한 컨테이너 내부에서 mysql을 초기화 하려면 아래의 코드를 써야한다.
이거는 mysql 버전마다 다르니 잘 찾아봐야 한다..
# 컨테이너 내부에서 mysql 초기화
mysqld --initialize-insecure --user=root
mysqld --user=root --daemonize
# 초기화한 mysql에 비번 없이 접속
mysql -u root
# 접속 후 mysql 창에서 비밀번호 설정
ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass123';
FLUSH PRIVILEGES;
# 신규 Powershell 창을 열은 뒤 컨테이너 bash에 접속
docker exec -it my-mysql-container bash
# 현재 실행중인 mysql 끄기
mysqladmin -u root -p shutdown
여기까지 해야 mysql초기화 및 루트계정의 비번 등록이 정상적으로 진행된다...
아무튼 위 명령어까지 수행하고 초기설정을 완료한 뒤에는
아래의 코드로 다시 실행하면 된다.
# mysql 실행
mysqld --user=root --daemonize
# mysql 접속
mysql -u root -p

실행중인 mysql에서 현재 활성화된 데이터베이스 보는건 아래와 같다.
show databases;

뭔가 오타가 많지만 넘어가자...
이 다음부터는 mysql의 database 생성, table 생성, 그리고 데이터베이스의 각종 코드 수행가능하다...
할것 다했으면
exit

참고로 exit 두번치면 아에 컨테이너 밖으로 빠져나오니
docker exec -it my-mysql-container bash
이 명령어로 다시 진입하자

그 다음에는 mysql workbench나 mysql에 연동되는 IDE등을 컨테이너랑 연결해서 쓸 수 있는데
음.. 패스
docker stop my-mysql-container

적당히 종료하고 오늘 실습은 여기까지..