개발 ON
  • [Raspberry Pi 5] 라즈베리파이5 Docker 정적 페이지 배포
    2024년 09월 13일 23시 02분 19초에 업로드 된 글입니다.
    작성자: 이주여이

    사실 정적 페이지는 Docker 사용하지말고 github page나 netlify로 배포하는 게 낫다. 뭣하러 정적 페이지 배포할려고 서버를..

     

    난 라즈베리파이를 24시간 내내 돌리고 있기 때문에 궁금해서 해봤다..

    1. 배포 환경

    RaspberryPI5(Debian)

    2. 선수 작업

    1. docker run ~ 할 때 포트 지정해주는 -p 옵션 뒤에 오는 포트를 포트 포워딩 시켜줘야한다.

     

    2. VS Code 등으로 작업한 정적 페이지가 담긴 폴더가 있어야 한다.

     

    3. 호스트 PC에서 정적 페이지가 담긴 폴더를 라즈베리파이 내부의 디렉터리에 옮겨야 하기 때문에 FTP가 가능해야 한다.

    전송 실패가 있는 이유는 user5221한테 권한 안줘서 그렇다. 이후 권한주고 파일 넘겼으니 됐다.

     

    4. 때문에 SSH 접근이 가능해야 한다.

     

    js, css, html 파일을 뭐.. 내부에서 만들 수 있지만 만들어놓은 거 그냥 옮기는 게 낫지 않겠나 싶다.

    3. (선택 사항) docker 그룹에 유저 추가

    라즈베리파이 이미져 설치 시 지정했던 hostname은 권한은 root가 아니다. 때문에 docker 명령어를 실행할 때 마다 'sudo'를 붙여야 한다. 따라서 아래와 같이 docker 설치 시 생성된 docker라는 그룹에 라즈베리파이 내부 계정을 추가하도록 한다.

     

    usermod -aG docker ${라즈베리파이 hostname } # docker 그룹에 계정을 추가한다.
    newgrp docker # 해당 사항을 적용시킨다.

    3. dockerfile 생성

    # arm64 기반의 httpd(Apache) 이미지를 사용한다.
    FROM arm64v8/alpine:latest
    
    # Apache HTTP를 설치한다.
    RUN apk update && apk add --no-cache apache2
    
    # 정적 페이지가 있는 디렉토리를 이미지 내부 경로로 이동시킨다.
    COPY ${정적 페이지가 있는 디렉토리} /var/www/localhost/htdocs/
    
    # 컨테이너가 수신할 포트를 명시한다. 참고로 Apache의 기본 포트는 80이다.
    EXPOSE 80
    
    # 컨테이너 실행 시 Apache가 포그라운드에서 실행되도록 한다. ~ 실행 상태 유지 ~
    CMD ["httpd", "-D", "FOREGROUND"]

    2. docker build

    user5221@raspberrypi:~$ docker build -t ${지정할 이미지명 } ${컨텍스트 경로}
    user5221@raspberrypi:~$ docker build -t todolist . # (예)
    • -t : docker 이미지 이름과 태그를 붙일 수 있는 옵션
    • 컨텍스트 경로에는 build 할 수 있는 dockerfile이 있는 경로를 적어주면 된다. 예시에서 . 으로 적은 이유는 build 할 때 해당 경로에 dockerfile이 있기 때문이다.

     

    user5221@raspberrypi:~$ pwd
    /home/user5221
    user5221@raspberrypi:~$ tree
    .
    ├── dockerfile
    └── todolist
        ├── common.css
        ├── index.html
        └── index.js
    
    2 directories, 4 files

    3. docker run

    user5221@raspberrypi:~$ docker run -d -p 5221:80 --name 5221_todolist todolist
    dc6fd97e567047c4711cdec49343bbc5244c9f92aa7cfd037acc2415aa251796
    user5221@raspberrypi:~$ docker ps
    CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                         NAMES
    dc6fd97e5670   todolist   "httpd -D FOREGROUND"    3 seconds ago   Up 2 seconds   0.0.0.0:5221->80/tcp, [::]:5221->80/tcp       5221_todolist
    bbe0f6802443   mariadb    "docker-entrypoint.s…"   4 hours ago     Up 4 hours     0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp   mariadb

     

    docker run ~ 명령어를 해석해보자면 -d는 백그라운드 실행, -p 5221:80은 세트다.

     

    -p 옵션은 포트를 지정해주는데 5221은 사용자가 외부에서 들어올 때 사용할 포트..

     

    그리고 80은 dockerfile에서 작성했던 80 포트와 동일하게 적어준다.

     

    --name 옵션으로 컨테이너의 이름을 지정할 수 있다. 지정하지 않을 경우엔 랜덤으로 이름을 명시해준다. 나는 포트 번호_별칭 이런 식으로 지어줬다.

     

    끝에있는 todolist는 이미지를 뜻한다. 내가 위에서 docker build ~ 했을 때 만들어진 이미지명을 적어 준 것이다.

    4. 확인

    댓글