TIL 64: [λ°°ν¬] Docker
μ€λμ Dockerλ₯Ό μ¬μ©ν΄μ λ μ§μ€νΈλ¦¬ μμ μλ μ΄λ―Έμ§λ₯Ό ν΅ν΄ 컨ν μ΄λλ₯Ό μμ±ν΄λ³΄μμ΅λλ€. λν λ κ° μ΄μμ μ΄λ―Έμ§λ₯Ό λ€λ£¨λ λ°©μμ 곡λΆνμ΅λλ€. μ΄μ μλ AMIμμ Image μ λλ§ μ νμ΄μ μ΄λ―Έμ§λΌλ λ¨μ΄λ₯Ό μ½μΌλ©΄ μ¬μ§μ λ¨Όμ λ μ¬λ Έμλλ°, μ€μ΅κΉμ§ νλ μ΄μ μ΄λ―Έμ§λ₯Ό μ½μΌλ©΄ λ¨Όμ 컨ν μ΄λλ₯Ό μμ±ν λ μ¬μ©λλ ν νλ¦Ώμ λ μ¬λ¦¬κ² λλ κ² κ°μ΅λλ€! π
컨ν μ΄λ
컨ν μ΄λλ μ ν리μΌμ΄μ μ΄ μμ‘΄μ±, λ€νΈμν¬ νκ²½, νμΌ μμ€ν κ³Ό κ°μ΄ μ€ννκ²½μ ꡬμ λ°μ§ μκ³ , λ컀λΌλ κΈ°μ μμ μ€νλ μ μλλ‘ λ§λ μ ν리μΌμ΄μ μμμ λλ€.
컨ν μ΄λ λ°©μμ μ₯μ
μμ‘΄μ± μΆ©λ λ¬Έμ ν΄κ²°
컨ν μ΄λλ νλ‘μΈμ€, λ€νΈμν¬, νμΌ μμ€ν μ 격리νκ³ λ 립μ μΌλ‘ μμ ν©λλ€.
μ¬κΈ°μ νλ‘μΈμ€λ μ€ν μ€μΈ νλ‘κ·Έλ¨μΌλ‘ νΉμ 컨ν μ΄λμμ μλνλ νλ‘μΈμ€λ κΈ°λ³Έμ μΌλ‘ κ·Έ 컨ν μ΄λ μμμλ§ μ‘μΈμ€ ν μ μμ΅λλ€. 컨ν μ΄λ μμμ μ€νλλ νλ‘μΈμ€λ λ€λ₯Έ 컨ν μ΄λ νλ‘μΈμ€μκ² μν₯μ μ€ μ μμ΅λλ€.
λ€νΈμν¬λ κΈ°λ³ΈμΌλ‘ 컨ν μ΄λ νλμ νμ IP μ£Όμκ° ν λΉλμ΄ μμ΅λλ€.
νμΌ μμ€ν μ ꡬνν λμ΄μμ΄ μ»¨ν μ΄λμμμ λͺ λ Ήμ΄λ νμΌ λ±μ μ‘μΈμ€λ₯Ό μ νν μ μμ΅λλ€.
컨ν μ΄λλ κ°μλ¨Έμ (Virtual Machine, VM)κ³Ό λΉμ·ν©λλ€. VMμ νλμ νΈμ€νΈ μ»΄ν¨ν° μμ μ¬λ¬ κ°μ λ 립μ μΈ μ»΄ν¨ν°κ° μλν μ μκ² νλ κΈ°μ μ λλ€. νλ‘μΈμ€, λ€νΈμν¬, νμΌ μμ€ν μ 격리ν μ μλ€λ μ₯μ μ 컨ν μ΄λμ λμΌνμ§λ§, VMμ λ§λ€κ³ μ€ννλ κ³Όμ μμ λ§μ μ»΄ν¨ν μμμ νμλ‘ ν©λλ€. λν VMμμ μ΄μ체μ λ₯Ό λ°λμ μ€μΉν΄μΌ ν©λλ€. λ°λ©΄, Dockerλ ν νΈμ€νΈ μ»΄ν¨ν°μ μ¬λ¬ κ°μ 컨ν μ΄λλ₯Ό λμλ ν¬κ² μ»΄ν¨ν°μ λ¬΄λ¦¬κ° κ°μ§ μμ΅λλ€. κ·Έλ¦¬κ³ Docker Imageλ μ£Όλ‘ μ ν리μΌμ΄μ λ¨μλ‘ λ§λ€μ΄μ Έ μμ΅λλ€.
μ°Έκ³ λ‘ AMIλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μ VMμ ν΄λΉν©λλ€.
VMμμμ Hypervisorμ μμλ‘λ VMware, VirtualBox, Hyper-V λ±μ΄ μμ΅λλ€.
κ°λ°κ³Ό λ°°ν¬ νκ²½ μΌμΉ
OSμ μκ΄μμ΄ μ¦μ μ ν리μΌμ΄μ μ€ν νκ²½μ λ§λ€ μ μμ΅λλ€.
κ°λ°μ 컨ν μ΄λ μμμ μ§νν κ²½μ°, λͺ¨λ κ°λ°νμ΄ λμΌν νκ²½ νμ κ°λ°μ μ§νν μ μμ΅λλ€.
λ°°ν¬ λν μλ²κ° 컨ν μ΄λμ λ΄κΈ΄ μ ν리μΌμ΄μ μ μ€ννλ λ°©μμΌλ‘ μλΉμ€λ₯Ό μ 곡ν¨μ λ°λΌ OSκ° λ¬λΌλ μ μ€νλ μ μμ΅λλ€. AWSμ EC2 μμ λ컀λ₯Ό μ€μΉνκ±°λ, λ컀 컨ν μ΄λλ₯Ό EC2 μλ²μμ μ€νν μ μκ² νλ μλΉμ€μΈ ECSλ₯Ό μ΄μ©νμ¬ λ³΄λ€ μ½κ² μ ν리μΌμ΄μ μ λ°°ν¬ν μ μμ΅λλ€.
μν νμ₯ μ©μ΄ & μλ‘μ΄ λ΄μ©μ λ°°ν¬
μλ§μ μ¬λλ€μ΄ μ΄μ©νλ μλΉμ€μ κ²½μ° νλμ μλ²λ§μΌλ‘ νΈλν½μ κ°λΉν μ μμ΅λλ€. λ°λΌμ μλΉμ€ μ 곡μλ€μ μ΄λ¬ν νΈλν½ λΆμ°μ μν΄ νλ‘μ μλ²λ₯Ό μ΄μνλ©°, νλ‘μ μλ²λ μ¬λ¬ λμ λμΌν μλ² μ€ ν κ΅°λ°λ₯Ό μ΄μ©ν μ μλλ‘ λμ΅λλ€. μ΄λ¬ν μλ²λ₯Ό 리λ²μ€ νλ‘μμ ν μ’ λ₯μΈ, κ·Έλ¦¬κ³ μ΄μ 곡λΆνλ λ‘λ λ°Έλ°μλΌκ³ λΆλ¦ λλ€. λμΌν μλΉμ€κ° μ¬λ¬ μ»΄ν¨ν°μμ μλν μ μλ μ΄μ λ 컨ν μ΄λ κΈ°μ μ μ₯μ μΈ μ€ν νκ²½μ μΌμΉ λλ¬Έμ λλ€. μΏ λ²λ€ν°μ€μ κ°μ΄ μ€μΌμ€νΈλ μ΄μ λꡬλΌκ³ λΆλ₯΄λ κ²λ€μ΄ 컨ν μ΄λ κΈ°μ μ νμ©ν΄μ μ¬λ¬ μλ² μ€ λͺ λμλ§ μ΄μνμ¬ ν μ€νΈλ₯Ό νκ³ , μ λ²μ μ μ ν리μΌμ΄μ μμ λ°μν μ μλ λ¬Έμ λ€μ 미리 νμΈνκ³ , μ΄λ¬ν λ¬Έμ κ° μ¬μ©μ μ 체μκ² λΌμΉμ§ μλλ‘ λ§λ€ μ μκ² ν΄μ£Όλ λꡬμ λλ€.
μ΄λ―Έμ§μ λ μ§μ€νΈλ¦¬
μ€νλλ λͺ¨λ 컨ν μ΄λλ μ΄λ―Έμ§λ‘λΆν° μμ±λ©λλ€. μ΄λ―Έμ§λ μ ν리μΌμ΄μ λ° μ ν리μΌμ΄μ ꡬμ±μ ν¨κ» λ΄μλμ ν νλ¦ΏμΌλ‘, μ΄λ₯Ό μ΄μ©ν΄ ν κ° νΉμ μ¬λ¬ κ°μ 컨ν μ΄λλ₯Ό μμ±ν μ μμ΅λλ€. μ΄λ―Έμ§λ κΈ°λ³Έ μ΄λ―Έμ§λ‘λΆν° λ³κ²½ μ¬νμ μΆκ°/컀λ°ν΄μ λ λ€λ₯Έ μ΄λ―Έμ§λ₯Ό λ§λ€ μλ μμ΅λλ€.
λ μ§μ€νΈλ¦¬μλ μ΄λ―Έμ§κ° μ μ₯λ©λλ€. Docker Hub, Amazon ECR λ±μ΄ μμ΅λλ€. λ컀 CLIμμ μ΄λ―Έμ§λ₯Ό μ΄μ©ν΄ 컨ν μ΄λλ₯Ό μμ±ν λ, νΈμ€νΈ μ»΄ν¨ν°(λ‘컬)μ μ΄λ―Έμ§κ° μ‘΄μ¬νμ§ μλλ€λ©΄, κΈ°λ³Έ λ μ§μ€νΈλ¦¬λ‘λΆν° λ€μ΄λ‘λ(pull)λ₯Ό λ°κ²λ©λλ€.
Docker CLI
docker image pull
docker image pull docker/whalesay:latest
μμ κ°μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ Docker Hubμ΄λΌλ λ μ§μ€νμμ dockerλΌλ μ μ κ° λ±λ‘ν whalesay μ΄λ―Έμ§ νΉμ λ ν¬μ§ν 리μμ latest νκ·Έλ₯Ό κ°μ§ μ΄λ―Έμ§λ₯Ό λ°μμ΅λλ€.
docker container run [options]
docker container run --name 컨ν
μ΄λμ΄λ¦ docker/whalesay:latest cowsay boo~~~
μμ λͺ λ Ήμ΄λ λ°μμ¨ μ΄λ―Έμ§λ₯Ό μ€ννμ¬ μ»¨ν μ΄λμ΄λ¦μ μ΄λ¦μΌλ‘ κ°λ 컨ν μ΄λλ₯Ό μ€νν©λλ€. μ΄λ―Έμ§κ° λ‘컬μ μ‘΄μ¬νμ§ μλλ€λ©΄ μλμΌλ‘ ν΄λΉ μ΄λ―Έμ§λ₯Ό λ€μ΄λ‘λ(pull)λ₯Ό ν©λλ€. λν 컨ν μ΄λ μ€ν μ boo~~~λΌλ νλΌλ―Έν°λ₯Ό cowsay λͺ λ Ήμ΄μ λκ²¨μ£Όμ΄ νΈμΆν©λλ€. κ·ΈλΌ μλμ κ°μ΄ boo~~~κ° μΆλ ₯λλ©° κ³ λλͺ¨μμ΄ λμ€κ² λ©λλ€.
μ΄λ―Έμ§λ₯Ό μ€νν λ --rm μ΅μ μ λ£μ΄μ£Όλ©΄ 컨ν μ΄λλ₯Ό μΌνμ±μΌλ‘ μ€νν μ μμ΅λλ€. 컨ν μ΄λκ° μ€μ§λκ±°λ μ’ λ£λ λ, 컨ν μ΄λμ κ΄λ ¨λ 리μμ€λ₯Ό λͺ¨λ μ κ±°ν©λλ€. μ΄λ―Έμ§λ₯Ό ν΅ν΄ λ§λ 컨ν μ΄λλ₯Ό λͺ¨λ μμ νμ§ μμλ€λ©΄, μ΄λ―Έμ§λ₯Ό μμ ν μ μμ΅λλ€.
docker container run -it --rm danielkraic/asciiquarium:latest
μμ λͺ λ Ήμ΄λ₯Ό μ€ννλ©΄ μλμ κ°μ μμ‘±κ΄μ΄ λμ¬ μλ μμ΅λλ€. μ¬κΈ°μ -itλ -iμ -tλ₯Ό λμμ μ¬μ©ν μ΅μ μΌλ‘, μ¬μ©μμ 컨ν μ΄λ κ°μ μΈν°λ μ μ΄ νμν κ²½μ° μ΄ μ΅μ μ μ¬μ©ν©λλ€.
μμ λ§νλ κ²μ²λΌ κΈ°μ‘΄μ μ΄λ―Έμ§μ 컀λ°/μΆκ°ν΄μ λ λ€λ₯Έ μ΄λ―Έμ§λ₯Ό λ§λ€ μ μμ΅λλ€. μ΄λ²μλ μ΄ λ°©λ²μ λν΄ μμ보λλ‘ νκ² μ΅λλ€. λ‘컬μ μ μ₯λ νμΌκ³Ό ν¨κ» λ컀 μ΄λ―Έμ§λ₯Ό μ΄μ©ν κ²μ λλ€.
docker container run --name 컨ν
μ΄λ_μ΄λ¦ -p 818:80 httpd
httpd(http daemon)μ΄λΌλ λ컀 μ΄λ―Έμ§λ₯Ό μ¬μ©νκΈ° μν΄μλ μμ κ°μ λͺ λ Ήμ΄λ₯Ό μ΄μ©ν©λλ€. μ¬κΈ°μ httpdλ Apache HTTP Serverλ₯Ό μ€νν μ μλ μ€νμμ€ μΉ μλ² μννΈμ¨μ΄λ‘ μ μ μΉμ¬μ΄νΈ νΈμ€ν μ μν΄ λ§λ€μ΄μ‘μ΅λλ€. -p μ΅μ μ λ‘컬νΈμ€νΈμ ν¬νΈμ 컨ν μ΄λμ ν¬νΈλ₯Ό μ°κ²°ν©λλ€. 818ν¬νΈκ° λ‘컬νΈμ€νΈμ ν¬νΈμ΄κ³ , 80λ²μ 컨ν μ΄λμ ν¬νΈμ λλ€. μ΄λ κ² λͺ λ Ήμ΄λ₯Ό μ€νν ν 127.0.0.1:818 νΉμ localhost:818μ ν΅ν΄ μΉμλ²κ° μλνκ³ μλμ§ νμΈν μ μμ΅λλ€.
docker container cp
docker container cp ./ 컨ν
μ΄λ_μ΄λ¦:/usr/local/apache2/htdocs/
μλ²κ° μ μμ μΌλ‘ μ΄λ €μλ€λ©΄ μμ λͺ λ Ήμ΄λ₯Ό μ€νν¨μΌλ‘μ¨ μ κ²½λ‘μ νμΌμ λ€ κ²½λ‘μ 볡μ¬ν©λλ€.
μ΄λ κ² κΈ°μ‘΄μ μ΄λ―Έμ§μ μλ‘μ΄ νμΌμ μΆκ°ν 컨ν μ΄λλ₯Ό μ΄λ―Έμ§ νμΌλ‘ λ³νν μ μμ΅λλ€. μ΄λ΄ κ²½μ° μ΄μ μ μμ νλ λ΄μ©μ λ€μ μννμ§ μμλ λλ©° λ°°ν¬ λ° κ΄λ¦¬κ° μ μ©ν΄μ§λλ€. ν¬κ² commitκ³Ό build, μ΄λ κ² λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
docker container commit
docker container commit 컨ν
μ΄λ_μ΄λ¦ μ΄λ―Έμ§_μ΄λ¦:νκ·Έ
docker run --name 컨ν
μ΄λ_μ΄λ¦ -p 900:80 μ΄λ―Έμ§_μ΄λ¦:νκ·Έ
첫λ²μ§Έ μ€ λͺ λ Ήμ΄μμμ commitμ νμ©νμ¬ νμ¬ μ»¨ν μ΄λλ₯Ό μ΄λ―Έμ§λ‘ μ μ₯ν©λλ€. μ΄ν λ§λ μ΄λ―Έμ§λ₯Ό λλ²μ§Έ μ€ λͺ λ Ήμ΄λ₯Ό νμ©ν΄μ μλ‘μ΄ μ»¨ν μ΄λλ₯Ό λ§λ€μ΄ 900ν¬νΈλ‘ λ‘컬νΈμ€νΈμ ν¬νΈλ₯Ό μ°κ²°ν©λλ€.
docker container build
docker build --tag 컨ν
μ΄λ_μ΄λ¦ μ΄λ―Έμ§_μ΄λ¦:νκ·Έ
docker run --name 컨ν
μ΄λ_μ΄λ¦ -p 901:80 μ΄λ―Έμ§_μ΄λ¦:νκ·Έ
buildλ₯Ό μ΄μ©ν΄μ 컨ν μ΄λλ₯Ό μ΄λ―Έμ§λ‘ μ μ₯ν μ μμ΅λλ€.
docker exec
dcker exec -it 컨ν
μ΄λ_μ΄λ¦ bash
μμ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ 컨ν μ΄λ μμμ bash shellμ μ€νν μ μμ΅λλ€. shell μμμ nano μλν°λ₯Ό νμ©ν΄μ νμΌμ μμ ν μλ μμ΅λλ€.
docker-compose CLI
λ κ° μ΄μμ Docker Imageλ₯Ό λ€λ£¨κ³ μΆμ λ μ¬μ©ν©λλ€. λ¨Όμ docker-compose.yaml νμΌ μμ λ€μκ³Ό κ°μ΄ μμ±ν©λλ€.
version: '3.8'
services:
nginx:
image: sebcontents/client
restart: 'always'
ports:
- "8080:80"
container_name: client
node:
image: sebcontents/server
restart: 'always'
ports:
- "5000:3000"
container_name: server
μ΄ν μλμ κ°μ λͺ λ Ήμ΄λ€μ μ€νν μ μμ΅λλ€.
docker-compose up -d #docker-compose.yamlμ μ μλ μ΄λ―Έμ§λ₯Ό λ°±κ·ΈλΌμ΄λλ‘ μ»¨ν
μ΄λλ₯Ό μ€νν©λλ€.
docker-compose down #docker-compose.yamlμ μ μλμ΄λ―Έμ§λ₯Ό μ΄μ©ν΄ μ€νλ 컨ν
μ΄λλ₯Ό μ’
λ£ν©λλ€.
docker-compose up {νΉμ μ΄λ―Έμ§} #νΉμ μ΄λ―Έμ§λ§ 컨ν
μ΄λλ‘ μ€νν©λλ€.