이번에는 도커 이미지를 만들어 보기로 했습니다.
전에는 이미지를 가져다가 그냥 컨테이너로 실행하기만 했었다면 조금 응용을 해보려고 합니다.

일단 기존에 이것 저것 만지느라 사용했던 httpd 이미지는 전부 삭제를 해둔 상태입니다. (저기 있는 것들은 지금 사이드 프로젝트 때문에 지울 수 없는 친구들 ㅠㅠ)

다시 docker 를 이용해 httpd를 실행시키자, 이것 저것 분주하게 다운로드 받기 시작합니다. 레이어를 열심히 끌어오고 있고, 이미지를 다운 받은 뒤 내부 IP를 할당 받은 모습입니다.
저는 어차피 내부 IP로 접근 못하기 때문에 (아직도 풀리지 않은...) 포트 바인딩을 해서 외부에서 접근할 수 있도록 세팅하기 위해 일단 컨테이너를 종료합니다.

확신의 9000번 포트를 이용해 httpd 80번 포트와 바인딩 시켰습니다.

도커 desktop에도 들어가서 확인해 보니 돌고 있는 걸 확인할 수 있었습니다. (GUI가 편하긴 합니다.)

9000번 포트로 들어가보니 "It works!" 하고 잘 돌고 있는 걸 확인했습니다.

몇 번 새로 고침 하니 터미널에서도 로그가 콕콕 찍히고 있네요.
지금까지는 그냥 이것저것 돌고 있는 것만 확인했다면 바로 터미널에 컨테이너를 연결시켜 보려고 합니다.
docker run -it httpd /bin/bash
root@aeb1948684b7:/usr/local/apache2#
이 명령어는 Docker 이미지인 httpd를 기반으로 새로운 컨테이너를 시작하고 해당 컨테이너 내부에서 대화형으로 bash 셸을 실행하는 명령어입니다.
쉽게 말하자면 컨테이너에게 터미널을 부여했으므로 바로 연결된 걸 확인할 수 있습니다. aeb1948684b7 는 컨테이너의 이름입니다.

도커 Desktop으로 확인해 보니 해당 컨테이너가 잘 실행되고 있는 걸 확인할 수 있습니다.
아차! 포트 바인딩을 안 해서 다시 실행합니다 ㅠ_ㅠ
docker run -it -p 9000:80 httpd /bin/bash
root@aeb1948684b7:/usr/local/apache2#

그러면 9000번 포트를 점유하여 다시 컨테이너를 실행시킬 수 있었습니다.
이제 컨테이너와 대화할 수 있게 됐으니 컨테이너의 파일도 수정할 수 있을 것 같습니다.
파일을 한 번 찾아봅니다.

좀 깊게 들어가 있는데 저기 있군요...
지금은 기본적으로 /usr/local/apache2/htdocs 이 경로 안에 들어 있는 index.html 파일을 가져다가 응답으로 내보내고 있는 것 같습니다.

확인해 보니 확실히 저기에 index.html 파일이 존재하고 있습니다.
cat 커맨드로 살펴보니 <html><body><h1>It works!</h1></body></html> 라는 한 줄의 간단한 html 파일 내용이 출력 됩니다.
cat > index.html 로 대충 Hello world! 로 문장을 바꾸고 ctrl + d 로 빠져 나옵니다. (이때 엔터를 쳐주지 않고 바로 누르면 안 되더군요 ㅠㅠ)
이제
httpd-foreground
라는 커맨드를 칩니다.

그럼 컨테이너 내에서 다시 서버를 켜는 것이 보입니다.

새로고침을 해 다시 확인해 보니 제가 바꿨던 내용 그대로 찍히고 있는 것을 확인할 수 있습니다.
일단 컨테이너를 종료하고, 컨테이너와 대화하던 shell도 빠져나옵니다.

shell을 빠져나오자 제 로컬 컴퓨터로 돌아온 걸 확인할 수 있습니다.
여기서 컨테이너를 새로이 만들어서 열면 바꿨던 내용이 아닌 초기의 내용이 나오게 됩니다. 이미지에 원래 들어 있던 내용을 로드하는 거기 때문입니다.
기존에 존재하고 있던 도커 컨테이너로 새로운 도커 이미지를 생성해 보려고 합니다.
docker commit 41e310823faf my_httpd:0.1
이 명령어는 조금 더 설명하자면 Docker 컨테이너를 이미지로 변환하여 새로운 이미지를 생성하는 명령어입니다. 여기서는 기존에 존재하고 있던 컨테이너의 id를 가져다가 새로운 도커 이미지 네임을 붙여서 생성하고 있습니다.

확인해 보니 제가 이름 붙인 대로 만들어지고 있음을 확인할 수 있었습니다.
처음에는 그냥
docker run -p 9000:80 my_httpd:0.1
까지만 입력하고 9000번 포트로 접근했더니 아직 실행이 되지 않았다고 합니다. GUI로도 확인하니 노오란색 박스가 절 맞이했습니다.
왜지? 하고 보니까 httpd 이미지는 Apache HTTP 서버를 실행하는데, 해당 이미지는 이미 서버를 실행하기 위한 명령이 설정되어 있기 때문에 docker run httpd를 실행하면 Apache HTTP 서버가 실행되는 거였습니다.
제가 만든 my_httpd:0.1는 서버 실행 스크립트까지는 작성되어 있지 않은 상태여서 또 다른 명령어를 붙여줘야만 했었습니다.
컨테이너 자체는 이미지에서 뜬 붕어빵 같은 느낌이기 때문에 이미지에 설정되어 있는 스크립트까지는 복제해오지 못하는 모양이었습니다.
docker run -p 9000:80 my_httpd:0.1 httpd-foreground
뒤에 httpd-foreground 옵션을 붙여주니 서버가 실행이 됩니다. 아마 이 옵션이 서버를 실행시키는 듯 합니다.
확실히 GUI로는 다룰 수 없는 세세한 부분까지 CLI는 다룰 수 있는 게 좋습니다.
컨테이너를 가지고 이미지를 만들면 이미지 자체에 설정되어 있는 스크립트까지 가져올 수 없다는 것도 알 수 있어서 좋았습니다.