~
- 도커 컨테이너에서 기본 사용자는 root, 호스트 이름은 무작위 16진수 해시값이다.
docker run
컨테이너 생성 시-i
로 상호입출력,-t
로 tty 활성화하여 bash를 사용하도록 한다.- 도커의 모든 명령어는 접두어인 docker 다음에 특정 구성단위를 명시해 제어할 수 있다.
- ex) docker container/image/volume inspect
- 위 명령어는 컨테이너/이미지/볼륨의 정보를 출력한다.
docker volume prune
은 사용하지 않는 도커 볼륨을 한번에 삭제한다.- 모든 컨테이너는 이미지를 기반으로 생성된다.
- 도커허브에서 도커 이미지 각 태그들 의미
alpine
: Alpine images are based on the Alpine Linux Projectstretch/buster/jessie
: for Debian releases-slim
: a paired down version of the full image. This image generally only installs the minimal packages needed to run your particular tool.
내 리액트앱 nginx로 서빙하는 도커이미지 만들기
FROM nginx
# nginx의 default.conf를 삭제
RUN rm /etc/nginx/conf.d/default.conf
# host pc의 nginx.conf를 아래 경로에 복사
COPY ./nginx.config /etc/nginx/conf.d
# 80 포트 오픈
EXPOSE 80
# container 실행 시 자동으로 실행할 command. nginx 시작함
CMD nginx -g 'daemon off;'
-
내 리액트앱을 도커이미지로 만드는 Dockerfile이다.
-
SPA라서 static파일을 서빙하면 끝이므로 사실 nginx 디폴트 설정을 그대로 써도 된다.
물론 복사만 해서 이미지를 만드는 것이므로 로컬에 build결과물을 미리 만들어두어야 함 -
nginx 공식이미지 도커허브를 가보면 80포트와 실행 cm가 모두 설정되어 있어서 그대로 써도 된다.
-
그래서 사실 아래 두줄이면 된다.
# 미리 build 결과물 만든 후 실행 FROM nginx COPY build /usr/share/nginx/html
-
이후 아래 커맨드 실행
# 특정 파일명을 가진 도커파일로 local 태그를 달아 도커이미지 빌드 docker build -t todo:local -f Dockerfile-client . docker images # local 태그를 가진 todo 이미지를 기반으로 컨테이너 실행 # 이후 localhost:3000에서 접속되는 것을 확인 docker run -d --name todo -p 3000:80 todo:local docker ps
multi stage
# Build Stage Start
# Specify a base image
FROM node:alpine as builder
# Specify a working directory
WORKDIR '/app'
# Copy the dependencies file
COPY package.json .
# Install dependencies
RUN npm install
# Copy remaining files
COPY . .
# Build the project for production
RUN npm run build
# Run Stage Start
FROM nginx
# Copy production build files from builder phase to nginx
COPY --from=builder /app/build /usr/share/nginx/html
- 위처럼 컨테이너 이미지에는 필요 없지만 이미지를 빌드할 때만 필요한 경우
multi stage
방식으로 만들 수 있다. - node 스테이지에서 필요한 파일과 dependency 모두 컨테이너로 카피하고, build 명령을 돌린다.
- nginx 스테이지에서는 빌드 결과물을 가져와서(
as builder
) nginx 컨테이너로 카피한다. - 위 예시에서 결론적으로 컨테이너를 띄우는 것은 nginx이다.
- https://docs.docker.com/build/building/multi-stage/
221127 스터디
# Dockerfile.apiserver
FROM node
WORKDIR /usr/src/app
COPY package*.json /usr/src/app/
ENV NODE_OPTIONS="--openssl-legacy-provider"
RUN npm install
COPY backend /usr/src/app/backend/
EXPOSE 3777
ENTRYPOINT ["node", "/usr/src/app/backend/server.js"]
# Dockerfile.front
FROM node as builder
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV NODE_OPTIONS="--openssl-legacy-provider"
COPY package*.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
RUN npm run build
FROM nginx
WORKDIR /usr/share/nginx/html
RUN rm -rf /etc/nginx/conf.d
COPY conf /etc/nginx/conf.d/
COPY --from=builder /usr/src/app/build/ .
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# conf/default.conf
server {
listen 80;
# listen [::]:80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://todo-api:3777;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# docker-compose.yml
version: '3'
services:
todo-api:
container_name: todo-api
image: todo-api:latest
networks:
- default
todo-app:
container_name: todo-app
image: todo-app:latest
networks:
- default
ports:
- 80:80
links:
- todo-api
networks:
default:
external:
name: todoapp
$ docker-compose up -d
$ docker-compose down
conf/default.conf
의 내용은 리버스 프록시를 담고 있다.- 리버스 프록시란 클라이언트 요청을 대신 받아 내부 서버로 전달해주는 것이다.
- 즉, example.com로 온 요청을 받아 내부 서버에서 처리한 데이터를 다시 사용자에게 전달한다.
docker-compose
는 여러 컨테이너를 관리해 실행하는 도구이다.docker-compose up
: docker-compose.yml에 따라 이미지 빌드 및 서비스를 실행docker-compose down
: 실행 중인 서비스를 삭제- version 1에서는 버저닝을 생략
- version 2부터 마이너 버전(2.x)까지 설정해야 함 (생략 시 2.0으로 적용됨)
- version 3은 도커 스웜과 같이 사용되도록 디자인됨