Docker term
What is Docker?
- ์ํํธ์จ์ด๋ฅผ containerization(์ปจํ ์ด๋ํ) ํ ํ๋ซํผ. ( ์น์๋น์ค ์ปจํ ์ด๋ , ๋๋น ์ปจํ ์ด๋ ๋ฐ๋ก ๋ด๋๋ค๊ณ ํ๋ฉด ์๋ก isolation ํ ํ ์ ์๊ณ ์๋ก ๋ ๋ฆฝ์ ์ธ ๊ณต๊ฐ์ ๊ฐ์ง์ ์๋ค. ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์์์ ์๋ค. )
- containerization ๋ ์ปจํ ์ด๋๋ฅผ ๋งค์ฒด๋ก ํ ์์ก์ฒด๊ณ, ์ฆ. ์ปจํ ์ด๋ ๊ท๊ฒฉ์ ๋ง์ถฐ ๋์ผ๋ฉด ์ฐจ , ๋ฐฐ , ๋นํ๊ธฐ๋ฑ ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋๋ ์์ก๊ณผ ์๊ฐ์ ๋จ์ถ ์ํฌ์ ์๋ค. ๋ผ๋ ์ฅ์ ์ ์ง๋๊ณ ์์.
- ์ด๊ฑธ๋ก ์ ์ถํด๋ณผ ๋ ๋์ปค๋ ๋ค์ํ SW ๋ค์ ์ปจํ ์ด๋์ ๋ด์ ์ด๋ํ๊ธฐ๊ฐ ์ฝ๊ฒํ๊ณ ํฌํฐ๋ธํ๊ฒ ๋ง๋ค์์๋ ํ๋ซํผ.
- ๋ฆฌ๋ ์ค์ ์์ฉํ๋ก๊ทธ๋จ๋ค์ ์ํํธ์จ์ด ์ปจํ ์ด๋ ์์ ๋ฐฐ์น์ํค๋ ์ผ์ ์๋ํ ํ๋ ์คํ์์ค
What is Container?
- ๊ฐ๋ฐ , ๋ฐฐํฌ , ์ด์ฉ ๋ฑ์ ์ํด ํ์คํ๋ ๋จ์๋ก ๊ตฌ์ฑ๋ ์ํํธ์จ์ด ํจํค์งํ
- ํธ์คํธ pc ์ ์ปค๋์ ๊ณต์ ํ๋ฉด์ SW ๊ฐ ๋์๊ฐ์ ์๋ ๋ชจ๋ ๊ตฌ์ฑ๋ค์ด ๋ค์ด๊ฐ์๋ค. ๋์ , ๋ถํ์ํ ๊ฒ๋ค์ ๋ค์ด์์ง ์๋ค.
- ํด๋น ๋์ปค ์ด๋ฏธ์ง๋ฅผ run ์ํค๋ฉด ํด๋น SW ๊ฐ ๋์๊ฐ๋๋ฐ ๊ทธ ์ํ๋ฅผ ์ปจํ ์ด๋ ๋ผ๊ณ ํ๋ค. ์ผ์ข ์ ํ๋ก์ธ์ค์ ์ ์ฌํ ๊ฐ๋ ์ด๋ค.
- ์ด ํด๋น ์ปจํ ์ด๋ ๋ด๋ถ ํ๊ฒฝ์ ์ ์ํ๋ ํ์ผ์ dockerfile ์ด๋ค.
- ๋๋จธ์ง ์์คํ ์ผ๋ก ๋ถํฐ ์์ ํ ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ๊ฐ๋๋ค. ๊ทธ๋์ ๋ฐ์ผ๋ก ํต์ ํ๊ธฐ ์ํด์ ํฌํธ๋ฅผ ๋งตํํด์ผ ํ๋ค.
What is Service?
- ์๋น์ค๋ app ์ ํ ๋ถ๋ถ์ด๋ค. ์๋ฅผ ๋ค์ด ๋น๋์ค๋ฅผ ๊ณต์ ํ๋ ์ฌ์ดํธ๋ ๋ฐ์ดํ ๋ฒ ์ด์ค์ app data ๋ฅผ ์ ์ฅํ๋ ์๋น์ค, ๋น๋์ค ์ ๋ก๋ ํ transcoding ํ๋ ์๋น์ค ๋ฑ๋ฑ..
- ์๋น์ค๋ค์ ์ค์ ๋ก production ์ ์ปจํ ์ด๋๋ค๋ก ๊ตฌ์ฑ๋๋ค.
- ํ๋์ ์๋น์ค๋ ํ๋์ ์ด๋ฏธ์ง๋ง ์คํํ์ง๋ง ๊ทธ ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ณฌ๊ณํ ํ ์ ์์ต๋๋ค. ๊ทธ ์ฒด๊ณํ๋ docker-compose.yml ํ์ผ์์ ์ค์ ํ ์ ์๋ค.
- docker-compose.yml ํ์ผ์์๋ ์ด๋ค ํฌํธ๋ฅผ ์ฌ์ฉํด์ผํ๋์ง, ์๋น์ค๊ฐ ๊ฐ์ ธ๊ฐ์ผ ํ ํ์ํ ์ฉ๋์ ๋ฐ๋ผ ์ผ๋ง๋ ๋ง์ ๋ณต์ ์ปจํ ์ด๋๋ฅผ ์คํ์์ผ์ผ ํ๋์ง, ์๋น์ค๋ฅผ ์ํด ์ผ๋ง๋ ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ํ ๋นํ ์ง๋ฅผ ์ค์ ํ ์ ์๋ค.
- docker-compose.yml ์ ์ด์ฉ ํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ผ์ผ์ด ๋ค run ์ํค์ง ์์๋ ๋๋ค.
What is Image?
- ๋์ปค ์ด๋ฏธ์ง๋ ์๋น์ค์ ํ์ํ ํ๋ก๊ทธ๋จ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์์ค๋ฑ์ ์ค์นํ ๋ค์ ์ด๋ฅผ ํ์ผ๋ก ๋ง๋ ๊ฒ์ด๋ค. ์ฝ๊ฒ ์คํํ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ์ํด dockerfile ์ ํ์ํ ๋ช ๋ น๋ค์ ์ค์ ํด ๋๋๋ค.
- ์ด๋ฏธ์ง๋ base image ์ parent image ๋ก ๋๋๋ค.
- base image ๋ parent image ๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ ๋งํ๋ค.
- parent image ๋ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง์ Dockerfile ๋ด์ FROM ์ผ๋ก ์ง์๋๋ ์ด๋ฏธ์ง์ด๋ค. ๋ง์ฝ Dockerfile ๋ด์ FROM ์ด ์ง์๋์ด์์ง ์๋ค๋ฉด ๋ถ๋ชจ ์ด๋ฏธ์ง๊ฐ ์๋๊ฒ์ด๊ณ ์ด๋ ๊ณง base image ๊ฐ ๋๋ค.
- Dockerfile ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋๋ ์ ์ ๋ง๋ค์๋ ์ด๋ฏธ์ง ์บ์๋ฅผ ์ ์ด์ฉํด์ผ ํ๋ค. ๊ธฐ์กด ๋ฐฉ์์ ํ์ค ํ์ค ์คํํ๋ฉด์
์์ ์ปจํ ์ด๋ ์์ฑ > ๋ช ๋ น์ด ์ํ > ์ด๋ฏธ์ง ์ ์ฅ > ์์ ์ปจํ ์ด๋ ์ญ์ > ์๋ก ๋ง๋ ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์์ ์ปจํ ์ด๋ ์์ฑ > ๋ช ๋ น์ด ์ํ > ์ด๋ฏธ์ง๋ก ์ ์ฅ > ์์ ์ปจํ ์ด๋ ์ญ์ ... ์ด๋ฐ์์ผ๋ก ์ํ....
----> {ํด์ฌ์์ด๋} : ์ด๋ฏธ์ง ์ ์ฅ
----> Running in {ํด์ฌ์์ด๋} : ๋ช
๋ น์ด๋ฅผ ์ํํ๊ธฐ ์ํด ๊ทธ ์ ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ์์ ์ปจํ
์ด๋ ์์ฑ
< ์ฒ์ Dockerfile ๋๋ ธ์๋ >
< ๊ธฐ์กด Dockerfile ์ 2 ๋ฒ์งธ ๋๋ ธ์๋ >
< ๊ธฐ์กด Dockerfile ์์ EXPOSE 80 ์์ EXPOSE 81 ๋ก ๋ณ๊ฒฝํ์ ๋ >
- ์ด๋ฏธ์ง ์์ฑ์ FROM ์ ์ ์ด๋ parent image ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ์ฌํญ๋ง ๋ฐ๋ก ์ ์ฅ๋๋๊ฒ ์ฅ์ . vm ์ฒ๋ผ ์ฉ๋์ ๋ง์ด ๋จน์ง ์์.
๋ฐ๋ผ์ parent image ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ parent image ๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ์๋ ์๋ฌ ๋ธ.
What is Stack?
Docker Structure
์ถ์ฒ : http://www.leafcats.com/146
Docker Install
Docker use
๋์ปค ํ๋ธ์์ ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ์ ์ ์๋ค. ๋์ปค ํ๋ธ
$ docker --help
๋์ปค์ ๋ช ๋ น์ด๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
$ docker pull nginx:latest
or
$ docker run -d -it \
--name merlin-nginx \
-p 8080:80 \
nginx:latest
pull ์ ํ๋ฉด ํด๋น ์ด๋ฏธ์ง๋ง ๋ฐ๋๊ฒ์ด๋ค
run ์ ์คํํ๊ฒ ๋๋ฉด local ์ nginx:latest ๋ผ๋ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก hub ์์ ๋ค์ด๋ฐ์์ run ์ ์ํจ๋ค.
$ docker images
$ docker ps
$ docker ps [-a] [-l] [-n number]
images ๋ ๋์ปค ์ด๋ฏธ์ง ๋ฆฌ์คํธ๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
ps ๋ ์คํ์ค์ธ ์ปจํ
์ด๋ ๋ฆฌ์คํธ๋ฅผ ๋ณผ ์ ์๋ค.
-a ์ต์
์ ๋ถ์ด๋ฉด ์ข
๋ฃ๋ ๋ชฉ๋ก๊น์ง ๋ณผ ์ ์๋ค.
-l ์ต์
์ ๋ง์ง๋ง ์คํํ๋ ๋ชฉ๋ก , -n ์ ๋ฆฌ๋
์ค์ tail ๋ช
๋ น์ด์ ๋์ผํ๋ค.
$ docker commit -a "merlin <merlin@kakaocrop.com>" -m olympic-search-pc naughty_torvalds search.daum.pc:olypic
ํ์ฌ ๋์๊ฐ๊ณ ์๋ ์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋ค ์ ์๋ค.
-a ์ต์
: author , -m : ์ปค๋ฐ ๋ฉ์ธ์ง , <naughty_torvalds> ๋ค์ด๊ฐ๋ ๋ถ๋ถ : ์ง๊ธ ๋์ํ๊ณ ์๋ ์ปจํ
์ด๋ ์ด๋ฆ , <search.daum.pc:olypic> ์๋ก์ด ์ด๋ฏธ์ง ๋ค์๊ณผ ํ๊ทธ
$ docker rm <์ปจํ
์ด๋ ์ด๋ฆ>
$ docker rmi <์ด๋ฏธ์ง>
# ํ๋ฒ์ ์ฒ๋ฆฌ.
$ docker rm $(docker ps -a -q)
๋์ปค ์ด๋ฏธ์ง์ ์ปจํ ์ด๋ ์ญ์
$ docker start <์ปจํ
์ด๋ ์ด๋ฆ>
$ docker stop <์ปจํ
์ด๋ ์ด๋ฆ>
$ docker restart <์ปจํ
์ด๋ ์ด๋ฆ>
๋์ปค ์ปจํ ์ด๋ ์คํ , ์ค์ง , ์ฌ๋ถํ
$ docker attach <์คํ์ค์ธ ์ปจํ
์ด๋ ์ด๋ฆ>
$ docker exec -it <์คํ์ค์ธ ์ปจํ
์ด๋ ์ด๋ฆ> <์ปจํ
์ด๋ ์์์ ์คํํ ๋ช
๋ น>
$ docker exec -it merlin-nginx /bin/bash
attach ๋ ์คํ์ค์ธ ๋์ปค ์ปจํ
์ด๋์ ์ ์ํ๋ค. ๋จ, ps ์ณค์๋ command ์ /bin/bash ๋ผ๊ณ ์ณ์ ธ์์ด์ผ ์์ ๋กญ๊ฒ ์
๋ ฅํ ์ ์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์
๋ ฅ์ ํ ์ ์๊ณ ์ถ๋ ฅ๋ง ๋ณด์ธ๋ค.
exec ๋ ์ปจํ
์ด๋ ์์์ ์ํํ ๋ช
๋ น์ ๋ ๋ ค์ค๋๋ค. -it ์ต์
์ ์ฃผ๋ฉด ์คํ๋ bash ์์์ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ์ ํ ์๊ฐ ์์ต๋๋ค.
$ docker inspect <์ปจํ
์ด๋ ์ด๋ฆ or ์ด๋ฏธ์ง:ํ๊ทธ>
์ด๋ฏธ์ง ๋๋ ์ปจํ ์ด๋์ ์ธ๋ถ์ ๋ณด๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
$ docker history <์ด๋ฏธ์ง:ํ๊ทธ>
์ด๋ฏธ์ง์ ํ์คํ ๋ฆฌ๋ฅผ ์กฐํ
$ docker diff <์คํ์ค์ธ ์ปจํ
์ด๋ ์ด๋ฆ>
์ปจํ ์ด๋๊ฐ ์คํ๋๋ฉด์ ๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก์ ์ถ๋ ฅํฉ๋๋ค. ๋น๊ต ๊ธฐ์ค์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ์ด๋ฏธ์ง ๋ด์ฉ์ ๋๋ค.
$ docker cp <์ปจํ
์ด๋ ์ด๋ฆ>:<๊ฒฝ๋ก> <ํธ์คํธ ๊ฒฝ๋ก>
์ปจํ ์ด๋์์ ํ์ผ์ ๊บผ๋ด๊ธฐ.
Docker build
$ docker [OPTIONS] PATH | URL | -
$ docker build -t app .
-t ์ต์
์ ์์ฑํ ์ด๋ฏธ์ง ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
-f ์ต์
์ ํ์ผ๋ช
์ custom ํ๊ฒ ์ง์์๋ ์ฌ์ฉํ๊ฑฐ๋ Dockerfile ๊ฒฝ๋ก๊ฐ ๋ฃจํธ์ ์์๋ ์ด์ฉ.
PATH ๋ ๋์ปค ์ด๋ฏธ์ง ๋น๋ ํ ๋ ์ ์ก๋๋ context ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
Dockerfile
# ์ด๋ค ์ด๋ฏธ์ง๋ก๋ถํฐ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ง๋ฅผ ์์ฑ
# ๋ฒ ์ด์ค๋ฅผ ์ง์
FROM node:argon
# Dockerfile ์ ๊ด๋ฆฌํ๋ ์ฌ๋์ ์ด๋ฆ
MAINTAINER < merlin.ho > merlin@merlin.com
# /app directory ์์ฑ
RUN mkdir /app
# /app directory๋ฅผ WORKDIR๋ก ์ค์
WORKDIR /app
# ํ์ฌ ๊ฒฝ๋ก์ ์๋ package.json์ /app์ ๋ณต์ฌ
# ADD์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ๋ ์ฐจ์ด์ ์ URL์ ์ง์ ํ ์ ์๊ณ ์์ถํ์ผ์ ์๋์ผ๋ก ํ์ด์ฃผ์ง ์๋๋ค.
COPY package.json /app
# ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๋ฅผ ํธ์คํธ์์ docker image๋ก copyํ๋ค.
# src์ ํ์ผ ๋์ url์ ์
๋ ฅํ ์ ์๊ณ ์์ถ ํ์ผ์ ๊ฒฝ์ฐ ์์ถ์ ํด์ ํ๋ฉด์ ๋ณต์ฌ
# ํธ์คํธ์ ์๋ . ๊ฒฝ๋ก์ ์๋๊ฑธ /usr/src/app ์ ๋ณต์ฌ.
ADD < src > < dest >
ADD . /usr/src/app
# ๋ด๋ถ์ ์ผ๋ก /bin/sh -c ์คํ ๋ค npm install ์ ์คํ
RUN npm install
# ํ์ฌ Dockerfile ์ด ์๋ ๊ฒฝ๋ก์ ๋ชจ๋ ํ์ผ์ /app ์ ๋ณต์ฌํจ
COPY . /app
# ๊ฐ์๋จธ์ ์ ์คํํ ํฌํธ๋๋ฒ
EXPOSE 3000
# ๋์ปค ์ปจํ
์ด๋๊ฐ ์คํ ๋์์๋ ์คํ๋๋ ๋ช
๋ น ์ง์ , ๋น๋ํ ๋๋ ์คํ๋์ง ์์ผ๋ฉฐ ์ฌ๋ฌ๊ฐ์ CMD๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ๋ง ์คํ ๋ฉ๋๋ค.
# ํ๊บผ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ run.shํ์ผ์ ์์ฑํ์ฌ ๋ฐ๋ชฌ์ผ๋ก ์คํํ๊ฑฐ๋ supervisord๋ forego์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํฉ๋๋ค.
CMD ["npm", "start"]
recommendation Dockerfile
-
Containers should be ephemeral
- Ephemeral environments are also sometimes called โDynamic environmentsโ, โTemporary environmentsโ, โon-demand environmentsโ or โshort-lived environmentsโ.
- static environments ์ ๋ฐ๋๋๋ ๊ฐ๋ ์ด๋ค.
- ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ ์ด ์ปจํ ์ด๋๋ฅผ ์ฐ๋ฆฌ๊ฐ stop and destroy ํ ์ ์๊ณ ์๋กญ๊ฒ built ํ ์ ์์ผ๋ฉฐ ์ต์ํ์ ์ ํ ๊ณผ ์ค์ ์ผ๋ก ์ํ๋ ์ฅ์์ ์ฌ๋ ค ๋์์ ์๋ค ๋ผ๋๊ฒ์ ๋ปํจ.
- ๊ทธ๋์ ํญ์ production ํ๊ฒฝ๊ณผ ๊ฐ์ ํ๊ฒฝ์์ test ๋ฅผ ์งํํ ์ ์๋ค. test ๋ ํ๋์ ์ด๋ฏธ์ง๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ๋ณ๋ ฌ๋ก ์งํ ํ ์ ์๋ค.
-
Use a .dockerignore file
- ์ฐ๋ฆฌ๋ docker build ์ปค๋ฉ๋๋ฅผ ์น๋ ์ฅ์๋ฅผ build context ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๋ํดํธ๋ก ํ์ฌ ๋๋ ํ ๋ฆฌ๋ผ๊ณ ๊ฐ์ ํ์ง๋ง ๊ตฌ์ฒด์ ์ธ ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ค๋ฉด -f flag ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ๊ณผ ์ฌ๋ฌ ๋๋ ํ ๋ฆฌ๋ค์ docker deamon ์๊ฒ build context ๋ก ๋ณด๋ด์ง๊ฒ ๋๋๋ฐ ์ด ์ด๊ฒ์ ๋ฌด์ฌ์ฝ ์ด๋ฏธ์ง ๊ฒฐ๊ณผ๋ก ๋ณด๋ด์ง๊ฒ ๋์ด ์ด๋ฏธ์ง ํ์ผ์ด ์ปค์ง๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ .gitignore ์ ๋น์ทํ๊ฒ .dockerignore ํ์ผ์ ์ฌ์ฉํด์ ๊ด๊ณ์๋ ํ์ผ๋ค์ exclude ์ํฌ์ ์๋ค.
-
Use multi-stage builds
- Docker 17.05 ๋ฒ์ ์ด์์์๋ multi-stage builds ๋ก ์ต์ข ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์๋ค.
- multi-stage builds ๋ Dockerfile ์์์ multiple FROM ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฐ์ ์๋ก์ด stage ๊ฐ ๋น๋ ๋๊ณ ํ stage ์์ ๋์จ ๊ฒฐ๊ณผ ์ฐ์ถ๋ฌผ์ ๋๋ค๋ฅธ stage ๋ก ์นดํผ๋ฅผ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ค๊ฐ ์ฐ์ถ๋ฌผ์ ์ํด Dockerfile ์ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด์ ์ค๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ํ๋ ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์น์ง ์์๋ ๋๋ค.
- dockerfile ์ ์์ฑํ ๋ ์์ฃผ ๋ฐ๋์ง ์์ ๊ฒ๋ถํฐ ์์ฃผ ๋ฐ๋๋ ์์ผ๋ก ์์ฑ์ ํ๋ค.
-
Avoid installing unnecessary packages
- ๋ถํ์ํ ํจํค์ง๋ ์ธ์คํจ์ ํผํด๋ผ.
- ์๋ฅผ ๋ค๋ฉด ๋ฐ์ดํ๋ฒ ์ด์ค ์ด๋ฏธ์ง์ text editor ๋ฅผ ์ถ๊ฐ์ํฌ ํ์๋ ์๋ค.
-
Each container should have only one concern
- ํ๋์ ์ปจํ ์ด๋๋ ์ค์ง ํ๋์ ์ผ๋งํ๊ฒ ์์ผ๋ผ.
- ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ก ๋ถ๋ฆฌํ๋ฉด ๊ฐ๋ก๋ก ํ์ฅํ๊ณ ์ปจํ ์ด๋๋ฅผ ๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.
- ์ปจํ ์ด๋๋ฅผ ๊นจ๋ํ๊ณ ๊ฐ๋ฅํ ๋ชจ๋ํ ์ํฌ ์ ์๋ ์ต๊ณ ์ ํ๋จ์ ํด๋ผ.
- ๋ง์ฝ ์ปจํ ์ด๋ ๊ฐ๊ฐ์ด ์์กด์ฑ์ ๋๊ณ ์๋ค๋ฉด Docker network ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ ์ด๋๋ผ๋ฆฌ์ ์ปค๋ฎค๋์ผ์ด์ ์ ํ ์ ์๋ค.
- Minimize the number of layers
- Sort multi-line arguments
- Build cache
10 things to avoid in docker containers
1. Donโt store data in containers
2. Donโt ship your application in two pieces
3. Donโt create large images
4. Donโt use a single layer image
5. Donโt create images from running containers
6. Donโt use only the โlatestโ tag
7. Donโt run more than one process in a single container
8. Donโt store credentials in the image. Use environment variables
9. Donโt run processes as a root user
10. Donโt rely on IP addresses
์ถ์ฒ : https://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/
Docker app data ๊ด๋ฆฌ๋ฒ
ํธ์คํธ์ ์ง์ ๋ ํด๋๋ฅผ ์ปจํ ์ด๋์ ๋ค์ด๋ ํธ๋ก ๋ง์ดํธ
$ docker run --name merlin_ubuntu -d -v <ํธ์คํธ ํด๋๊ฒฝ๋ก>:<๋ง์ดํธ๋ ์ปจํ
์ด๋ ํด๋๊ฒฝ๋ก> -it ubuntu:14.04
volume container ์ฌ์ฉ
# ๋ณผ๋ฅจ ์ปจํ
์ด๋๋ฅผ ๋ง๋ ๋ค. busybox ๊ธฐ๋ฐ ์ ๋ง ๋ฆฌ๋
์ค์ ์ต์ ๊ธฐ๋ฐ๋ง ๊ฐ์ง๊ณ ์๋ค. 1.14MB
$ docker run -v /dbdata --name dbdata busybox
# ๋ณผ๋ฅจ ์ปจํ
์ด๋๋ฅผ ์ฐ๋ถํฌ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ
$ docker run --volumes-from=dbdata -it ubuntu:14.04 /bin/bash
# ๋นฝ์
๋ ์งํํ ์ ์๋ค.
$ docker run โvolumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
volume ์ผ๋ก ์ฌ์ฉ
- ๋ณดํต standalone ์ปจํ ์ด๋์๋ -v ๋๋ --volume ์ต์ ์ ์ฌ์ฉํ๊ณ , swarm service ์๋ --mount ์ต์ ์ ์ฌ์ฉํด ์์ง๋ง 17.06 ์ดํ ๋ฒ์ ผ๋ถํฐ๋ standalone ์ปจํ ์ด๋์์ ๋ชจ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋ง์ฝ ๋ณผ๋ฅจ๋๋ผ์ด๋ฒ์ ๊ตฌ์ฒด์ ์ธ ์ต์ ์ ์ ํ ํด์ผ ํ๋ค๋ฉด --mount ์ต์ ์ ์ฌ์ฉํด๋ผ.
- -v ๋๋ --volume ์ต์ ์ ๋์ปค ํธ์คํธ์ ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ๊ฐ ์์ ๊ฒฝ์ฐ ์๋์ผ๋ก ์์ฑํด์ฃผ์ง๋ง --mount ์ต์ ์ ์๋์ผ๋ก ์์ฑํด์ฃผ์ง ์๋๋ค ๋์ ์๋ฌ๋ฅผ ๋ฟ๋๋ค.
- -v ๋๋ --volume ์ ์ธ๊ฐ์ง field ๋ฅผ ๊ฐ์ง์ ์๋ค ์ฒซ๋ฒ์งธ๋ ํธ์คํธ ๋จธ์ ์ ๋ณผ๋ฅจ ์ด๋ฆ์ด๊ณ ๋๋คํ ๋ณผ๋ฅจ์ ์์ฑํ๊ณ ์ถ๋ค๋ฉด ์๋ตํด๋ ๋๋ค. ๋๋ฒ์งธ๋ ์ปจํ ์ด๋ ์์ ์์ฑ๋ ๋๋ ํ ๋ฆฌ ๋๋ ํ์ผ path ์ด๋ค. ์ธ๋ฒ์งธ๋ ์ต์ ์ผ๋ก ์ฝค๋ง(:)๋ก ์ต์ ์ ๋์ดํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด ro(readonly) ์ต์ ๋ฑ์ด ์๋ค.
- --mount ๋ key=value ๋ก ๊ตฌ์ฑ์ ํ๊ณ key ์๋ type, src or source , dst or target , volume-opt ๋ฑ์ด ์๋ค.
- type ์ ๊ฒฝ์ฐ์๋ bind , volume , tmpfs ๊ฐ ์๋ค. ์ฌ๋ฐ๋ฅธ ํ์ ์ผ๋ก ์ ํํ์.
- Voloumn ํ์ , volumn ์ ๋์ปค์ ์ํด ๊ด๋ฆฌ๋๋ host ์ชฝ์ ์๋ ํ์ผ์์คํ ์ผ๋ก ์ ์ฅ์ด ๋๋ค. ์ฌ๊ธฐ์ volumn ์ "~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty" ํด๋น ๊ฒฝ๋ก์ ์๋ ๋ฆฌ๋ ์ค ์์ "/var/lib/docker/volumes/" ์ชฝ์ ์ ์ฅ์ด ๋๋ค. ๋์ปค๊ฐ ์๋ ํ๋ก์ธ์ค๊ฐ ์ด ํ์ผ์ ์์ ํ์ง ๋ชปํ๊ณ volumnes ๋ ๋์ปค ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ด๋ค.
- bind ํ์ , ์ด bind ํ์ ์ host ์ด๋์๋ ์ ์ฅ์ด ๋ ์ ์๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์์คํ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ค์ ์ฌ์ฉ์ด ๋ ์์๊ณ ์ธ์ ๋ ์ง ๋์ปค๊ฐ ์๋ ํ๋ก์ธ์ค๋ ๋์ปค ์ปจํ ์ด๋์์ ์์ ๋ ์ ์๋ค.
- tmpfs ํ์ , ์ด ํ์ ์ hosts ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ host ํ์ผ์์คํ ์ ์ธ์๊ฐ ์๋ค. ํ๋ฐ์ฑ์ด ๊ฐํ๋ค.
$ docker volume create my-vol
$ docker volume ls
## Remove a volume:
$ docker volume rm my-vol
## ์ปจํ
์ด๋ ์ฐ๊ฒฐ
## mount ๋ฐฉ๋ฒ
$ docker run -d \
-it \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
$ docker run -d \
-it \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html \
nginx:latest
# -v ๋ฐฉ๋ฒ
$ docker run -d \
-it \
--name devtest \
-v myvol2:/app \
nginx:latest
$ docker run -d \
-it \
--name=nginxtest \
-v nginx-vol:/usr/share/nginx/html \
nginx:latest
๋ง์ดํธ ๋ ๊ฒฝ๋ก๋ inspect ๋ช ๋ น์ด๋ก ์์ ๋ณผ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ด์ฐ๋์๊ฑด ํธ์คํธ์ ๋ฐ์ดํ๋ฅผ ์ฐ๋ ์ํจ๋ค.
volume container ๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฐ์ดํฐ๋ ์ปจํ
์ด๋๋ก ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค. ๊ทธ๋ผ..์ปจํ
์ด๋์ ์ฅ์ ์ ๋ค ์ด์ฉํ ์ ์์ง ์์๊น...
Docker compose
์ฌ๋ฌ ์ปจํ ์ด๋์ Docker application ์ running ํ๊ณ defining ํ๊ธฐ ์ํ ํด์ด Compose ์ด๋ค. Compose ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ YAML ํ์ผ์ config ๋ฅผ app service ๋ณ๋ก ์ค์ ํ๋ฉด ๋๊ณ ํ ์ปค๋งจ๋ ๋ผ์ธ์ผ๋ก ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ์์ํ ์ ์๋ค. ํด๋น ์๋น์ค๋ YAML ํ์ผ์ ์ ํ์๋ ๊ทธ๋๋ก๋ฅผ ์คํ์ํจ๋ค.
docker compose install docker compose install
๊ณต์๋ฌธ์ https://docs.docker.com/compose/compose-file/
Docker compose ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- Define your appโs environment with a
Dockerfile
so it can be reproduced anywhere. - Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment. - Run
docker-compose up
and Compose starts and runs your entire app.
Docker compose config
version 3
# compose ๋ฒ์ ผ 3์ ์ด์ฉํ๊ฒ ๋ค. ๋์๋ฌธ์ ์ฃผ์
version: '3'
services:
webapp:
build: ./dir # ๊ตฌ์ฒด์ ์ธ ๋น๋ ์ปจํ
์คํธ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค. ๋์ปค ํ์ผ์ ํฌํจํ๋ ๋๋ ํ ๋ฆฌ๋ ๊น ๋ ํ์งํ ๋ฆฌ url,
build: # ๋๋ ๊ตฌ์ฒด์ ์ธ ์ต์
๋ค์ ์ค์ ํ ์ ์๋ค.
context: ./dir
dockerfile: Dockerfile-alternate
args: # ๋น๋ ํ๋ก์ธ์ค ์งํ์ค์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์๋ค์ ์ง์ ํ ์ ์๋ค.
buildno: 1
cache_from: # v3.2์ง์ ์์ง์ด ์บ์๋ก ์ฌ์ฉํ ์ด๋ฏธ์ง๋ค
- alpine:latest
- corp/web_app:3.14
command: bundle exec thin -p 3000 # ๋ํดํธ ์ปค๋ฉ๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ
container_name: my-web-container # ์ปจํ
์ด๋ ์ด๋ฆ
# ๋ฒ์ 3๋ถํฐ๋ depend_on ์์ condition์ ์ง์ํ์ง ์๋๋ค.
depends_on: # ์๋น์ค๋ค ๊ฐ์ ์์กด์ฑ์ ํํ, ์ด๊ฒ์ db, redis ์ดํ์ webapp ์ด ์คํํ๊ฒ ๋๋ค.(compose up์)
- db
- redis
tmpfs: /run # ์ปจํ
์ด๋์ ์์ ํ์ผ ์์คํ
์ ๋ง์ดํธ , ๋ฆฌ์คํธ๋ก ์์ฑํด๋ ๋๋ค.
entrypoint: /code/entrypoint.sh # ๋์ปค ํ์ผ์ ์ํธ๋ฆฌ ํฌ์ธํธ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ , ๋ฆฌ์คํธ๋ก ์์ฑํด๋ ๋๋ค.
env_file: # ํ๊ฒฝ๋ณ์๋ค์ ํ์ผ๋ก ๋ฐ๋๋ค. ์ด ํ๊ฒฝ ๋ณ์ ํ์ผ๋ค์ ๊ฐ๊ฐ ๋ผ์ธ๋ง๋ค VAR=VAL ํฌ๋ฉง์ผ๋ก ์์ฑํ๋ค. #์ ์ฃผ์
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment: # ํ๊ฒฝ๋ณ์ ์ถ๊ฐ. ์ด๋ค boolen ๊ฐ๋ค์ quotes๋ก ๊ฐ์ผ๋ค.
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
expose: # ํฌํธ ๋
ธ์ถ
- "3000"
- "8000"
external_links: # ๋งํฌ ์ปจํ
์ด๋ docker-compose.yml ์ธ๋ถ์ ์๋ ์ปจํ
์ด๋ , CONTAINER:ALIAS
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts: # /etc/hosts ์ ์ถ๊ฐ
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
image: redis # ํน๋ณํ ์ด๋ฏธ์ง๋ก ๋ถํฐ ๋ฐ , ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด pull ํ๋ค.
healthcheck: # ์ด ์๋น์ค๋ฅผ ์ํด ๊ฑด๊ฐํ์ง ์ฒดํฌ , ์ด๋ฏธ์ง๋ก ๋ถํฐ ์ด๋ค ๋ํดํธ ํฌ์ค์ฒดํฌ๋ฅผ disable ํ๋ ค๋ฉด disable: true ์ถ๊ฐ
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
labels: # ๋ผ๋ฒจ ์ถ๊ฐ.
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
links: # ๋ค๋ฅธ ์๋น์ค๋ค์ ์ปจํ
์ด๋ ๋ค๊ณผ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ํ์ฑ, SERVICE:ALIAS , ์ฃผ์!! --links ํ๋๊ทธ๋ ๋ ๊ฑฐ์ ์ด๋ค. --links ์ฌ์ฉ์ ๋์ ํด์ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ๋คํธ์ํฌ ์ค์ ์ ์ด์ฉํ๊ธธ ๊ถ์ฅํ๋ค.
- db
- db:database
- redis
logging: # ์๋น์ค์ ๋ก๊น
config
driver: syslog # json-file , syslog , none
options:
syslog-address: "tcp://192.168.0.42:123",
max-size: "200k" # json-file ์ ๊ฒฝ์ฐ ๋ก๊ทธ ์ ์ฅ์ ์ ํํ ์ ์๋ค. ์ค๋๋ ํ์ผ์ ์ง์์ง๋ค.
max-file: "10"
network_mode: bridge # ๋คํธ์ํฌ ๋ชจ๋ ์ค์ , host , none , service:[service name] , container:[container name/id] //// host ๋ชจ๋๋ links๋ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
networks: # top level ์์ ์ง์ ํ ๋คํธ์ํฌ ์ค์ , ์๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ๋ ์๋ค. ์ด ์๋ฆฌ์์ค ๋ค์์ผ๋ก ์๋น์ค๋ฅผ ์ฐ๊ฒฐ ํ ์ ์๋ค.
- some-network
- other-network
new:
aliases:
- database
ports: # HOST:CONTAINER
- "8000:8000"
volumes: # ํธ์คํธ ๊ฒฝ๋ก ๋๋ ์์ฑ๋ ๋ณผ๋ฅจ์ ๋ง์ดํธ ์ํจ๋ค.
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
volumes:
mydata:
external : true # ์ปดํฌ์ฆ ๋ฐ์ volume์ด ์กด์ฌํ์๋, ์์ผ๋ฉด 'docker volume create --name=' ์ผ๋ก ๋ง๋ค๋ผ๊ณ ์๋ฌ๋ธ.
name : actual-name-of-volume # ์ด๋ฆ์ ์ง์ ํ ์๋ ์๋ค.
dbdata:
networks:
- ์ง์ ํ๋ ์์
version: '3.2'
services:
app_blue:
image: blog_express:v1
depends_on:
- nginx-proxy
- mongo-db
working_dir: /app/
networks:
- dbconnection
environment:
- VIRTUAL_HOST=nodeapp.local
volumes:
- type: bind
source: ./server
target: /app/server
command: npm start
app_green:
image: blog_express:v1
depends_on:
- nginx-proxy
- mongo-db
working_dir: /app/
networks:
- dbconnection
environment:
- VIRTUAL_HOST=nodeapp.local
volumes:
- type: bind
source: ./server
target: /app/server
command: npm start
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 8081:80
networks:
- dbconnection
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
mongo-db:
image: mongo
depends_on:
- nginx-proxy
volumes:
- db-data:/data/db
networks:
- dbconnection
command: mongod --dbpath "/data/db"
volumes:
db-data:
networks:
dbconnection:
Docker network
์ถ์ฒ : http://bluese05.tistory.com/15
network ๊ตฌ์ฑ
- ๋์ปค๋ฅผ ์ค์น ํ๋ฉด docker host ์ชฝ์ ๋ณด๋ฉด docker0 ์ด๋ผ๋ virtual ethernet bridge ๋ฅผ ํ์ธํ ์ ์๋ค. ( $ ifconfig ๋ก ํ์ธ๊ฐ๋ฅ, ๋ 172.17.0.1 ๋ก ์ ํ ๋์ด ์๋ค.)
- docker0 ๋ container ๊ฐ ํต์ ํ๊ธฐ ์ํ ๊ฐ์ linux bridge ์ด๋ค. bridge ๋ ๊ธฐ๋ณธ์ ์ผ๋ก L2 ํต์ ๊ธฐ๋ฐ์ด๋ค.
- ์ปจํ ์ด๋๊ฐ ํ๋์ฉ ์์ฑ๋๋ฉด ์ด bridge ์ ํ๋์ฉ ๋ฐ์ธ๋ฉ ๋๋ค. ( $ brctl show docker0 )
- ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋ ์ปจํ ์ด๋์ host ๋ ์ผ์ด๋ธ๋ก ์ฐ๊ฒฐํ ๋๋์ pc ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ์ปจํ ์ด๋ ๋ด๋ถ์ eth0 ์ธํฐํ์ด์ค๋ ๋ด๋ถ๋ก ๊ฒฉ๋ฆฌ๋์ด์์ด์ ์ด ๋ด๋ถ์ host ๋ฅผ ์ด์ด์ค vethxxxx ํํ์ ์ธํฐํ์ด์ค๊ฐ ํ๋ ๋ ์กด์ฌํ๋ค. ์ด ์ธํฐํ์ด์ค๊ฐ host ์ ์ปจํ ์ด๋ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
- ์ปจํ ์ด๋ ๋ด๋ถ์ ์์ดํผ๋ฅผ ํ์ธํ๋ ค๋ฉด ifconfig eth0 ๋ผ๊ณ ์น๋ฉด ๋๋๋ฐ ifconfig ๊ฐ ์ ์๋จน๋๋ค. ๊ทธ๋ด๋ ๋์ปค inspect ๋ก ํ์ธํ์.
network ํ์ธ
$ ip addr show
or
$ ifconfig
$ docker attach nonenetcontainer
# ์ ์ํ
$ cat /etc/hosts
$ ip -4 addr
attach ํ๋๊ฑธ detach ํ๊ธฐ ์ํด์ CTRL-p CTRL-q ๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
network ๋ฐฉ์
# ๋คํธ์ํฌ ๋ฐฉ์ ํ์ธํ๊ธฐ ( ๋๋ผ์ด๋ฒ ) bridge , host , none ( ๋ค์ ๊ธฐ์ค )
$ docker network ls
# ๊ธฐ๋ณธ ๋คํธ์ํฌ๋ bridge ๋ฐฉ์์ด๋ค.
# ๋ค๋ฅธ๋ฐฉ์์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด
$ docker run --new={๋คํธ์ํฌ ํ์
}
-
birdge
- ๋คํธ์ํฌ์์ ๋ธ๋ฆฟ์ง๋ ํธ์คํธ ์๋ฒ์ ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ฐ์ํ๋ ๋จธ์ ๋ค๋ ๋์ผํ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
- docker network inspect bridge ๋ก ๋ธ๋ฆฟ์ง ๋ชจ๋์ ์์ธํ ๋ด์ฉ์ ํ์ธ ํ ์ ์๋ค.
-
host
- ์ด ๋ฐฉ์์ ์ปจํ ์ด๋๊ฐ ๋ ๋ฆฝ์ ์ธ ๋คํธ์ํฌ ์์ญ์ ๊ฐ์ง ์๊ณ host ์ ๋คํธ์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค.
- ๋ฐ๋ผ์ ํด๋น ์ปจํ ์ด๋๋ host ์ ๋คํธ์ํฌ ์ ๋ณด์ ๋์ผ์ ํ๊ฒ ๊ฐ์ ธ๊ฐ๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ docker0 ์ ๋ฐ์ธ๋ฉ ๋์ง ์๋๋ค.
-
container
- ๋ค๋ฅธ ์ปจํ ์ด๋์ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ฐ์ ธ์จ๋ค. ์ฆ, ip ์ mac ์ฃผ์๋ฅผ ๋์ผ์ ํ๊ฒ ๊ตฌ์ฑํ๋ค.
- docker run --name web03 --net=container:{์ปจํ ์ด๋ id} -d nginx:alpine
-
none
- ์ด ์ต์ ์ ๊ฒฉ๋ฆฌ๋ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ฐ์ง๋ง, ์ธํฐํ์ด์ค๊ฐ ์๋ ์ํ๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
container ์ธ๋ถ ํต์
- ๊ฐ ์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ๊ฐ๊ฐ์ mac ์ฃผ์์ ip ์ฃผ์๋ฅผ ๋ถ์ฌ ๋ฐ๋๋ค.
- ๊ฐ ์ปจํ ์ด๋๋ค์ host ์ ํต์ ํ๊ธฐ ์ํด bridge ๋ฐฉ์์ผ๋ก ๋ฐ์ธ๋ฉ ๋์ด์๋๋ฐ ๊ฐ ๋ถ์ฌ๋ฐ์ ip ๋ก ์์ ๋กญ๊ฒ ํต์ ๊ฐ๋ฅ.
- ์๋ฅผ ๋ค๋ฉด web ์๋น์ค๋ฅผ ํ๋ container ๋ 80 ๋ฒ ํฌํธ์์ ๋ฆฌ์ค๋์ ํ๊ณ ์๋ค. ์ด ํฌํธ๋ ์ธ๋ถ์ ํต์ ์ด ๋์ด์ผ ํ๋๋ฐ ์ด๋ ํฌํธ๋ฅผ ์ธ๋ถ๋ก ์ง์ ํ๋ค. -p 8080:80 ์ผ๋ก ์ต์ ์ ์ฃผ๊ฒ ๋๋ฉด docker host ์ 8080 ํฌํธ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ปจํ ์ด๋์ 80 ํฌํธ๋ก ํด๋น ์์ฒญ์ forwarding ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
- docker ps -a or netstat -nlp | grep 8080 ๋ก ํ์ธ
link ๋ฐฉ์์ ํ๊ณ
- link ๋ฐฉ์์ ํ๋์ ํธ์คํธ ์ฌ์ด์์ ์คํ๋๋ ์ปจํ ์ด๋ ์ฌ์ด์์๋ง ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
- ๋ค์์ host ๊ฐ ์กด์ฌํ์๋, ๋ค๋ฅธ host ์ ์ปจํ ์ด๋์๋ ์ ๊ทผํ ์๊ฐ ์๋ค.
- ์ด ๊ฒฝ์ฐ docker swarm ๊ฐ์ orchestration ํด์ ์ฌ์ฉํ๊ฑฐ๋ dynamic DNS ๋ฅผ ๊ตฌ์ถํด์ผํ๋ค.
Warning: >The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.
** dynamic DNS ๋? - ๊ฐ๋จํ๊ฒ ip ๊ฐ ๋ฐ๋๋ฉด ๊ทธ๊ฑธ ์์์ฑ์ ์ธ๋ถ DNS ์๋ฒ์ ์๋ ค์ค๋ค. ๊ทธ๋ฌ๋ฉด ip ๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋ ํ๊ฒฝ์์๋ ์ฌ์ฉ์๋ ๋ฐ๋ ip ๋ฅผ ์ ํ์ ์์ด domain name ๋ง ์๋ฉด ๋์ผํ๊ฒ ์ ์ ํ ์ ์๋ค.