Git Hooks๋ Git๊ณผ ๊ด๋ จํ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ํน์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๋ ํด๋ผ์ด์ธํธ ํ ๊ณผ ์๋ฒ ํ ์ผ๋ก ๋๋๋๋ฐ, ํด๋ผ์ด์ธํธ ํ ์ ์ปค๋ฐ์ด๋ Mergeํ ๋ ํด๋ผ์ด์ธํธ์์ ์คํํ๋ ํ ์ด๋ค. ๋ฐ๋ฉด ์๋ฒ ํ ์ Git repository๋ก pushํ ๋ ์๋ฒ์์ ์คํํ๋ ํ ์ด๋ค.
Git hook์์ ์ง์ํ๋ ๊ธฐ๋ฅ ์ค pre-commit hook์ ๊ด๋ฆฌํ๊ณ ์ ์งํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ก, lint๊ฐ์ ํ๋ก๊ทธ๋จ์ ํตํด ์ฝ๋ ์คํ์ผ ๊ฒ์ฌ, ๋ผ์ธ ๋ ๊ณต๋ฐฑ ๋ฌธ์ ๊ฒ์ฌ, ์๋ก ์ถ๊ฐํ ์ฝ๋์ ์ฃผ์ ๊ฒ์ฌ ๋ฑ commitํ ๋ ๊ผญ ํ์ธํด์ผ ํ ๊ฒ์ด ์์ผ๋ฉด pre-commit hook์ ํตํด ํ์ธํ๋ฉด ๋๋ค.
git commit --no-verify
๋ฅผ ํตํด hook ์ผ์์ ์ผ๋ก ์๋ต ๊ฐ๋ฅpip ์ด์ฉ ์
pip install pre-commit
homebrew ์ด์ฉ ์
brew install pre-commit
conda ์ด์ฉ ์
conda install -c conda-forge pre-commit
GitHub Action์ ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌ ๋ฑ์ ์๋ํํ ์ ์๋ CI/CD ํ๋ซํผ์ผ๋ก, workflow๋ฅผ ์๋ํํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ด๋ค.
Workflow
ํ๋ ์ด์์ Job์ผ๋ก ๊ตฌ์ฑ๋๊ณ , ์ด๋ฒคํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ๋ ์คํ๋๊ฑฐ๋ ์๋์ผ๋ก ๋๋ ์ ์๋ ์ผ์ ์ ๋ฐ๋ผ ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋ ์๋ํ๋ ์ ์ฐจ๋ฅผ ๋งํ๋ค. workflow๋ Github repository์ .github/workflows
ํด๋ ์๋์ YAML ํ์ผ๋ก ์ ์ฅ๋๋ค. Github์ YAML ํ์ผ๋ก ์ ์ํ ์๋ํ ๋์์ ์ ๋ฌํ๋ฉด, Github Action์ ํด๋น ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ๊ทธ๋๋ก ์คํ์ํจ๋ค.
Event
workflow๋ฅผ ์คํ์ ํธ๋ฆฌ๊ฑฐํ๋ ํน์ ํ๋์ด๋ ๊ท์น์ด๋ค. ์๋ฅผ ๋ค์ด, ๋๊ตฐ๊ฐ๊ฐ commit์ repository์ pushํ๊ฑฐ๋ pull ์์ฒญ์ด ์์ฑ ๋ ๋ GitHub์์ ํ๋์ด ์์๋ ์ ์๋ค.
Job
Job์ ์ฌ๋ฌ Step์ผ๋ก ๊ตฌ์ฑ๋๊ณ , ๋จ์ผ ๊ฐ์ ํ๊ฒฝ์์ ์คํ๋๋ค. ๋ค๋ฅธ Job์ ์์กด ๊ด๊ณ๋ฅผ ๊ฐ์ง ์๋ ์๊ณ , ๋
๋ฆฝ์ ์ผ๋ก ๋ณ๋ ฌ๋ก ์คํ๋ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์ข
์์ฑ์ด ์๋ ์๋ก ๋ค๋ฅธ ์ํคํ
์ฒ์ ๋ํ ์ฌ๋ฌ ๋น๋ ์์
๊ณผ ์ด๋ฌํ ์์
์ ์ข
์๋ ํจํค์ง ์์
์ด ์์ ์ ์๋ค. ๋น๋ ์์
์ ๋ณ๋ ฌ๋ก ์คํ๋๋ฉฐ ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ํจํค์ง ์์
์ด ์คํ๋๋ค.
Step
Job ์์์ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ํ๋ก์ธ์ค ๋จ์๋ก, step์์ ๋ช
๋ น์ ๋ด๋ฆฌ๊ฑฐ๋ action์ ์คํํ ์ ์๋ค.
Action
job์ ๊ตฌ์ฑํ๊ธฐ ์ํ step๋ค์ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ๋ ๋
๋ฆฝ์ ์ธ ๋ช
๋ น์ผ๋ก workflow์ ๊ฐ์ฅ ์์ ๋น๋ ๋จ์์ด๋ค. workflow์์ action์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ action์ด step์ ํฌํจํด์ผ ํ๋ค. ์ง์ ๋ง๋ค์ด ์ฌ์ฉํ ์๋ ์๊ณ ๋ง์ผ์ ๋ฑ๋ก๋ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฒ์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์๋ ์๋ค.
Runner
ํธ๋ฆฌ๊ฑฐ๋ ๋ workflow๋ฅผ ์คํํ๋ ์๋ฒ๋ก, ํ ๋ฒ์ ํ๋์ ์์
์ ์คํํ ์ ์๋ค.
- repository์์ workflow ํ์ผ์ ์ ์ฅํ
.github/workflows/
ํด๋๋ฅผ ๋ง๋ ๋ค.
.github/workflows/
ํด๋์์learn-github-actions.yml
๋ผ๋ ์ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.name: learn-github-actions run-name: ${{ github.actor }} is learning GitHub Actions on: [push] jobs: check-bats-version: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: '14' - run: npm install -g bats - run: bats -v
- ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ commitํ๊ณ Github repository์ pushํ๋ค.
์ด์ ์ Github Actions workflow ํ์ผ์ด repository์ ์ค์น๋๊ณ ๋๊ตฐ๊ฐ repository์ ๋ณ๊ฒฝ ์ฌํญ์ pushํ ๋๋ง๋ค ์๋์ผ๋ก ์คํ๋๋ค.
name: learn-github-actions
(์ ํ ์ฌํญ) Github repository์ "Action" ํญ์ ํ์๋๋ workflow์ ์ด๋ฆ์ด๋ค.
run-name: ${{ github.actor }} is learning GitHub Actions
(์ ํ ์ฌํญ) workflow์์ ์์ฑ๋ workflow์ ์คํ ์ด๋ฆ์ผ๋ก, ์ ์ฅ์์ "Action" ํญ์ ์๋ workflow ์คํ ๋ชฉ๋ก์ ํ์๋๋ค.
on: [push]
workflow ํ์ผ์ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ ์ด๋ฒคํธ๋ฅผ ์ง์ ํ๋ค. ์ด ์์ ์์๋ push ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋๊ตฐ๊ฐ ์ ์ฅ์์ ๋ณ๊ฒฝ ์ฌํญ์ pushํ๊ฑฐ๋ pull ์์ฒญ์ ํ ๋๋ง๋ค workflow ์คํ์ด ํธ๋ฆฌ๊ฑฐ๋๋ค.
jobs:
learn-github-actions
workflow์์ ์คํ๋๋ ๋ชจ๋ job์ ํจ๊ป ๊ทธ๋ฃนํํ๋ค.
runs-on
: ํด๋น job์ ์ด๋ค OS์์ ์คํํ ๊ฒ์ธ์ง ๋ช
์ํ๋ค.steps
: job์ด ๊ฐ์ง ์ ์๋ ๋์์ ๋์ดํ๋ค. ๊ฐ๊ฐ์ step์ ๋
๋ฆฝ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๋ค.uses
: ํด๋น step์์ ์ฌ์ฉํ action์ผ๋ก, Github ๋ง์ผํ๋ ์ด์ค์ ์ฌ๋ผ์จ action๋ค์ ์ฌ์ฉํ ์๋ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก {owner}/{repo}@{ref|version}
์ ํํ๋ฅผ ์ง๋๋ค.name
: step์ ์ด๋ฆ์ด๋ค.run
: job์ ํ ๋น๋ ์ปดํจํ
์์์ shell์ ์ด์ฉํ์ฌ ์ปค๋งจ๋ ๋ผ์ธ์ ์คํํ๋ค. node.js ํ๋ก์ ํธ์ ๊ฒฝ์ฐ, ์ด ๊ณผ์ ์ npm package์ scripts๋ฅผ ๊ตฌ๋ํ ์ ์๋ค.env
: ํด๋น job์์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์๋ฅผ key/value์ ํํ๋ก ์ค์ ํ๋ค.strategy
: ์ฌ๋ฌ ํ๊ฒฝ์์์ ํ
์คํธ/๋ฐฐํฌ๋ฅผ ์ํด์ ๋น๋ matrix๋ฅผ ๊ตฌ์ฑํ๋ค. ์ ์ฝ๋์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋ค์ํ node ๋ฒ์ ์์ ๊ฐ์ job์ ์คํํ ์๋ ์๋ค.with
: ํด๋น action์ ์ํด ์ ์๋๋ input ํ๋ผ๋ฏธํฐ๋ก, key/value ํ์ด๋ก ๋์ด ์๋ค. input ํ๋ผ๋ฏธํฐ๋ ํ๊ฒฝ ๋ณ์๋ก ์ค์ ๋๊ณ , 'INPUT_'์ด๋ผ๋ prefix๊ฐ ๋ถ๋๋ค.๋จ์ ํ ์คํธ(Unit Test)๋ถํฐ ์ธ์ ํ ์คํธ(Acceptance Test)๊น์ง ํ ์คํธ ํ ์ ์๋ all-in-one Python Test Framework์ด๋ค.
๋ช
๋ น ํ๋กฌํํธ(cmd)์์ pytest ์ค์น
pip install -U pytest
๋ฒ์ ํ์ธ
pytest --version
ํจ์์ ํ
์คํธ๋ฅผ ํฌํจํ๋ ๊ฐ๋จํ test_sample.py
ํ์ผ์ ์์ฑํ๋ค. pytest๋ฅผ ์ฌ์ฉํ ๋, ํ
์คํธ ํจ์๋ ๊ผญ ์์ test_ ๋ก ์์ํ๊ฑฐ๋ ๋ค์ _test ๋ก ๋๋์ผ ํ๋ค.
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
๊ทธ๋ฐ ๋ค์ pytest test_sample.py
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ์ด๋ฌํ ์ฐฝ์ด ๋ฌ๋ค.
$ pytest test_sample.py
================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐํ ํ๋ฉด
collected 1 item
test_sample.py F [100%]
====================================== FAILURES ======================================
____________________________________ test_answer _____________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:7: AssertionError
============================== short test summary info ===============================
FAILED test_sample.py::test_answer - assert 4 == 5
================================= 1 failed in 0.05s ==================================
[100%]๋ ํด๋น ์ฝ๋์ ๋ชจ๋ ํ
์คํธ ํจ์๋ฅผ ์คํํ๋ค๋ ๋ป์ด๋ค. ์๋ฃ๋ ํ ์ด ์ฝ๋์์ func(3)๊ฐ 5๋ฅผ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํจ ๋ณด๊ณ ์๋ฅผ ํ์ํ๋ค.
ํจ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ func(3) == 4
๋ก ๊ณ ์น ํ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ๋ฌ๋ค.
$ pytest test_sample.py
================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐํ ํ๋ฉด
collected 1 item
test_sample.py . [100%]
================================= 1 passed in 0.01s ==================================
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด test_sample.py ๋ผ๋ ํจ์ ๋ค์ โ.โ ์ ํ๋๊ฐ ๋์ค๋๋ฐ, ์ด๋ ํ ์คํธ ์ฝ๋์์ ํ ์คํธ ํ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๊ทธ๊ฒ ํต๊ณผ(โ.โ) ํ๋ค๋ ๋ป์ด๋ค.
parametrize๋ ์ฌ๋ฌ ํ
์คํธ ์ผ์ด์ค๋ฅผ ํ๋ฒ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ํ
์คํธ ์ฝ๋ ์ฝ์
์์ -
import pytest
@pytest.mark.parametrize(
"num,expected",
[
(1, 2),
(2, 3),
(10, 15),
],
)
def func(x):
return x + 1
def test_answer(num, expected):
assert expected == func(num)
๋ด ์ด๋ก ์ ์ด ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด ๋์๊ฐ ์ค ์์์ผ๋ ์๋ฌ ๋ฐ์,,,
================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐํ ํ๋ฉด
collected 1 item
test_sample.py E [100%]
======================================= ERRORS =======================================
___________________________ ERROR at setup of test_answer ____________________________
file C:\Users\lsymi\OneDrive\๋ฐํ ํ๋ฉด\test_sample.py, line 16
def test_answer(num, expected):
E fixture 'num' not found
> available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
> use 'pytest --fixtures [testpath]' for help on them.
C:\Users\lsymi\OneDrive\๋ฐํ ํ๋ฉด\test_sample.py:16
============================== short test summary info ===============================
ERROR test_sample.py::test_answer
================================== 1 error in 0.02s ==================================
์กฐ๊ธ ๋ ์์๋ณธ ํ ๋ฐ์ ์ฝ๋๊น์ง ๊ฐ์ด ์ถ๊ฐํ ์์
pytest.raises๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ํจ์์ exception์ ์ค์ ๋ก ํ์ธํด๋ณผ ์ ์๋ค.
- ํ
์คํธ ์ฝ๋ ์ฝ์
์์ -
์ฌ๋ฌ ํ
์คํธ ํจ์์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฐ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ํ
์คํธ ์ฝ๋ ์ฝ์
์์ -
ํ
์คํธ ํจ์์ ํ์๋ฅผ ๋จ๊ฒจ ํ
์คํธํ ํจ์๋ฅผ ์ง์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ํ
์คํธ ์ฝ๋ ์ฝ์
์์ -
Docker๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ฒ ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ ์ ์๋ ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์คํ์์ค ๊ฐ์ํ ํ๋ซํผ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ปจํ ์ด๋๋ผ ํ๋ฉด ๋ฐฐ์ ์ค๋ ๋ค๋ชจ๋ ํ๋ฌผ ์์ก์ฉ ๋ฐ์ค๋ฅผ ๋ ์ฌ๋ฆด ๊ฒ์ด๋ค. ๊ฐ๊ฐ์ ์ปจํ ์ด๋ ์์๋ ๋ค์ํ ํ๋ฌผ์ ๋ฃ์ ์ ์๊ณ ๊ท๊ฒฉํ๋์ด ์ปจํ ์ด๋์ ์ด๋ ํธ๋ ์ผ๋ฌ ๋ฑ ๋ค์ํ ์ด์ก์๋จ์ผ๋ก ์ฝ๊ฒ ์ฎ๊ธธ ์ ์๋ค.
์๋ฒ์์ ์ด์ผ๊ธฐํ๋ ์ปจํ ์ด๋๋ ์ด์ ๋น์ทํ๋ฐ, ๋ค์ํ ํ๋ก๊ทธ๋จ, ์คํํ๊ฒฝ์ ์ปจํ ์ด๋๋ก ์ถ์ํํ๊ณ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํ๊ฒ ํด์ค๋ค. ๋ฐฑ์๋ ํ๋ก๊ทธ๋จ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ, ๋ฉ์์ง ํ ๋ฑ ์ด๋ค ํ๋ก๊ทธ๋จ๋ ์ปจํ ์ด๋๋ก ์ถ์ํํ ์ ์๊ณ ์กฐ๋ฆฝPC, AWS, Azure, Google cloud ๋ฑ ์ด๋์์๋ ์คํํ ์ ์๋ค.
์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋ ๊ณต๊ฐ์์ ํ๋ก์ธ์ค๊ฐ ๋์ํ๋ ๊ธฐ์ ์ด๋ค. ๊ฐ์ํ ๊ธฐ์ ์ค ํ๋์ง๋ง ๊ธฐ์กด ๋ฐฉ์๊ณผ๋ ์ฐจ์ด๊ฐ ์๋ค.
๊ธฐ์กด์ ๊ฐ์ํ ๋ฐฉ์์ ์ฃผ๋ก OS๋ฅผ ๊ฐ์ํํ์๋ค. ์ฐ๋ฆฌ์๊ฒ ์ต์ํ VMware๋ VirtualBox๊ฐ์ ๊ฐ์๋จธ์ ์ ํธ์คํธ OS์์ ๊ฒ์คํธ OS ์ ์ฒด๋ฅผ ๊ฐ์ํํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ ๋ฆฌ๋ ์ค์์ ์๋์ฐ๋ฅผ ๋๋ฆฌ๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง OS๋ฅผ ๊ฐ์ํํ ์ ์๊ณ ๋น๊ต์ ์ฌ์ฉ๋ฒ์ด ๊ฐ๋จํ์ง๋ง ๋ฌด๊ฒ๊ณ ๋๋ ค์ ์ด์ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์๋ค.
์ด๋ฌํ ์ํฉ์ ๊ฐ์ ํ๊ธฐ ์ํด CPU์ ๊ฐ์ํ ๊ธฐ์ (HVM)์ ์ด์ฉํ KVMKernel-based Virtual Machine๊ณผ ๋ฐ๊ฐ์ํ Paravirtualization๋ฐฉ์์ Xen์ด ๋ฑ์ฅํ๋ค. ์ด๋ฌํ ๋ฐฉ์์ ๊ฒ์คํธ OS๊ฐ ํ์ํ๊ธด ํ์ง๋ง ์ ์ฒดOS๋ฅผ ๊ฐ์ํํ๋ ๋ฐฉ์์ด ์๋์๊ธฐ ๋๋ฌธ์ ํธ์คํธํ ๊ฐ์ํ ๋ฐฉ์์ ๋นํด ์ฑ๋ฅ์ด ํฅ์๋์๋ค. ์ด๋ฌํ ๊ธฐ์ ๋ค์ OpenStack์ด๋ AWS, Rackspace๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค์์ ๊ฐ์ ์ปดํจํ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ด ๋์๋ค.
์ ๊ฐ์ํ๋ ๋ฐ๊ฐ์ํ๋ ์ถ๊ฐ์ ์ธ OS๋ฅผ ์ค์นํ์ฌ ๊ฐ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์๊ณ ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ๊ฒฉ๋ฆฌ ํ๋ ๋ฐฉ์์ด ๋ฑ์ฅํ๋ค.
๋ฆฌ๋ ์ค์์๋ ์ด ๋ฐฉ์์ ๋ฆฌ๋ ์ค ์ปจํ ์ด๋๋ผ๊ณ ํ๊ณ ๋จ์ํ ํ๋ก์ธ์ค๋ฅผ ๊ฒฉ๋ฆฌ์ํค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ๋์ํ๋ค. CPU๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฑ ํ๋ก์ธ์ค๊ฐ ํ์ํ ๋งํผ๋ง ์ถ๊ฐ๋ก ์ฌ์ฉํ๊ณ ์ฑ๋ฅ์ ์ผ๋ก๋ ๊ฑฐ์ ์์ค์ด ์๋ค.
Bridge
๋ชจ๋๋ก ์ฝ๊ฐ์ ์ฑ๋ฅ ์์ค์ด ์๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ ์ฑ๋ฅ์ด ์ค์ํ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ --net=host
์ต์
์ ๊ณ ๋ คํด์ผ ํ๋ค.ํ๋์ ์๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์คํํ๋ฉด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋์ด ๋ง์น ๊ฐ๋ฒผ์ด VMVirtual Machine์ ์ฌ์ฉํ๋ ๋๋์ ์ค๋ค. ์คํ์ค์ธ ์ปจํ
์ด๋์ ์ ์ํ์ฌ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ ์ ์๊ณ apt-get
์ด๋ yum
์ผ๋ก ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๋ ์ถ๊ฐํ๊ณ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ ์๋ ์๋ค. ๋ํ CPU๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ํํ ์ ์๊ณ ํธ์คํธ์ ํน์ ํฌํธ์ ์ฐ๊ฒฐํ๊ฑฐ๋ ํธ์คํธ์ ํน์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ด๋ถ ๋๋ ํ ๋ฆฌ์ธ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๋ค.
์ด๋ฏธ์ง๋ ์ปจํ ์ด๋ ์คํ์ ํ์ํ ํ์ผ๊ณผ ์ค์ ๊ฐ ๋ฑ์ ํฌํจํ๊ณ ์๋ ๊ฒ์ผ๋ก ์ํ๊ฐ์ ๊ฐ์ง์ง ์๊ณ ๋ณํ์ง ์๋๋ค. ์ปจํ ์ด๋๋ ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ํ๋ผ๊ณ ๋ณผ ์ ์๊ณ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณํ๋ ๊ฐ์ ์ปจํ ์ด๋์ ์ ์ฅ๋๋ค. ๊ฐ์ ์ด๋ฏธ์ง์์ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ์ ์๊ณ ์ปจํ ์ด๋์ ์ํ๊ฐ ๋ฐ๋๊ฑฐ๋ ์ปจํ ์ด๋๊ฐ ์ญ์ ๋๋๋ผ๋ ์ด๋ฏธ์ง๋ ๋ณํ์ง ์๊ณ ๊ทธ๋๋ก ๋จ์์๋ค.
์ด๋ฏธ์ง๋ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋์ด์ ์์กด์ฑ ํ์ผ์ ์ปดํ์ผํ๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ ์ค์นํ ํ์๊ฐ ์๋ค. ์๋ก์ด ์๋ฒ๊ฐ ์ถ๊ฐ๋๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๊ณ ์ปจํ ์ด๋๋ง ์์ฑํ๋ฉด ๋๋ค.
๋์ปค ์ด๋ฏธ์ง๋ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต ์ฉ๋์ด ๋ช ๋ฐฑ MB์ ์ด๋ฅธ๋ค. ์ฒ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ์ ๋ ํฌ๊ฒ ๋ถ๋ด์ด ์๋์ง๋ง ๊ธฐ์กด ์ด๋ฏธ์ง์ ํ์ผ ํ๋ ์ถ๊ฐํ๋ค๊ณ ๋ช ๋ฐฑ MB๋ฅผ ๋ค์ ๋ค์ด๋ฐ๋๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ์ ๋ฐ์ ์๋ค.
๋์ปค๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด layer๋ผ๋ ๊ฐ๋
์ ์ฌ์ฉํ๊ณ ์ ๋์จ ํ์ผ ์์คํ
์ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ layer๋ฅผ ํ๋์ ํ์ผ์์คํ
์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค. ์ด๋ฏธ์ง๋ ์ฌ๋ฌ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ layer๋ก ๊ตฌ์ฑ๋๊ณ ํ์ผ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์์ ๋๋ฉด ์๋ก์ด layer๊ฐ ์์ฑ๋๋ค. ์๋ฅผ ๋ค์ด ubuntu ์ด๋ฏธ์ง๊ฐ A+B+C
์ ์งํฉ์ด๋ผ๋ฉด, ubuntu ์ด๋ฏธ์ง๋ฅผ ๋ฒ ์ด์ค๋ก ๋ง๋ nginx ์ด๋ฏธ์ง๋ A+B+C+nginx
๊ฐ ๋๋ค. webapp ์ด๋ฏธ์ง๋ฅผ nginx ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์๋ค๋ฉด A+B+C+nginx+source
layer๋ก ๊ตฌ์ฑ๋๋ค. webapp ์์ค๋ฅผ ์์ ํ๋ฉด A, B, C, nginx layer๋ฅผ ์ ์ธํ ์๋ก์ด source(v2) layer๋ง ๋ค์ด๋ฐ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ํจ์จ์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋๋ layer ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ ๊ธฐ์กด์ ์ด๋ฏธ์ง layer ์์ ์ฝ๊ธฐ/์ฐ๊ธฐ layer๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ฏธ์ง layer๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ ์ปจํ ์ด๋๊ฐ ์คํ์ค์ ์์ฑํ๋ ํ์ผ์ด๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ฝ๊ธฐ/์ฐ๊ธฐ layer์ ์ ์ฅ๋๋ฏ๋ก ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํด๋ ์ต์ํ์ ์ฉ๋๋ง ์ฌ์ฉํ๋ค.
์ด๋ฏธ์ง๋ url ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ํ๊ทธ๋ฅผ ๋ถ์ผ ์ ์๋ค. ubuntu 14.04 ์ด๋ฏธ์ง๋ docker.io/library/ubuntu:14.04
๋๋ docker.io/library/ubuntu:trusty
์ด๊ณ docker.io/library
๋ ์๋ต๊ฐ๋ฅํ์ฌ ubuntu:14.04
๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ๊ทธ ๊ธฐ๋ฅ์ ์ ์ด์ฉํ๋ฉด ํ
์คํธ๋ ๋กค๋ฐฑ๋ ์ฝ๊ฒ ํ ์ ์๋ค.
๋์ปค๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด Dockerfile
์ด๋ผ๋ ํ์ผ์ ์์ฒด DSL ์ธ์ด๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง ์์ฑ ๊ณผ์ ์ ์ ๋๋ค. ๋ง์ฝ ์๋ฒ์ ์ด๋ค ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ ค๊ณ ๋ค์ํ ์์กด์ฑ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์ค์ ํ์ผ์ ๋ง๋ค์๋ ๊ฒฝํ์ด ์๋ค๋ฉด, ๋ ์ด์ ๊ทธ ๊ณผ์ ์ ๋ธ๋ก๊น
ํ๊ฑฐ๋ ๋ฉ๋ชจ์ฅ์ ์ ์ง ์๊ณ Dockerfile๋ก ๊ด๋ฆฌํ ์ ์๋ค. ์ด ํ์ผ์ ์์ค์ ํจ๊ป ๋ฒ์ ๊ด๋ฆฌ๋๋ฉฐ ์ํ๋ค๋ฉด ๋๊ตฌ๋ ์ด๋ฏธ์ง ์์ฑ๊ณผ์ ์ ๋ณด๊ณ ์์ ํ ์ ์๋ค.
๋์ปค ์ด๋ฏธ์ง์ ์ฉ๋์ ๋ณดํต ๋ช ๋ฐฑ MB๋ก GB๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ํํ๋ค. ์ด๋ ๊ฒ ํฐ ์ฉ๋์ ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฝ์ง ์์๋ฐ ๋์ปค๋ Docker hub๋ฅผ ํตํด ๊ณต๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ฌด๋ฃ๋ก ๊ด๋ฆฌํด์ค๋ค.