#Docker #Docker Hub #Docker Image #Docker Container #Docker Compose
๐ ํ์ต ๋ชฉํ
์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒยถ
IP ์ฃผ์
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ(์ง PC๊ฐ ์๋ ๋ค๋ฅธ ์ปดํจํฐ์์ ์คํ)์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์์์ผํ๋ (ํด๋น ์น์๋ฒ๊ฐ ์คํ์ค์ธ) ์ปดํจํฐ ์ฃผ์
- ๊ฐ ์ปดํจํฐ๋ง๋ค ๊ณ ์ ๋ฒํธ๋ก ํ ๋น๋์ด ์๋ค.(์ด๋ ์ปดํจํฐ์ธ์ง ๊ตฌ๋ถ)
ex) 192.168.0.1
๋๋ฉ์ธ(domain) ์ด๋ฆ
์ธ์ฐ๊ธฐ ์ด๋ ค์ด IP ์ฃผ์๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ฝ๊ฒ ๋ฐ๊พผ ๊ฒ
ex) naver.com
DNS(Domain Name Server)
์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅํ URL์ฃผ์์ ๋๋ฉ์ธ ์ด๋ฆ์ IP์ฃผ์๋ก ๋ณํํด์ฃผ๋ ์๋ฒ
> URL (Uniform Resource Locator) : ์ธํฐ๋ท ์ ์์์ ์์น
> ์น ๋ธ๋ผ์ฐ์ ์์ URL์ ๋ ฅ ํ ์ผ์ด๋๋ PROCESS
- ํด๋ผ์ด์ธํธ(Client) : ๋คํธ์ํฌ ํ๋ก๊ทธ๋จ์์ ์์ฒญํ๋ ์ปดํจํฐ
- ์๋ฒ(Server) : ์์ฒญ์ ๋ฐ์ ์๋ง์ ๊ธฐ๋ฅ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต(serve)ํ๋ ์ปดํจํฐ
- ๋ณดํต ์๋ฒ๋ IDC(Internet Data Center), ์ธํฐ๋ท ๋ฐ์ดํฐ ์ผํฐ๋ ์์ค์ ์๋ค.
ํฌํธ(port)
- ์ด๋ค ์๋ฒ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ ์ง ๊ตฌ๋ถํ๋ ๋ฒํธ
- ํด๋ผ์ด์ธํธ๋ IP ์ฃผ์์ ํจ๊ป ํฌํธ ๋ฒํธ๋ฅผ ์ฌ์ฉํด ์ํ๋ ์๋ฒ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ๊ฒ ๋๋ค.
ex) ์น ์๋ฒ ๊ธฐ๋ณธ ํฌํธ : 80
=> URL์์ ํ๋กํ ์ฝ์ด http์ธ ๊ฒฝ์ฐ ๋ณ๋๋ก ํฌํธ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด 80๋ฒ ํฌํธ๋ก ์ฐ๊ฒฐํ๋ค๋ ๋ป
์๋ฎฌ๋ ์ดํฐ(Emulator)
: ํ ์์คํ ์์ ๋ค๋ฅธ ์์คํ ์ ๋ณต์ ํ์ฌ ๋ ๋ฒ์งธ ์์คํ ์ด ์ฒซ ๋ฒ์งธ ์์คํ ์ ๋ฐ๋ผ ํ๋ํ๋ ๊ฒ
ex) ๋ค๋ฅธ ์ฅ์น์์ ๋์ํ๋ ๊ฒ์์ PC์์ ๋์์ํจ๋ค๋ ๊ฒ
ํ๋ก๊ทธ๋จ ์คํ์ ์ํด Linux ํ๊ฒฝ์ ์ฝ๊ฒ ๊ตฌ์ฑํ๊ธฐ ์ํ ๋๊ตฌ(Tool)
๋ฆฌ๋
์ค์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ PC์์ ๋์ํ ์ ์๋๋ก ์ ๊ณตํ๋ ๊ฒ + ์ฝ๊ณ (Dockerfile), ๋น ๋ฅด๊ฒ(Container)
CLI๋ฅผ ํตํด Docker ์์
์ ์งํ
์ดํ๋ฆฌ์ผ์ด์ ์คํ ํ๊ฒฝ์ ์ฝ๋๋ก ์์ฑํ ์ ์๊ณ OS๋ฅผ ๊ฒฉ๋ฆฌํํ์ฌ ๊ด๋ฆฌํ๋ ๊ธฐ์
๋ฆฌ๋
์ค ์ปจํ
์ด๋(Linux Container)๊ฐ ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฐ ๊ธฐ์
์ด๋ค ๋ถ๋ถ์ ๋์ปค๊ฐ ์ฝ๊ฒ ๋ง๋ค์๋๊ฐ?
CASE 1 ํ๊ฒฝ ํ์คํ - ํ๊ฒฝ์ด ์ผ์ ํ์ง ์์์ ์๊ธฐ๋ ๋ฌธ์
CASE 2 ์์์
์ผ๋ก ์ผ์น์ํค๋ ํ๊ฒฝ ๊ตฌ์ฑ
๊ฐ๋ฐ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ด ์ปดํจํฐ์ ์ค์นํ๊ณ ์ ์ฌ์ฉํ๊ณ ์ํ ๋, '๋ด ์ปดํจํฐ' ํน์ '๋ด ์ฌ์ฉ๋ชฉ์ '์๋ง ๋ง๋ ์ค์ ์ด ๋ฐ๋ก ํ์ํ ์ ์๋ค.
ex) ํ๊ฒฝ๋ณ์ ๊ตฌ์ฑ, ํ ๋๋ ํ ๋ฆฌ ์ค์ , ๋ฐฉํ๋ฒฝ ์ค์ , ์ฌ์ฉ์ ๊ถํ ์ค์ , Port ์ค์
=> ๊ฐ๋ฐ ํน์ ์คํ์ ๋ํ ํ๊ฒฝ ์ค์ ์ด ์ฝ๋ํ๋์ด ์๋ค๋ฉด ํธํ๊ฒ ์์
ํ ์ ์์ง ์์๊น?
CASE 3 ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ์ฑ
ํฌํธ : ์ธํฐ๋ท ํ๋กํ ์ฝ์์ ์ด์ ์ฒด์ ํต์ ์ ์ข
๋จ์ ์ผ๋ก ํ๋ก์ธ์ค(ํ๋ก๊ทธ๋จ์ ์คํ)๋ฅผ ์๋ณํ๋ค.
*์ข
๋จ์ : ํฐ๋ฏธ๋์ด ์ฐ๊ฒฐ๋ ์๊ฒฉ ํต์ ๋ง์์์ ์ ์์
๋ฆฌ์์ค ๊ฒฉ๋ฆฌ์ฑ : ํ๋์ ์ปดํจํฐ์์ ์ฌ๋ฌ๊ฐ์ ์ปดํจํฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ฒ๋ผ ํ๋ ๊ฒ์ผ๋ก ์ด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ ๋ก๋ ๊ฐ์๋จธ์ , ๋์ปค๊ฐ ์๋ค.
=> ๋ ๋ค ๊ฒฉ๋ฆฌ์ฑ์ ์ ๊ณตํ๋ฏ๋ก ๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ๋ง๋ค ๋ค๋ฅธ ์ปดํจํฐ์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ IP, Port ๋ฑ์ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์๋ค.
ํน์ง
1. ํ๋ก์ธ์ค์ ๊ตฌํํ
์ปจํ ์ด๋ ๊ธฐ์ ์ ์ญ์ฌ
FreeBSD Jail | Solaris Containers |
---|---|
- ์คํ์์ค Unix์ธ FreeBSD์์ ์ฌ์ฉ๋ ๊ธฐ์ - Unix๋ฒ์ ์ ๋์์ผ๋ก ํ๋ฉฐ, Jail์ด๋ผ๋ ๋ช ์นญ์ ์ปจํ ์ด๋ ์ฌ์ฉ | - Orcla์ ์์ฉ Unix์ธ Solaris์์ ์ฌ์ฉํ๋ ์ปจํ
์ด๋๋ก, 2005๋
์ธ Solaris 10์์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ - Solaris์กด, Solaris ๋ฆฌ์์ค ๋งค๋์ ๋ก ์ปจํ ์ด๋์ ๋ํ ๊ด๋ฆฌ๋ฅผ ์ํ - Docker๊ฐ ๋์ค๊ธฐ 10๋ ์ ๊ธฐ์ ์ด์ง๋ง Docker์ ์๋นํ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ |
๋์ปค ์ด๋ฏธ์ง(ํ๋ก๊ทธ๋จ)
๋์ปค ์ปจํ
์ด๋ = ๋์ปค ์ด๋ฏธ์ง๊ฐ ์คํ๋ ๊ฒ (ํ๋ก์ธ์ค)
๋์ปค ์ด๋ฏธ์ง(Docker image) ์ด๋ฆ
ex) docker/whalesay:latest
=> Docker Hub
๋ผ๋ ๋ ์ง์คํธ๋ฆฌ์์ docker
๋ผ๋ ๋ถ์ด ์ฌ๋ฆฌ์ whalesay
์ด๋ฏธ์ง ํน์ ๋ ํฌ์งํ ๋ฆฌ์์ latest
ํ๊ทธ๋ฅผ ๊ฐ์ง ์ด๋ฏธ์ง
latest
ํ๊ทธ๋ฅผ ๋ถํ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.exit
์
๋ ฅํ๋ฉด ์ดํ๋ก๋ ํธ์คํธ ๋์ ๋ช
๋ น์ด ์
๋ ฅ 0. ๋์ปค ๋ฐ๋ชฌ ์คํ ์ฌ๋ถ ํ์ธ
docker info
1. ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง ํน์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ(pull)
docker (image) pull docker/whalesay:latest
2. ๋์ปค ์ด๋ฏธ์ง ๋ฆฌ์คํธ ์ถ๋ ฅ
docker images (ls)
3. ๋ฐ์์จ ์ด๋ฏธ์ง(์ปจํ ์ด๋) ์คํ (์ด๋ฏธ์ง -> ์ปจํ ์ด๋)
:docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run --name myName docker/whalesay:latest cowsay boo
--name
: ์ปจํ
์ด๋ ์ด๋ฆ ํ ๋นcowsay
: ์ปจํ
์ด๋์์ cowsay๋ฅผ ํธ์ถ (python์ ํธ์ถํ๋ฏ ์ด์ฉํ๋ ๊ฒ)boo
: COMMAND์ธ cowsay์ ๋๊ฒจ์ง ํ๋ผ๋ฏธํฐ4. ์ปจํ ์ด๋ ๋ฆฌ์คํธ ์ถ๋ ฅ
docker (container) ps -a
-a
: Default ๋ก๋ ์คํ๋๋ ์ปจํ
์ด๋์ง๋ง ์ข
๋ฃ๋ ์ปจํ
์ด๋๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ปจํ
์ด๋ ์ถ๋ ฅ5. ์ปจํ ์ด๋ ์ญ์
docker container rm myName
ps
๋ช
๋ น์ ํตํด ํ์ธํ ์ ์๋ NAMES
ํน์ CONTAINER ID
์ฌ์ฉExisted
ํน์ STOP
์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ6. ์ฌ์ฉํ ์ด๋ฏธ์ง ์ฉ๋ ํ์ธ ๋ฐ ์ญ์ (์ปจํ ์ด๋ ๊ด๋ จ ๋ฆฌ์์ค ์ญ์ )
docker image ์ ์ฉ๋ ํ์ธ
: docker image ls
/ docker images
docker/whalesay ์ด๋ฏธ์ง ์ง์ฐ๊ธฐ
: docker image rm docker/whalesay
(docker rmi
๋ ๊ฐ์ ๊ธฐ๋ฅ ์ํ)
์ด๋ฏธ์ง ๋ฐ์์ค๊ธฐ+์ปจํ
์ด๋ ์คํ+๋ฆฌ์์ค ์ญ์ (ps -a
๋ด์ฉ ์ง์)
: docker container run --name my_name --rm docker/whalesay cowsay boo
{container} run
--rm
docker container run -it --rm danielkraic/asciiquarium:latest
# -it : -i, -t ๋์์ ์ฌ์ฉํ ๊ฒ/ํฐ๋ฏธ๋ ์
๋ ฅ์ ์ํ ์ต์
/์ฌ์ฉ์์ ์ปจํ
์ด๋ ๊ฐ์ ์ธํฐ๋ ์
์ด ํ์ํ ๊ฒฝ์ฐ
### ์ปจํ
์ด๋ ๋ด๋ถ ๋ค์ฌ๋ค๋ณด๊ธฐ
docker container ps -a
docker container exec -it [๋์ปค ์ปจํ
์ด๋ NAMES]
uname -a #=> ์ด๋ค OS๊ฐ ์คํ๋๊ณ ์๋์ง ๋ณด์ฌ์ค
๋ก์ปฌ์ ์๋ ํ์ผ๊ณผ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
httpd(http daemon) : Apache HTTP Server ๋ฅผ ์คํํ ์ ์๋ ์คํ์์ค ์น ์๋ฒ ์ํํธ์จ์ด
### codestates/pacman-canvas ๋ ํฌ clone
git clone https://github.com/codestates/pacman-canvas
### httpd ์คํ
docker container run --name my_web --rm -p 818:80 httpd
# -p : ๋ก์ปฌ(ํธ์คํธ)์ ํฌํธ & ์ปจํ
์ด๋์ ํฌํธ ์ฐ๊ฒฐ
### ๋ธ๋ผ์ฐ์ ์์ 127.0.0.1:818 ํน์ localhost:818 ์ ํตํด ์น ์๋ฒ๊ฐ ์๋ํ๊ณ ์๋์ง ํ์ธ
### ์ด๋ฏธ์ง, ์ปจํ
์ด๋ ์ดํด๋ณด๊ธฐ
docker image ls
docker container ps -a
### ์ปจํ
์ด๋ copy
# ์ปจํ
์ด๋ -> ํธ์คํธ : docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# ํธ์คํธ->์ปจํ
์ด๋ : docker cp [OPTIONS] SRC_PATH| - CONTAINER: DEST_PATH
docker container cp ./ my_web:/usr/local/apache2/htdocs/
# ./ (SRC_PATH): ํ์ฌ ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ ํ์ผ (ํฐ๋ฏธ๋ ํ์ฌ ๊ฒฝ๋ก์ ๋ณต์ฌํ ๋ชจ๋ ํ์ผ์ด ์กด์ฌํด์ผํจ : dir ํ์ธ)
# my_web : (๋ณต์ฌ๋ณธ ๋ถ์ฌ๋ฃ์) ์ปจํ
์ด๋ ์ด๋ฆ
# my_web:/usr/local/apache2/htdocs/ (CONTAINER: DEST_PATH): my_web ์ปจํ
์ด๋์ ๋ค์ ๊ฒฝ๋ก์ ๋ณต๋ถ
### ์ปจํ
์ด๋ ์์ bash์๋ก ๋ค์ด๊ฐ๋ณด๊ธฐ
docker exec -it my_web /bin/bash
cd
dir
cd htdocs/
dir #=> ๋ณต์ฌํ๋ คํ๋ ํ์ผ๋ค์ด ๋ชจ๋ copy๋์๋์ง ํ์ธ
### ๋ธ๋ผ์ฐ์ ์์ 127.0.0.1:818 ํน์ localhost:818 ์ ์ ์ํด์ ๊ฒ์ ์๋ฒ(ํฉ๋งจ)๊ฐ ๊ตฌ๋๋๋์ง ํ์ธ
์ด๋ฏธ์ง๋ก ๋ง๋ค์ด๋์ผ๋ฉด
- ๊ตฌ๋ํ Docker Container ๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋๋ ๋ฐฉ๋ฒ : commit
docker container commit [OPTIONS] CONTAINER [new REPOSITORY ์ด๋ฆ[:TAG]]
### commit docker container commit my_web my_pacman:1.0
### ์ด๋ฏธ์ง ์์ฑ ํ์ธ docker images
### ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ 818 ํฌํธ์ ์น์๋ฒ ๊ตฌ๋ docker run --name my_web2 -p 818:80 my_pacman:1.0
- Docker Image ๋น๋๋ฅผ ์ํ ํ์ผ์ธ Dockerfile ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
- Dockerfile ๊ณต์ ๋ฌธ์
- Dockerfile(์ด๋ฏธ์ง ํ์ผ์ ์ค๋ช ์)๋๋ก ์ด๋ฏธ์ง๋ฅผ buildํ๋ ๋ฐฉ๋ฒ
### get Dockerfile content (linux) cat Dockerfile (window) type Dockerfile
### Dockerfile content FROM httpd:2.4 # ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ httpd:2.4 ๋ก ์ฌ์ฉํฉ๋๋ค. COPY ./ /usr/local/apache2/htdocs/ # ํธ์คํธ์ ํ์ฌ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ์์ฑํ ์ด๋ฏธ์ง /usr/local/apache2/htdocs/ ์ ๋ณต์ฌํฉ๋๋ค.
### docker build ๋ช ๋ น : Dockerfile ์ ๋ฐํ์ผ๋กํ ๋์ปค ์ด๋ฏธ์ง ํ์ผ ์์ฑ # --tag ๋ name:tag ํ์์ผ๋ก ์ด๋ฏธ์ง ์์ฑ # ์ง์ ํ ๊ฒฝ๋ก์ ์๋ Dockerfile ์ฐพ์ ๋น๋ docker build --tag my_pacman:2.0 .
### ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ 818 ํฌํธ์ ์น์๋ฒ ๊ตฌ๋ docker run --name my_web3 -p 901:80 my_pacman:2.0
### ๋ธ๋ผ์ฐ์ ์์ 127.0.0.1:901 ํน์ localhost:901 ์ ํตํด ์น ์๋ฒ๊ฐ ์๋ํ๊ณ ์๋์ง ํ์ธ
0. express.js
, mongodb
์ด๋ฏธ์ง pull
1. docker-compose.yml ํ์ผ ์์ฑ
# docker-compose ๋ฒ์
version: '3.7'
# ์ฌ์ฉํ container
# ์๋น์ค ์ ์
services:
express:
# ์น ์๋ฒ
container_name: express
image: jmuppala/node-server:latest
command : ["./wait-for-it.sh", "mongodb:27017","--","npm","start"]
ports:
- 3000:3000
mongodb:
container_name: mongodb
image: jmuppala/mongo-server:latest
3. express.js
, mongodb
์ด๋ฏธ์ง pull
4. docker-compose up
: ํด๋น ๋ช
๋ น์ด CLI์์ ์
๋ ฅ ํ ๋ธ๋ผ์ฐ์ 127.0.0.1:3000
์์ ํ์ธ
๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ์ด์ ? => ๋ฆฌ๋ ์ค๊ฐ ์์ ๋ถํฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋์ด์, ํ๋ก๊ทธ๋๋จธ๋ค์ด ๋ง์ด ์ฌ์ฉํด์, ๋ณด์๋ชฉ์
์ ๋์ค-๋ฆฌ๋
์ค-๋งฅ
๋์ค-์๋์ฐ
์๋ฎฌ๋ ์ดํฐ๋ ํ ์์คํ ์์ ๋ค๋ฅธ ์์คํ ์ ๋ณต์ ํ๋ค. ๊ทธ๋ฆฌํ์ฌ ๋ ๋ฒ์งธ ์์คํ ์ด ์ฒซ ๋ฒ์งธ ์์คํ ์ ๋ฐ๋ผ ํ๋ํ๋ ๊ฒ์ด๋ค.
๊ธฐ์กด : ๋ฐ๋ก ์ค์น
๋์ปค : ๋ฆฌ๋
์ค๋ฅผ ๋์ฐ๊ณ , ๊ทธ ์์ ํ๋ก๊ทธ๋จ์ ์คํ
์ฝ๋ค : ํจํค์ง ์ถฉ๋
๋์ปค : ์คํํ๊ฒฝ์ด ์๋ก ์ถฉ๋ํ์ง ์๊ธฐ์ํด์
๋์ปค๋ฅผ ๋์ด๋ค = ๋ฆฌ๋
์ค๋ฅผ ๋์ด๋ค.
vmmem = ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ(์๋์ฐ)
์น์๋ฒ์ ๊ธฐ๋ฅ์ ํ๋ ~ ๋ฐ์์ค๋ ๊ฒ
๐ Reference
Get Started with Docker
Docker Docs
Docker Hub
Postgres in Docker Hub
pgAdmin in Docker Hub
pgAdmin Docs
jmuppala github Repo