Explanation

์ด ๊ฐ€์ด๋“œ๋ฅผ ์—ฌ๊ธฐ๊นŒ์ง€ ๋”ฐ๋ผ์™”์œผ๋ฉด, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ ๊ณ ๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹จ๋Š” ๊ฒƒ์„ ์ดํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. React ํ”„๋ก ํŠธ์—”๋“œ, Python API, Postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ฐ์ž์˜ ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ณ , ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ์™„์ „ํžˆ ๊ณ ๋ฆฝ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณ ๋ฆฝ์€ ๋ณด์•ˆ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ ๋˜ํ•œ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์›น ์•ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํฌํŠธ ๊ฐœ๋ฐฉ์ด ์กด์žฌํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

Publishing ports

ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋„คํŠธ์›Œํ‚น ๊ณ ๋ฆฝ์„ ๋šซ๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์€ ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ์—์„œ ์š”์ฒญ์ด ์ปจํ…Œ์ด๋„ˆ์˜ 80 ํฌํŠธ์— ํฌ์›Œ๋”ฉ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docker run ๋ช…๋ น์–ด์— -p ๋˜๋Š” --publish ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์„œ ํฌํŠธ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

$ docker run -d -p HOST_PORT:CONTAINER_PORT nginx
  • HOST_PORT: ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ณ  ์‹ถ์€ ํฌํŠธ ๋„˜๋ฒ„
  • CONTAINER_PORT: ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ๋ฆฌ์Šค๋‹ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ๋ฒˆํ˜ธ

์˜ˆ๋ฅผ ๋“ค์–ด, ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ์˜ 8080๋ฒˆ ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

$ docker run -d -p 8080:80 nginx

์ด์ œ, ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ 8080๋ฒˆ ํฌํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์€ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Important

ํฌํŠธ๊ฐ€ ๊ฐœ๋ฐฉ๋˜์—ˆ์„ ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์—๊ฒŒ ๊ฐœ๋ฐฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๊ธฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์ด ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋ฐฐํฌ๋œ ํฌํŠธ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์œผ์„ธ์š”

Publishing to ephemeral ports

๋•Œ๋•Œ๋กœ, ์–ด๋–ค ํ˜ธ์ŠคํŠธ ํฌํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํžˆ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ, Docker๊ฐ€ ํฌํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด, ๊ฐ„๋‹จํžˆ HOST_PORT ์„ค์ •์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋Š” ํ˜ธ์ŠคํŠธ์˜ ์ผ์‹œ์ ์ธ ํฌํŠธ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

$ docker run -p 80 nginx

์ผ๋‹จ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, docker ps ๋ช…๋ น์–ด๋กœ ์–ด๋–ค ํฌํŠธ๊ฐ€ ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                    NAMES
a527355c9c53   nginx         "/docker-entrypoint.โ€ฆ"   4 seconds ago    Up 3 seconds    0.0.0.0:54772->80/tcp    romantic_williamson

์ด ์˜ˆ์‹œ์—์„œ, ์•ฑ์€ ํ˜ธ์ŠคํŠธ์˜ 54772๋ฒˆ ํฌํŠธ์— ๋…ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Publishing all ports

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, EXPOSE ๋ช…๋ น์–ด๋Š” ํŒจํ‚ค์ง€ ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ •ํ•œ ํฌํŠธ์—์„œ ์‚ฌ์šฉ๋  ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ํฌํŠธ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐํฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

-P ๋˜๋Š” --publissh-all ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜, ๋…ธ์ถœ๋œ ๋ชจ๋“  ํฌํŠธ๋ฅผ ์ผ์‹œ์ ์ธ ํฌํŠธ๋กœ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ ๋˜๋Š” ํ…Œ์ŠคํŒ… ํ™˜๊ฒฝ์—์„œ ํฌํŠธ ์ถฉ๋Œ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ์— ๊ฝค ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋Š” ์ด๋ฏธ์ง€์— ์˜ํ•ด ์„ค์ •๋œ ๋ชจ๋“  ๋…ธ์ถœ๋œ ํฌํŠธ๋ฅผ ๋ฐฐํฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

$ docker run -P nginx

Try it out

์ด๋ฒˆ ํ•ธ์ฆˆ์˜จ ๊ฐ€์ด๋“œ์—์„œ, ๋‹น์‹ ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด CLI์™€ Docker Compose๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Use the Docker CLI

์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ, ๋‹น์‹ ์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  Docker CLI๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ๋ฅผ ๋ฐฐํฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. Docker Desktop์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜์„ธ์š”.
  2. ํ„ฐ๋ฏธ๋„์—์„œ, ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:
$ docker run -d -p 8080:80 docker/welcome-to-docker

์ฒ˜์Œ ๋‚˜์˜ค๋Š” 8080์€ ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ์˜ ์ ‘๊ทผ์— ์‚ฌ์šฉ๋  ๋‹น์‹ ์˜ ๋กœ์ปฌ ๋จธ์‹ ์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ 80์€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ๋“ฃ๋Š” ํฌํŠธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ๋ช…๋ น์–ด๋Š” ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  1. Docker Desktop DashboardDML Containers ํƒญ์œผ๋กœ ๋“ค์–ด๊ฐ€ ๋ฐฐํฌ๋œ ํฌํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

A screenshot of Docker Desktop Dashboard showing the published port

  1. ์ปจํ…Œ์ด๋„ˆ์˜ Port(s) ์ปฌ๋Ÿผ์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์˜ http://localhost:8080 ์œผ๋กœ ์ ‘์†ํ•ด์„œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์—ด์–ด๋ด…๋‹ˆ๋‹ค.

A screenshot of the landing page of the Nginx web server running in a container

Use Docker Compose

์ด ์˜ˆ์‹œ๋Š” Docker Compose๋กœ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  1. ์ƒˆ๋กœ์šด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ compose.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:
services:
  app:
	image: docker/welcome-to-docker
	ports: 
	  - 8080:80

ports ์„ค์ •์€ ํฌํŠธ ์ •์˜๋ฅผ ์œ„ํ•ด ์กฐ๊ธˆ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, docker run ๋ช…๋ น์–ด์—์„œ ์‚ฌ์šฉํ•œ HOST_PORT:CONTAINER_PORT์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. docker compose up ๋ช…๋ น์–ด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:8080 ์— ๋ฐฉ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

Additional resources

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, ๋‹ค์Œ ์ž๋ฃŒ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”:

Next steps

์ด์ œ ๋‹น์‹ ์€ ์–ด๋–ป๊ฒŒ ํฌํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋…ธ์ถœ์‹œํ‚ค๋Š”์ง€ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ๋‹น์‹ ์€ docker run ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2. Overriding container defaults