Docker 이미지 만들기

haerim·2024년 3월 23일

공부를 합시다

목록 보기
5/7

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

  1. 일단 기존에 다운 받았던 이미지나 실행시켰던 컨테이너를 전부 삭제하고 (기존에 돌리고 있던 이미지나 컨테이너는 안 지울 겁니다!)
  2. httpd 이미지를 가져다 실행할 겁니다.
    • 여기서! 기존에는 "It Works!" 가 나오는 페이지를 봤었는데 다른 수정된 페이지가 나오도록 할 예정입니다.
    • 그걸 위해 컨테이너 안의 특정 파일을 수정도 해볼 겁니다.
  3. 그리고 그 상태로 실행되는 이미지를 만들어 보려고 합니다.
    • 이후에는 늘 수정된 상태의 페이지가 나오는 이미지로 컨테이너를 만들어 실행한다면 항상 원하는 문서가 기본 페이지로 제공될 것이라 생각합니다.

수정할 도커 이미지 받기

기존 컨테이너 상태


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

httpd 도커 이미지 받기

다시 docker 를 이용해 httpd를 실행시키자, 이것 저것 분주하게 다운로드 받기 시작합니다. 레이어를 열심히 끌어오고 있고, 이미지를 다운 받은 뒤 내부 IP를 할당 받은 모습입니다.

저는 어차피 내부 IP로 접근 못하기 때문에 (아직도 풀리지 않은...) 포트 바인딩을 해서 외부에서 접근할 수 있도록 세팅하기 위해 일단 컨테이너를 종료합니다.

도커 컨테이너를 외부에서 접속할 수 있도록 port 바인딩 하기

확신의 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번 포트를 점유하여 다시 컨테이너를 실행시킬 수 있었습니다.

이제 컨테이너와 대화할 수 있게 됐으니 컨테이너의 파일도 수정할 수 있을 것 같습니다.

컨테이너 안 conf 파일 찾기

파일을 한 번 찾아봅니다.

좀 깊게 들어가 있는데 저기 있군요...

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

index.html 파일 찾아 수정하고 저장하기

확인해 보니 확실히 저기에 index.html 파일이 존재하고 있습니다.
cat 커맨드로 살펴보니 <html><body><h1>It works!</h1></body></html> 라는 한 줄의 간단한 html 파일 내용이 출력 됩니다.

cat > index.html 로 대충 Hello world! 로 문장을 바꾸고 ctrl + d 로 빠져 나옵니다. (이때 엔터를 쳐주지 않고 바로 누르면 안 되더군요 ㅠㅠ)

httpd 재실행 및 변경 사항 확인

이제

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는 다룰 수 있는 게 좋습니다.

컨테이너를 가지고 이미지를 만들면 이미지 자체에 설정되어 있는 스크립트까지 가져올 수 없다는 것도 알 수 있어서 좋았습니다.

profile
멋진 프론트엔드 개발자가 되고 싶은

0개의 댓글