1. 서론
개발 중 ReactJS를 dockerize 한 적이 있다. Dockerfile과 docker-compose.yml 파일로 dockerize를 했는 데 docker-compose.yml 작성 중 ReactJS가 제대로 작동하지 않는 것을 확인하고 무슨 문제인가 한참을 찾았던 경험이 있다. 따라서, 나와 비슷한 문제를 겪고 있는 사람들을 위해 이 포스팅을 작성한다.
결론부터 말하자면 문제는 tty와 stdin_open 값을 true로 줘야한다는 점이다. docker-compose.yml에서는 이 두 값을 true로 설정하면 되고, Dockerfile만을 사용해서 build 후 run할 때는 -it 를 붙여주면 된다. 이유는 ReactJS가 실행될 때 terminal과 stdin을 사용하기 때문이다.
2. 환경 설정
ReactJS를 생성해보자.
# react 앱 생성 및 폴더 열기
create-react-app dockerize-react
cd dockerize-react
3. 폴더 구조
react app을 처음 생성한 모습 그대로의 폴더 구조이다. 다른 모듈을 설치하거나 특정 파일을 제거하는 등의 작업은 수행하지 않았다. 여기서 추가된 파일들은 .dockerignore, Dockerfile, docker-compose.yml 세 파일뿐이다.
📦dockerize-react
┣ 📂node_modules
┣ 📂public
┃ ┣ 📜favicon.ico
┃ ┣ 📜index.html
┃ ┣ 📜logo192.png
┃ ┣ 📜logo512.png
┃ ┣ 📜manifest.json
┃ ┗ 📜robots.txt
┣ 📂src
┃ ┣ 📜App.css
┃ ┣ 📜App.js
┃ ┣ 📜App.test.js
┃ ┣ 📜index.css
┃ ┣ 📜index.js
┃ ┣ 📜logo.svg
┃ ┣ 📜reportWebVitals.js
┃ ┗ 📜setupTests.js
┣ 📜.dockerignore
┣ 📜.gitignore
┣ 📜docker-compose.yml
┣ 📜Dockerfile
┣ 📜package.json
┣ 📜README.md
┗ 📜yarn.loc
4. .dockerignore
Dockerfile에서 현재 폴더 목록을 COPY 할 때 제외할 파일 또는 폴더를 지정하는 파일이다. .gitignore가 git에 add하지 않을 파일 또는 폴더를 지정하는 것과 같은 역할을 한다.
# .dockerignore
.git
.gitignore
/node_modules
Dockerfile
README.md
5. Dockerfile
dockerize-react를 dockerize 할 파일이다. Dockerfile에 명시된 명령어대로 build를 수행하여 이미지를 생성한다.
# Dockerfile
FROM node:12.18.0
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
여기까지 진행했으면 react app을 dockerize할 준비가 완료된 것이다. Dockerfile을 빌드하기만 하면 된다.
# ~/dockerize-react 폴더 내에서 실행
# Dockerfile build
docker build -t sample:0.1 .
# 위에서 build한 sample:0.1 이미지를 실행시킨다.
docker run -it -p 3000:3000 --name dockerize-react sample:0.1
# 만약 background 실행을 원한다면
# docker run -itd -p 3000:3000 --name dockerize-react sample:0.1
이제 http://localhost:3000으로 접속하면 ReactJS의 초기화면을 볼 수 있다.
6. docker-compose.yml
만약, 다른 프로그램과 같이 실행하려 한다면 docker-compose.yml 파일을 작성해서 사용하게 될 것이다. 그때는 아래와 같이 작성하면 된다.
# docker-compose.yml
version: '3.5'
services:
web:
build: .
stdin_open: true
tty: true
ports:
- 3000:3000
위와 같이 작성했다면, 실행 명령어를 터미널에 입력하면 된다.
# ~/dockerize-react 폴더 내에서 실행
docker-compose up
# 만약 background 실행을 원한다면
# docker-compose up -d
이제 http://localhost:3000으로 접속하면 ReactJS의 초기화면을 볼 수 있다.
[참고]
mherman.org/blog/dockerizing-a-react-app/
Dockerizing a React App
Docker is a containerization tool used to speed up the development and deployment processes. If you’re working with microservices, Docker makes it much easier to link together small, independent services. It also helps to eliminate environment-specific b
mherman.org
'개발 > Docker' 카테고리의 다른 글
[Docker] docker-compose (node.js, mysql) 실행 순서 동기화 (0) | 2021.01.29 |
---|---|
[Docker] Ubuntu:18.04에서 Docker 설치하기 (0) | 2021.01.27 |
[Docker] Jenkins in Docker (0) | 2021.01.18 |