Container/Docker
[Docker]풀스택 앱 컨테이너화, Docker Compose를 이용해 실행해보자
마손(Mason)
2022. 3. 21. 17:49
깃허브 레포지토리에 해당 실습파일을 클론해오자.
backend, frontend 폴더와 각 폴더의 내용을 확인할 수 있다.
frontend
- Dockerfile을 확인해보니, httpd:2.4를 기반으로 앱이 돌아가는 것을 알 수 있다.
FROM httpd:2.4
- Docker hub에서 httpd:2.4 이미지를 다운받자.
sudo docker pull httpd:2.4
- 작성된 index.html파일과 script.js을 httpd:2.4 이미지로 실행된 컨테이너에 넣어주면 실행될 것이다. Dockerfile을 수정해보자.
FROM httpd:2.4
COPY . /usr/local/apache2/htdocs/
apache2는 정적 호스팅을 하기 위해 /usr/local/apache2/htdocs/ 경로에 index.html 파일을 넣어주어야 하므로, 위와 같이 Dockerfile을 작성하였다.
COPY <복사할 파일> <붙여넣을 경로>
- 작성한 Dockerfile을 이미지로 build하여 실행해보자. 그리고 테스트 해보자.
sudo docker build . -t httpd:test
sudo docker run -p 8080:80 -d httpd:test
curl -i localhost:8080
curl 요청에 응답이 온다면, 정적 호스팅이 완료된 것이다.
backend
- Dockerfile을 확인해보니, node:16-alpine에서 실행되는 것을 알 수 있다. Docker hub에서 이미지를 다운받자.
sudo docker pull node:16-alpine
- node.js를 실행하기 위해서는 의존성 설치와 실행 명령어 등 몇가지가 필요하다. 해당 부분은 공식문서에 잘 나와있다. 따라서 Dockerfile을 작성할 수 있다.
FROM node:12
# 앱 디렉터리 생성
WORKDIR /usr/src/app
# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./
RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --only=production
# 앱 소스 추가
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]
- frontend와 마찬가지로 작성한 Dockerfile을 바탕으로 빌드 후 실행해보자. 임의의 포트번호를 줘도 상관없다.
sudo docker . build -t node:test
sudo docker run -p 3232:80 -d node:test
curl -i localhost:3232
curl 요청에 정상적으로 응답이 오면 서버가 성공적으로 돌아가고 있는 것이다.
docker-compose
이제 둘을 같은 docker-network에서 하나의 앱으로 실행시켜볼 것이다. 이 때 사용되는 port 번호는 80이고, 개략적인 이미지는 다음과 같다.
- docker-compose.yml 파일을 생성한다.
version: "3.0"
services:
apache2:
image: httpd:test
restart: 'always'
ports:
- "80:80"
container_name: client
node:
image: node:test
restart: 'always'
ports:
- "3333:80"
container_name: server
restart: 'always' 이 옵션을 하면, 서비스가 실행이 안되었을 시 자동으로 재실행한다.
코드 순서대로 정적 호스팅이 먼저 진행되고, 백엔드 서버가 돌아가야하는데, 만약 백엔드가 먼저 돌아간다고 한다면 실행이 안되지만, 자동으로 재실행되어 에러를 줄일 수 있다.
80번 포트에 서로 연결되게끔 구성했다.
- Docker-compose를 실행한다.
sudo docker-compose up #yml파일이 있는 디렉토리에서
정상적으로 서비스가 만들어 질 것이다!
이처럼 Docker는 버전 관리뿐만 아니라 개발, 배포 자동화에 필수임이 느껴진다.
재밌는 스프린트였다.