A A
[Docker] Docker๋ฅผ ํ™œ์šฉํ•œ Ngnix Container ์„ค์ •, ๊ด€๋ฆฌ & Docker hub ๋ฐฐํฌ
์ด๋ฒˆ์—๋Š” Python Programming ํ™˜๊ฒฝ์„ Container๋กœ ์ œ๊ณตํ•ด ๋ณด๊ธฐ ์œ„ํ•œ ์‹ค์Šต์„ ํ•œ๋ฒˆ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Docker ์ปจํ…Œ์ด๋„ˆ์— Python ์ด๋ฏธ์ง€ ์„ค์น˜ ๋ฐ ์‹คํ–‰

 # ์ƒ˜ํ”Œ ์†Œ์Šค ์ฝ”๋“œ ์ž‘์„ฑ(๋กœ๋˜ ํ”„๋กœ๊ทธ๋žจ)
$ vi py_lotto.py
from random import shuffle
from time import sleep

gamenum = input('๋กœ๋˜ ๊ฒŒ์ž„ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: ')
for i in range(int(gamenum)):
    balls = [x+1 for x in range(45)]
    ret = []
    for j in range(6):
        shuffle(balls)             # balls๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ž๊ณ ,
        number = balls.pop()        # balls์˜ ์ œ์ผ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ œ๊ฑฐ
        ret.append(number)          # ์ถ”์ถœ๋œ ์ˆซ์ž๋ฅผ ret์— ์ถ”๊ฐ€
    ret.sort()
    print('๋กœ๋˜๋ฒˆํ˜ธ[%d]: ' % (i+1), end='')
    print(ret)
    sleep(1)
  • Python Container ์‹คํ–‰ ํ›„ py_lotto.py ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋จผ์ €, docker run ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด๋Š” python:latest ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ python_test๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. -p 8900:8900 ์˜ต์…˜์€ ํ˜ธ์ŠคํŠธ์˜ 8900๋ฒˆ ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 8900๋ฒˆ ํฌํŠธ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
toby@tobykakao:~$ docker run -it -d --name=python_test -p 8900:8900 python
Unable to find image 'python:latest' locally
latest: Pulling from library/python
c1e0ef7b956a: Already exists 
95b894d63c77: Pull complete 
cb5594266b1b: Pull complete 
59d4884f8528: Pull complete 
d2dab3c2913c: Pull complete 
19c44926628f: Pull complete 
8c7b7fcf5c89: Pull complete 
Digest: sha256:a31cbb4db18c6f09e3300fa85b77f6d56702501fcb9bdb8792ec702a39ba6200
Status: Downloaded newer image for python:latest
8d3a7836310293de69e69500c137324c5f71a4c75bb3733fe7d19044628016ad
  • ํŒŒ์ด์ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋œ ํ›„, Python ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, py_lotte.py๋ผ๋Š” ํŒŒ์ผ์„ python_test ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋‹ค์Œ, docker exec ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ python_test ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜๊ณ  Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
toby@tobykakao:~$ docker cp py_lotte.py python_test:/
Successfully copied 2.56kB to python_test:/

toby@tobykakao:~$ docker exec -it python_test bash
root@8d3a78363102:/# python
Python 3.13.0 (main, Oct 19 2024, 18:03:27) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
  • python ๊ด€๋ จ ๋„๊ตฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
root@8d3a78363102:/# pip list
Package Version
------- -------
pip     24.2
  • ํŒŒ์ด์ฌ ์ปจํ…Œ์ด๋„ˆ์— ์„ค์น˜๋œ ํŒŒ์ผ์˜ ๋ชจ๋“ˆ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
root@8d3a78363102:/# python -c 'help("modules")'

Please wait a moment while I gather a list of all available modules...

__future__          _stat               faulthandler        re
__hello__           _statistics         fcntl               readline
__phello__          _string             filecmp             reprlib
_abc                _strptime           fileinput           resource
_aix_support        _struct             fnmatch             rlcompleter
_android_support    _suggestions        fractions           runpy
_ast                _symtable           ftplib              sched
_asyncio            _sysconfig          functools           secrets
_bisect             _sysconfigdata__linux_aarch64-linux-gnu gc                  select
_blake2             _testbuffer         genericpath         selectors
_bz2                _testcapi           getopt              shelve
_codecs             _testclinic         getpass             shlex
_codecs_cn          _testclinic_limited gettext             shutil
_codecs_hk          _testexternalinspection glob                signal
_codecs_iso2022     _testimportmultiple graphlib            site
_codecs_jp          _testinternalcapi   grp                 smtplib
_codecs_kr          _testlimitedcapi    gzip                socket
_codecs_tw          _testmultiphase     hashlib             socketserver
_collections        _testsinglephase    heapq               sqlite3
_collections_abc    _thread             hmac                sre_compile
_colorize           _threading_local    html                sre_constants
_compat_pickle      _tkinter            http                sre_parse
_compression        _tokenize           idlelib             ssl
_contextvars        _tracemalloc        imaplib             stat
_csv                _typing             importlib           statistics
_ctypes             _uuid               inspect             string
_ctypes_test        _warnings           io                  stringprep
_curses             _weakref            ipaddress           struct
_curses_panel       _weakrefset         itertools           subprocess
_datetime           _xxtestfuzz         json                symtable
_dbm                _zoneinfo           keyword             sys
_decimal            abc                 linecache           sysconfig
_elementtree        antigravity         locale              syslog
_functools          argparse            logging             tabnanny
_gdbm               array               lzma                tarfile
_hashlib            ast                 mailbox             tempfile
_heapq              asyncio             marshal             termios
_imp                atexit              math                textwrap
_interpchannels     base64              mimetypes           this
_interpqueues       bdb                 mmap                threading
_interpreters       binascii            modulefinder        time
_io                 bisect              multiprocessing     timeit
_ios_support        builtins            netrc               tkinter
_json               bz2                 ntpath              token
_locale             cProfile            nturl2path          tokenize
_lsprof             calendar            numbers             tomllib
_lzma               cmath               opcode              trace
_markupbase         cmd                 operator            traceback
_md5                code                optparse            tracemalloc
_multibytecodec     codecs              os                  tty
_multiprocessing    codeop              pathlib             turtle
_opcode             collections         pdb                 turtledemo
_opcode_metadata    colorsys            pickle              types
_operator           compileall          pickletools         typing
_osx_support        concurrent          pip                 unicodedata
_pickle             configparser        pkgutil             unittest
_posixshmem         contextlib          platform            urllib
_posixsubprocess    contextvars         plistlib            uuid
_py_abc             copy                poplib              venv
_pydatetime         copyreg             posix               warnings
_pydecimal          csv                 posixpath           wave
_pyio               ctypes              pprint              weakref
_pylong             curses              profile             webbrowser
_pyrepl             dataclasses         pstats              wsgiref
_queue              datetime            pty                 xml
_random             dbm                 pwd                 xmlrpc
_sha1               decimal             py_compile          xxlimited
_sha2               difflib             py_lotte            xxlimited_35
_sha3               dis                 pyclbr              xxsubtype
_signal             doctest             pydoc               zipapp
_sitebuiltins       email               pydoc_data          zipfile
_socket             encodings           pyexpat             zipimport
_sqlite3            ensurepip           queue               zlib
_sre                enum                quopri              zoneinfo
_ssl                errno               random              

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".

root@8d3a78363102:/# exit 
exit
  • ์™ธ๋ถ€์—์„œ ํŒŒ์ด์ฌ ์ปจํ…Œ์ด๋„ˆ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
toby@tobykakao:~$ docker exec -it python_test python /py_lotte.py
\ub85c\ub610 \uac8c\uc784 \ud69f\uc218\ub97c \uc785\ub825\ud558\uc138\uc694: 5
\ub85c\ub610\ubc88\ud638[1]: [5, 15, 26, 35, 37, 45]
\ub85c\ub610\ubc88\ud638[2]: [2, 4, 5, 6, 16, 30]
\ub85c\ub610\ubc88\ud638[3]: [7, 14, 23, 24, 30, 44]
\ub85c\ub610\ubc88\ud638[4]: [9, 12, 15, 25, 32, 45]
\ub85c\ub610\ubc88\ud638[5]: [8, 15, 19, 40, 43, 44]

Container ๋‚ด๋ถ€์— ์†Œ์Šค์ฝ”๋“œ, ๊ตฌ์„ฑ ์ •๋ณด (conf)๋“ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ docker cp๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ngnix์˜ ๊ตฌ์„ฑํŒŒ์ผ์ธ ngnix.conf๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตณ์ด ์ปจ๋ฐ์ด๋„ˆ์— ํŽธ์ง‘๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋“ค์ด๊ฑฐ๋‚˜ ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฌด๊ฒ๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

docker run ๋ช…๋ น์–ด๋กœ Python ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰.
docker cp ๋กœ Python ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌ.
docker exec ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Python ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰.

Docker๋ฅผ ํ™œ์šฉํ•œ Nginx ์ปจํ…Œ์ด๋„ˆ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ ํŒŒ์ผ ๊ด€๋ฆฌ

Nginx Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Nginx ์„ค์ • ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•œ ๋’ค ์ˆ˜์ •ํ•˜์—ฌ ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ €, docker run ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. -p 8010:80 ์˜ต์…˜์€ ํ˜ธ์ŠคํŠธ์˜ 8010๋ฒˆ ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ์™€ ๋งคํ•‘ํ•˜์—ฌ, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8010์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

# nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ ๋‹ค.
toby@tobykakao:~$ docker run -d -p 8010:80 --name=webserver10 nginx:latest
0b423670cb26dfa30faea24f31c0539b7aa522fe017dc046deb69aeedbacbfa4

 

docker cp ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ Nginx ์„ค์ • ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŒŒ์ผ์€ /etc/nginx/nginx.conf ๊ฒฝ๋กœ์— ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋กœ์ปฌ์˜ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# nginx ์ปจํ…Œ์ด๋„ˆ์˜ nginx.conf๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•ด ์˜จ๋‹ค.
toby@tobykakao:~$ docker cp webserver10:/etc/nginx/nginx.conf ./nginx.conf
Successfully copied 2.56kB to /home/toby/nginx.conf

์ด ๋ช…๋ น์„ ํ†ตํ•ด nginx.conf ํŒŒ์ผ์ด ํ˜ธ์ŠคํŠธ์˜ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  nginx.conf ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ํ›„, ๋™์ผํ•œ ๊ฒฝ๋กœ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ค์‹œ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

# nginx ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‹ค์‹œ ์›๋ž˜ ์œ„์น˜์— ๋ณต์‚ฌํ•ด ์ค€๋‹ค.
toby@tobykakao:~$ docker cp nginx.conf webserver10:/etc/nginx/nginx.conf
Successfully copied 2.56kB to webserver10:/etc/nginx/nginx.conf

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ˆ˜์ •๋œ ์„ค์ • ํŒŒ์ผ์ด Nginx ์ปจํ…Œ์ด๋„ˆ์˜ ์›๋ž˜ ์œ„์น˜์— ๋ฎ์–ด์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Nginx ์„ค์ • ํŒŒ์ผ์„ ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. docker restart ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์•„๋ž˜์ฒ˜๋Ÿผ Nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด ์ƒˆ๋กœ์šด ์„ค์ •์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

# nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ด ์ค€๋‹ค.
toby@tobykakao:~$ docker restart webserver10
webserver10
docker run์„ ์‚ฌ์šฉํ•ด Nginx ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ.
docker cp๋กœ Nginx ์„ค์ • ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ๋กœ ๋ณต์‚ฌ.
์ˆ˜์ •๋œ ์„ค์ • ํŒŒ์ผ์„ ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌ.
docker restart๋กœ Nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ์„ค์ • ์ ์šฉ.

Node.js ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

Docker๋ฅผ ํ™œ์šฉํ•˜์—ฌ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Node.js ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , Docker ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•œ ํ›„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋จผ์ € nodejs_test.js๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , HTTP ์„œ๋ฒ„๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

# node.js ์ƒ˜ํ”Œ ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
toby@tobykakao:~$ vi nodejs_test.js
var http = require('http');
var content = function(req, resp) {
    resp.end("Good morning Korea~!" + "\n");
    resp.writeHead(200);
}

๋‹ค์Œ์œผ๋กœ Node.js Docker ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด docker pull node ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

# node ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
toby@tobykakao:~$ docker pull node
Using default tag: latest
latest: Pulling from library/node
c1e0ef7b956a: Already exists 
95b894d63c77: Already exists 
cb5594266b1b: Already exists 
59d4884f8528: Already exists 
dfd6b1d2546c: Pull complete 
a4ac632c2863: Pull complete 
0ce2f898cccf: Pull complete 
478f75ada764: Pull complete 
Digest: sha256:840dad0077213cadd2d734d542ae11cd0f648200be29504eb1b6e2c995d2b75a
Status: Downloaded newer image for node:latest
docker.io/library/node:latest

Node.js ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. -p 8002:8002 ์˜ต์…˜์„ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ์˜ 8002 ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 8002 ํฌํŠธ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

# ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ ํ›„ ์‹คํ–‰ํ•œ๋‹ค.
toby@tobykakao:~$ docker run -d -it -p 8002:8002 --name=nodejs_test node
bb75f81042af805aebb73c63757adb595d5c308255650cd6126c164f9b0b1b45

toby@tobykakao:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
bb75f81042af   node           "docker-entrypoint.s\u2026"   4 seconds ago    Up 3 seconds    0.0.0.0:8002->8002/tcp, :::8002->8002/tcp   nodejs_test
0b423670cb26   nginx:latest   "/docker-entrypoint.\u2026"   5 minutes ago    Up 3 minutes    0.0.0.0:8010->80/tcp, [::]:8010->80/tcp     webserver10
8d3a78363102   python         "python3"                21 minutes ago   Up 21 minutes   0.0.0.0:8900->8900/tcp, :::8900->8900/tcp   python_test

๊ทธํ›„, ์ž‘์„ฑํ•œ nodejs_test.js ํŒŒ์ผ์„ docker cp ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nodejs_test ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

# ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ ํ›„ ์‹คํ–‰ํ•œ๋‹ค.
toby@tobykakao:~$ docker cp nodejs_test.js nodejs_test:/nodejs_test.js
toby@tobykakao:~$ docker exec -it nodejs_test node /nodejs_test.js

์œ„์—์„œ ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์ด nodejs_test์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด docker rename์„ ์ด์šฉํ•ด์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ด€๋œ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, ์ปจํ…Œ์ด๋„ˆ์˜ ์‹คํ–‰๊ณผ ์ƒ๊ด€์—†์ด ๋™์  ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

# ๋ฐฉ์‹: docker rename <๊ธฐ์กด์˜ Container๋ช…> <์ƒˆ๋กœ์šด Container๋ช…>
toby@tobykakao:~$ docker rename nodejs_test nodeapp
toby@tobykakao:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
bb75f81042af   node           "docker-entrypoint.s\u2026"   8 minutes ago    Up 8 minutes    0.0.0.0:8002->8002/tcp, :::8002->8002/tcp   nodeapp
0b423670cb26   nginx:latest   "/docker-entrypoint.\u2026"   14 minutes ago   Up 12 minutes   0.0.0.0:8010->80/tcp, [::]:8010->80/tcp     webserver10
8d3a78363102   python         "python3"                30 minutes ago   Up 30 minutes   0.0.0.0:8900->8900/tcp, :::8900->8900/tcp   python_test

docker commit์€ ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ node ํ”„๋กœ๊ทธ๋žจ ํ™˜๊ฒฝ๊ณผ ์ €์žฅํ•œ ์†Œ์Šค ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, docker commit์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด๋ฏธ์ง€๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € nginx:latest ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด Nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

toby@tobykakao:~$ docker run -it --name webserver8 -d -p 8008:80 nginx:latest
4bd32b7f867b4d6665d94fc5761a4840c96dc4566a0d3662b66854fad60459a5
toby@tobykakao:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
4bd32b7f867b   nginx:latest   "/docker-entrypoint.\u2026"   13 seconds ago   Up 12 seconds   0.0.0.0:8008->80/tcp, [::]:8008->80/tcp     webserver8
bb75f81042af   node           "docker-entrypoint.s\u2026"   10 minutes ago   Up 10 minutes   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp   nodeapp
0b423670cb26   nginx:latest   "/docker-entrypoint.\u2026"   15 minutes ago   Up 13 minutes   0.0.0.0:8010->80/tcp, [::]:8010->80/tcp     webserver10
8d3a78363102   python         "python3"                31 minutes ago   Up 31 minutes   0.0.0.0:8900->8900/tcp, :::8900->8900/tcp   python_test

๋จผ์ € nginx:latest ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด Nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

# index.html ํŒŒ์ผ ์ˆ˜์ •
toby@tobykakao:~$ vi index.html

# curl localhost:8008์„ ํ†ตํ•ด ์ •์ƒ ๋™์ž‘์„ ํ™•์ธํ•œ๋‹ค.
toby@tobykakao:~$ curl localhost:8008
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

๊ทธํ›„, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ index.html ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ŠคํŠธ์—์„œ ์ˆ˜์ •ํ•œ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋„์ปค cp ๋ช…๋ น์–ด๋กœ ํŒŒ์ผ ๋ณต์‚ฌ
toby@tobykakao:~$ docker ps index.html webserver8:/usr/share/nginx/html/index/html
"docker ps" accepts no arguments.
See 'docker ps --help'.

Usage:  docker ps [OPTIONS]

List containers

์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€, ์‚ญ์ œ, ๋˜๋Š” ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด docker diff ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ C๋Š” ๋ณ€๊ฒฝ๋จ, A๋Š” ์ถ”๊ฐ€๋จ, D๋Š” ์‚ญ์ œ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

# ์ถ”๊ฐ€๋œ ์›น ์†Œ์Šค ๋ณ€๊ฒฝ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด docker diff(difference) ๋ช…๋ น์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค.
# docker diff๋Š” ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์ •๋ณด๋ฅผ ์ถ”์ ํ•œ๋‹ค.
# ์•ž ์—ด์˜ ํ‚ค์›Œ๋“œ๋Š” A(์ถ”๊ฐ€), D(์‚ญ์ œ), C(๋ณ€๊ฒฝ)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
toby@tobykakao:~$ docker diff webserver8
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run

๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด Docker ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด docker commit ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -a ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# docker commit์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ -a(author)๋Š” ์ƒ์„ฑํ•œ ์‚ฌ๋žŒ์˜ ์ด๋‹ˆ์…œ์ด๋‹ค.
toby@tobykakao:~$ docker commit -a "kakao" webserver8 webfront:1.0
sha256:09366d99740ca4b93678281409da85a04376a544a4f5fee5d5b842b57ee076fe

# ์ด๋ฏธ์ง€ ํ™•์ธ
toby@tobykakao:~$ docker images | grep webfront
webfront                1.0       09366d99740c   24 seconds ago   197MB
toby@tobykakao:~$

์ด๋ฏธ์ง€๋ฅผ Docker Hub์— ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € Docker Hub์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. Docker Hub์— ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ curl ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# ๋ณธ์ธ์˜ ๋„์ปค ํ—ˆ๋ธŒ ์ €์žฅ์†Œ์— ์˜ฌ๋ ค๋ณธ๋‹ค.
toby@tobykakao:~$ docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /home/toby/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

toby@tobykakao:~$ docker tag webfront:1.0 daehyunbigbread/webfront:1.0

toby@tobykakao:~$ docker push daehyunbignread/webfront:1.0
The push refers to repository [docker.io/daehyunbignread/webfront]
An image does not exist locally with the tag: daehyunbignread/webfront

# ํ‘ธ์‹œํ•œ ์ด๋ฏธ์ง€๋กœ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.
toby@tobykakao:~$ docker run -it --name webserver9 -d -p 8009:80 ๋ณธ์ธID/webfront:1.0
toby@tobykakao:~$ curl localhost:8009
Node.js ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌ.
docker pull์„ ํ†ตํ•ด Node.js ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ.
docker run์œผ๋กœ Node.js ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํฌํŠธ๋ฅผ ๋งคํ•‘.
์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰.
Nginx ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ํŒŒ์ผ ์ˆ˜์ •.
docker diff ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ.
๋ณ€๊ฒฝ๋œ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ์ปค๋ฐ‹.
Docker Hub์— ์ด๋ฏธ์ง€ ํ‘ธ์‹œ.
ํ‘ธ์‹œํ•œ ์ด๋ฏธ์ง€๋กœ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธ.