Docker와 Apache 웹서버

SummerToday·2024년 2월 5일

도커, 서버 기술

목록 보기
12/34
post-thumbnail

Docker와 Web Server

  • 웹서버로는 Apache(아파치), Nginx(엔진엑스)가 많이 사용된다.

  • 이 중 대표적인 웹서버인 아파치를 기준으로 도커를 실행해본다


Apache의 공식 Docker Image

  • 아파치의 공식 이미지 이름은 httpd이다.

docker search httpd

  • 이미지가 너무 많이 검색될 시 --limit 옵션을 활용할 수 있다.

docker search httpd --limit=5


Image 다운받고 바로 Container로 만들어 실행

docker run httpd

위 명령어로 입력 시 아파치의 서버 안으로 진입되어 따로 명령을 입력할 수 없는 상태가 되어, ctrl + c 를 이용해 컨테이너를 중지하고 나와야한다.

따라서 보통은 컨테이너가 background로 실행될 수 있도록 다음 명령어를 사용해야한다,

docker run -d --name apachweb httpd


Apache 웹서버 접속하기

  • 포트 포워딩이 필요하다.

    포트포워딩(port forwarding)은 컴퓨터 네트워크 상에서 패킷이 방화벽이나 라우터 같은 네트워크 게이트를 지날 때 IP 주소와 포트 번호 결합의 통신 요청을 다른 곳으로 넘겨주는 기능이다.

  • NAPT 기술을 지원하는 -p 옵션을 사용해야한다.

    MAPT(Network Address Port Translation) 호스트 PC (도커를 실행한 PC) IP에 특정 포트로 진입 시 해당 포트를 도커 컨테이너의 특정 Priavate IP의 특정 포트로 변환해줄 수 있는 기술이다.

    docker run -d -p 9999:80 --name apacheweb httpd

    위 명령어는 apachweb 컨테이너는 apache 웹서버 프로그램을 실행하고, 호스트 pc에 9999 포트로 접속하면 자동으로 이를 해당 컨테이너의 80 포트에 연결해주겠다는 의미이다.

    또한 AWS EC2상에서 도커를 실행하고 있을 시 EC2의 보안그룹으로 들어가 9999포트에 대한 인바운드 규칙을 추가해줘야 한다.

위 과정이 끝나고 AWS EC2의 public IP:9999(포트번호)로 접속 시 'It works'라는 문구가 나오며 정상적으로 접속이 되고 있음을 알 수 있다.

public IP 주소에 포트번호를 생략할 시 default 값인 80번으로 접속이된다.

따라서 포트 번호 없이 IP 주소로만 접속 하려면 다음 명령어로 실행하면 된다.

docker run -d -p 80:80 --name apacheweb httpd


Apache 기본 설정 디렉토리 변경

  • 아파치 접속 시 기본으로 /usr/local/apache2/htdocs 폴더에 있는 index.html이 열리게 되어있다.

  • html 파일만 교체해주면 아파치 접속 시 커스텀된 웹 사이트를 보여줄 수 있다.

  • 도커는 이미지를 기반으로 컨테이너를 만들기 때문에 컨테이너 상에서 파일을 업데이트 하거나, 생성할 경우 컨테이너가 종료될 경우, 해당 파일도 같이 사라지게 된다.

  • 따라서 -v 옵션 명령어를 이용해 기본 폴더 경로를 호스트 PC에 있는 폴더로 바인딩(공유) 해놓는 것이 좋다.

    docker run -d -p 80:80 -v [호스트 PC의 절대 경로]:[도커 컨테이너 절대 경로] --name [원하는 컨테이너 이름] httpd

    이때도 AWS EC2 보안그룹의 인바운드 규칙에서 80번 포트를 추가해줘야 한다.

    • cf. pwd, cd, ls 를 활용해 해당 파일의 절대경로를 확인한다.

    • cf. FileZila Client를 통해 파일을 EC2에 업로드 하는 과정이 선행되어야 한다. (이외 방법들도 존재)

      최상단 파일 옵션 바로 밑에 있는 사이트 관리자 열기 -> 새 사이트 생성 -> 프로토콜 SFTP 설정
      -> 호스트에 EC2 퍼블릭 IP 주소 입력 -> 로그온 유형에 키 파일로 설정 -> AWS pem 키 파일 등록 -> 로컬 PC에 있는 파일 중 원하는 파일을 우클릭하여 업로드


Docker 저장소 사용현황 확인

개발 중 저장소 공간 부족 문제가 발생 할 수 있으니 다음 명령어를 통해 확인을 해주는 것이 좋다.

docker system df


Docker와 Alpine

  • Docker 이미지는 여러개의 이미지가 계층으로 쌓인 형태로 작성이 된다

    도커 컨테이너 같은 경우는 특정 응용프로그램 실행을 목적으로 사용하는 경우가 많기 때문에, 실행에 필수적인 기능들만 포함하고 있는 것이 좋다.
    따라서 대부분의 도커 이미지의 가장 기본이 되는 이미지는 ubuntu가 아니라 alpine인 경우가 많다.

    • Alpine
      알파인 리눅스는 보안, 단순성, 자원 효율성을 위해 설계된 musl libc, BusyBox 기반의 리눅스 배포판이다.
      • musl libc
        임베디드 리눅스(초경량 시스템을 위한 리눅스 시스템)를 위한 C/POSIX library(C 언어를 위한 기본 함수 및 POSIX라는 표준 규격에 맞춘 기본함수를 포함한 라이브러리)

      • BusyBox
        운영체제 운영에 기본이 되는 유틸리티만 모아 놓은 리눅스 패키지
  • httpd:alpine
    httpd도 태그 중에 alpine 기반 태그가 존재한다.

    https://hub.docker.com/_/httpd?tab=tags&page=1&ordering=last_updated

    • httpd:alpine으로 아파치 서버 실행

      docker run -d -p 80:80 -v [호스트 PC의 절대 경로]:[도커 컨테이너 절대 경로] --name [원하는 컨테이너 이름] httpd:alpine


실행중인 컨테이너 사용 리소스 확인

  • 다음 명령어를 사용해 실행중인 컨테이너의 시스템 리소스 사용 현황을 확인할 수 있다.

    docker container stats

    Ctrl + C 를 통해 종료한다.


실행중인 컨테이너에 명령 실행

  • 컨테이너가 실행중일 때에만 다음 명령을 실행할 수 있다.

    docker exec [옵션] [컨테이너 ID 명령 인자]

  • 다음과 같이 명령 시 /bin/sh 쉘 프로그램을 실행하면서, 터미널에 연결이 되어 컨테이너 내부로 진입할 수 있다. 알파인 리눅스에는 bash 쉘이 존재하지 않으므로 /bin/sh를 해준다.
    따라서 컨테이너 이미지마다 사용하는 쉘이 다르기 때문에 잘 확인해야한다.

    docker exec -it [컨테이너 이름]  /bin/sh


실행중인 컨테이너에 연결하기

  • docker run과 -it 옵션을 사용하여 컨테이너가 바로 종료되지 않도록 설정 후 백그라운드(-d)로 실행.

    docker run -it -d --name myubuntu ubuntu
    또는 docker run -dit --name myubuntu ubuntu 도 가능하다.

  • 해당 컨테이너에 연결되어, 컨테이너에서 쉘 프로그램을 사용하여 명령을 내릴 수 있다.

    docker attach myubuntu

    • exit로 나올 수있다.
  • exec 명령은 해당 컨테이너에서 명령을 하는 것이고, attach는 해당 컨테이너에 연결을 하는 것이다.

모든 컨테이너 삭제

  1. 모든 컨테이너 중지

    docker stop $(docker ps -a -q)

  2. 모든 컨테이너 삭제

    docker rm $(docker ps -a -q)

    • 참고
      • docker container prune
        : 정지된 컨테이너 삭제

      • docker image prune
        : 실행중인 컨테이너의 image 외의 이미지 삭제

      • docker system prune
        : 정지된 컨테이너, 실행중인 컨테이너 이미지 외의 이미지, 볼륨, 네트워크 삭제

모든 이미지 삭제

docker rmi $(docker images -q)

  • 모든 이미지 강제 삭제

    docker rmi -f $(docker images -q)




해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다.
인프런, 잔재미 코딩, ⌜풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]⌟
profile
블로그 이관했습니다.

0개의 댓글