순서는 다음과 같이 실습하겠습니다.
참고 : https://docs.docker.com/compose/install/
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
참고 : https://docs.docker.com/compose/gettingstarted/
$ mkdir composetest
$ cd composetest
$ cat > app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
$ cat > requrements.txt
flask
redis
$ cat > dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
$ cat > docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
$ docker-compose up
새로고침을 할때마다 바뀌는 것을 확인할 수 있습니다.
만약 다음과 같은 오류가 발생하면 dns 문제일수도 있습니다.
[root@docker composetest]# docker-compose up
Building web
Sending build context to Docker daemon 5.632kB
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
a0d0a0d46f8b: Pull complete
c11246b421be: Pull complete
c5f7759615a9: Pull complete
6dc4dde3f226: Pull complete
9928d5d652ca: Pull complete
Digest: sha256:68dc2f52411f1071069a75c00029a0620d98139d638153cd33d029cf9810c8d6
Status: Downloaded newer image for python:3.7-alpine
---> 4d1c95b3db1c
Step 2/10 : WORKDIR /code
---> Running in f82a30d1fc05
Removing intermediate container f82a30d1fc05
---> 46c3125d0b44
Step 3/10 : ENV FLASK_APP=app.py
---> Running in 2a5bf523d475
Removing intermediate container 2a5bf523d475
---> 49729e81d96d
Step 4/10 : ENV FLASK_RUN_HOST=0.0.0.0
---> Running in 2c6d2dec6f3c
Removing intermediate container 2c6d2dec6f3c
---> fb79d97be29b
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in db5dd0fa3780
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/main: temporary error (try again later)
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/community: temporary error (try again later)
ERROR: unable to select packages:
gcc (no such package):
required by: world[gcc]
linux-headers (no such package):
required by: world[linux-headers]
musl-dev (no such package):
required by: world[musl-dev]
The command '/bin/sh -c apk add --no-cache gcc musl-dev linux-headers' returned a non-zero code: 3
ERROR: Service 'web' failed to build : Build failed
먼저 dns 문제인지 한번 더 확인을 해봅니다.
$ docker run busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
dns가 문제가 있다면
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 168.126.63.1
IP4.DNS[2]: 8.8.8.8
여기서 리스트업 되는 dns 주소들을 /etc/docker/daemon.json 파일에 넣어줍니다.
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
docker를 재실행해줍니다.
systemctl restart docker
제가 겪은 문제를 해결한 방식으로 다른 문제일 수도 있습니다.
$ docker-compose down
도커 컴포즈를 제거후 아래 실습을 진행하겠습니다.
(stop 명령어로 중지시킬 수 있습니다.)
docker-compose.yml 파일에 볼륨 명령어를 추가하겠습니다.
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
그리고 다시
$ docker-compose up -d
명령어로 백그라운드에서 재빌드하겠습니다.
사이트로 접속해보면 다시 만들었기 때문에 다음과 같은 화면이 뜹니다.
저희는 볼륨 마운트를 해놨기 때문에 app.py 파일에서
Hello World를 Hello Docker로 바꾸고 저장을 한뒤 다시 사이트에서 새로고침을 눌러보면
바로 적용되었음을 확인할 수 있습니다.
$ docker-compose ps
명령어로 현재 동작중인 도커 컴포즈를 확인할 수 있습니다.
$ docker-compose scale redis=3
명령어로 입력해주면
다음과 같이 reids가 3개로 늘어났음을 확인할 수 있습니다.
scale 명령어로 줄일 수도 있습니다.
하지만 포트포워딩하고 있는 web은 포트가 충돌하기 때문에 확장할 수 없습니다.
$ docker-compose down --volumes
명령어로 도커 컴포즈를 지울 때 볼륨까지 같이 지울 수 있습니다.
3번째 실습은 다음 장에서 진행하겠습니다.