λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Docker Study

도컀 μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신

도컀 μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 톡신을 ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€μ–΄ λ΄…λ‹ˆλ‹€.

  • 기본적으둜 μ›Ή API 및 웨 피이지와 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€.(WWW)
  • λΆˆν•„μš”ν•œ 것을 λ³΅μ‚¬ν•˜μ§€ μ•Šλ„λ‘ **.dockerignore**을 μž‘μ„±ν•©λ‹ˆλ‹€.

.dockerignore

node_modules
Dockerfile
.git

API server(node) 도컀화

FROM node // node:<버전> 버전을 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μ΅œμ‹  버전을 μ‚¬μš©(λ…Έλ“œ κΈ°λ³Έ 이미지 μ‚¬μš©)

WORKDIR /app // μž‘μ—… 디렉토리λ₯Ό λͺ…μ‹œ

COPY package.json . // μž‘μ—… 디렉토리에 package.json 볡사

RUN npm install // ν”„λ‘œμ νŠΈ 쒅속성을 μ„€μΉ˜

COPY . . // ν”„λ‘œμ νŠΈ 폴더 λͺ¨λ“  νŒŒμΌμ„ μ»¨ν…Œμ΄λ„ˆ μž‘μ—… 디렉토리에 볡사

EXPOSE 8000 // μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 포트 

ENV MONGODB_USERNAME=root // ν™˜κ²½λ³€μˆ˜ μΆ”κ°€

ENV MONGODB_PASSWORD=secret // ν™˜κ²½λ³€μˆ˜ μΆ”κ°€

CMD ['npm', 'start'] // 이미지 기반반으둜 μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•Œ μ‹€ν–‰λ˜μ–΄μ•Όν•  λͺ…λ Ή
  • μœ„μ™€ 같이 도컀 νŒŒμΌμ„ μž‘μ„±ν•΄ μ€λ‹ˆλ‹€.
  • 이미지 생성
    • docker build -t <이미지 이름>:<버전> . (<버전>을 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ latest νƒœκ·Έ μ‚¬μš©)
  • detachedλͺ¨λ“œλ‘œ μ‹€ν–‰ν•˜κ³ (-d) μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆκ°€ 제거(--rm) λ˜λ„λ‘ ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 포트λ₯Ό κ°œμ‹œ(-p 8000:8000)ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
    • docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -d --rm -p 8000:8000 <이미지>
  • -eμ˜΅μ…˜μœΌλ‘œ ν™˜κ²½λ³€μˆ˜λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ex)

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -v <ν”„λ‘œμ νŠΈ 경둜$(pwd)>:<λ§€ν•‘ 경둜> -v <λ§€ν•‘κ²½λ‘œ>/node_modules --rm -d --network <λ„€νŠΈμ›Œν¬ 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

호슀트 톡신(mongodb)

μ•„λž˜μ™€ 같이 mongoDBκ°€ λ‘œμ»¬μ— μ„€μΉ˜λ˜μ–΄ 싀행쀑일 λ•Œ mongodbλ₯Ό μ—°κ²°ν•˜λŠ” μ½”λ“œκ°€ μžˆλ‹€λ©΄ λ„€νŠΈμ›Œν¬ 였λ₯˜λ‘œ 연결이 λ˜μ§€ μ•Šκ³  μ»¨ν…Œμ΄λ„ˆκ°€ μ€‘μ§€λ©λ‹ˆλ‹€.

mongoose.connect('mongodb://localhost:27017/myapp')

μ•„λž˜μ™€ 같이 localhostλ₯Ό 도컀가 이해할 수 μžˆλŠ” host.docker.internalλ„λ©”μΈμœΌλ‘œ λ³€κ²½ν•˜λ©΄ 도컀 μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ μ•Œ 수 μžˆλŠ” IPμ£Όμ†Œλ‘œ λ³€ν™˜λ˜μ–΄ 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€.
(localhost -> host.docker.internal)

mongoose.connect('mongodb://host.docker.internal:27017/myapp')

μ»¨ν…Œμ΄λ„ˆ 톡신(mongodb)

μ»¨ν…Œμ΄λ„ˆ IP μ£Όμ†Œ μ‚¬μš©ν•˜κΈ°

μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ mongodb μ»¨ν…Œμ΄λ„ˆλ₯Ό κ²€μ‚¬ν•˜μ—¬ NectworkSettings객체의 IPAddress(μ»¨ν…Œμ΄λ„ˆ IPμ£Όμ†Œ)λ₯Ό μ•Œμ•„λ‚΄ μ»¨ν…Œμ΄λ„ˆμ™€ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

docker container inspect <λͺ½κ³ λ””λΉ„ μ»¨ν…Œμ΄λ„ˆ 이름>

예λ₯Ό λ“€μ–΄ IPAddressκ°€ 172.14.03라고 ν•œλ‹€λ©΄ ν•΄λ‹Ή IP μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆμ™€ 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆμ˜ IP μ£Όμ†Œκ°€ 변경될 λ•Œλ§ˆλ‹€ μ»¨ν…Œμ΄λ„ˆ IPμ£Όμ†Œλ₯Ό μ°Ύμ•„μ•Ό ν•˜κ³  μ†ŒμŠ€λ₯Ό λ³€κ²½ν•˜λ©΄ 이미지λ₯Ό λ‹€μ‹œ λΉŒλ“œν•΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

mongoose.connect('mongodb://172.14.03:27017/myapp')

λ„€νŠΈμ›Œν¬ μ‚¬μš©ν•˜κΈ°

도컀 λ„€νŠΈμ›Œν¬ λͺ©λ‘
μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ λ„€νŠΈμ›Œν¬ λͺ©λ‘μ„ 확일할 수 μžˆμŠ΅λ‹ˆλ‹€.

docker network ls

도컀 λ„€νŠΈμ›Œν¬ λ§Œλ“€κΈ°
μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ λ„€νŠΈμ›Œν¬λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

docker network create <λ„€νŠΈμ›Œν¬ 이름 μ„€μ •>

μ‚¬μš©ν•  λ„€νŠΈμ›Œν¬μ—μ„œ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ν•˜κΈ°
--network <μ‚¬μš©ν•  λ„€νŠΈμ›Œν¬ 이름>ν”Œλž˜κ·Έλ‘œ λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름 μ„€μ •> --rm -d --network <μ‚¬μš©ν•  λ„€νŠΈμ›Œν¬ 이름>

example
예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같이 λ„€νŠΈμ›Œν¬λ₯Ό λ§Œλ“€κ³  μ»¨ν…Œμ΄λ„ˆμ—μ„œ ν•΄λ‹Ή λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•  λ•Œ

docker network create mongo-network
docker run --name mongodb --rm -d --network mongo-network

톡신할 μ»¨ν…Œμ΄λ„ˆλ„ 같은 λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> --network mongo-network -d --rm -p 8000:8000 <이미지> 

μ•„λž˜μ™€ 같이 λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ 이름을 μ‚¬μš©ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆ IPμ£Όμ†Œλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

mongoose.connect('mongodb://<μ»¨ν…Œμ΄λ„ˆ 이름>:27017/myapp')

λ°”μΈλ“œ 마운트 example 

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -v <ν”„λ‘œμ νŠΈ 경둜($(pwd))>:<λ§€ν•‘ 경둜> -v <λ§€ν•‘ 경둜>/node_modules --rm -d --network <λ„€νŠΈμ›Œν¬ 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

Database(mongoDB) 도컀화

Docker Hub에 λ“±λ‘λœ 곡식 mongo 이미지λ₯Ό 기반으둜 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

  • mongoDB의 λ””ν΄νŠΈ 포트 27017을 κ°œμ‹œν•©λ‹ˆλ‹€.
    • (ex: mongoose.connect('mongodb://localhost:27017/myapp'))
    • docker run --name <μ»¨ν…Œμ΄λŸ¬ 이름> --rm -d -p 27017:27017 mongo

λ„€νŠΈμ›Œν¬ 톡신

docker run --name <μ»¨ν…Œμ΄λŸ¬ 이름> --rm -d --network <λ„€νŠΈμ›Œν¬ 이름> -p 27017:27017 mongo

λͺ…λͺ…λœ λ³Όλ₯¨μœΌλ‘œ 데이터 μ§€μ†ν•˜κΈ°

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -v <λ³Όλ₯¨ 이름>:<λ§€ν•‘ 경둜> --rm -d --network <λ„€νŠΈμ›Œν¬ 이름> <이미지>

-eμ˜΅μ…˜μœΌλ‘œ μ•„λž˜μ™€ 같이 ν™˜κ²½ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -v <λ³Όλ₯¨ 이름>:<λ§€ν•‘ 경둜> --rm -d --network <λ„€νŠΈμ›Œν¬ 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

 

 

web front(react) 도컀화

FROM node // node:<버전> 버전을 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μ΅œμ‹  버전을 μ‚¬μš©(λ…Έλ“œ κΈ°λ³Έ 이미지 μ‚¬μš©)

WORKDIR /app // μž‘μ—… 디렉토리λ₯Ό λͺ…μ‹œ

COPY package.json . // μž‘μ—… 디렉토리에 package.json 볡사

RUN npm install // ν”„λ‘œμ νŠΈ 쒅속성을 μ„€μΉ˜

COPY . . // ν”„λ‘œμ νŠΈ 폴더 λͺ¨λ“  νŒŒμΌμ„ μ»¨ν…Œμ΄λ„ˆ μž‘μ—… 디렉토리에 볡사

EXPOSE 3000 // μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 포트 

CMD ['npm', 'start']// 이미지 기반반으둜 μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•Œ μ‹€ν–‰λ˜μ–΄μ•Όν•  λͺ…λ Ή
  • μœ„μ™€ 같이 도컀 νŒŒμΌμ„ μž‘μ„±ν•΄ μ€λ‹ˆλ‹€.
  • 이미지 생성
    • docker build -t <이미지 이름>:<버전> . (<버전>을 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ latest νƒœκ·Έ μ‚¬μš©)
  • react ν”„λ‘œμ νŠΈλŠ” -itμ˜΅μ…˜μ„ μΆ”κ°€ν•˜μ—¬ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€
    • detachedλͺ¨λ“œλ‘œ μ‹€ν–‰ν•˜κ³ (-d) μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆκ°€ 제거(--rm) λ˜λ„λ‘ ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 포트λ₯Ό κ°œμ‹œ(-p 8000:8000)ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
    • docker run --name <μ»¨ν…Œμ΄λ„ˆ 이름> -d --rm -p 3000:3000 -it <이미지>
  • λ¦¬μ•‘νŠΈμ™€ 같은 경우 λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— 개발 ν™˜κ²½μ—μ„œ API server(node)λ₯Ό μ‚¬μš©(ex: fetch('https://localhost/api'))ν•œλ‹€λ©΄ API server(node) μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  λ•Œ 포트(ex 8000)λ₯Ό κ°œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ°”μΈλ“œ 마운트 example

docker run -v <ν”„λ‘œμ νŠΈ 경둜/src($(pwd))>:<λ§€ν•‘ 경둜/src> --name <μ»¨ν…Œμ΄λ„ˆ 이름> --rm -p 3000:3000 -it <이미지>