2021-03-18 Docker Image 생성 및 배포과정 실습
Docker에서 Dockerfile 을 이용해 Container image를 생성하고
어떻게 배포하는지 과정을 살펴본다.
DockerHub
를 통해 형상관리 및 배포가 가능함.docker ps
실행중인 Container들을 확인. (-a option : 종료된 container들까지 확인 가능.)docker image ls
or docker images
Local repository에 존재하는 docker image들 확인.docker search [image]
DockerHub에 있는 image 검색.docker create [option] [image명]
컨테이너 생성.(image가 저장소에 있어야만 가능)(생성만 함. run은 생성하고 실행까지.)(--name option : container에게 별칭 부여)docker start [option] [container 별칭 or container ID]
컨테이너 실행.docker stop [container ID]
컨테이너 종료.docker attach [option] [container 별칭]
실행되고 있는 container에 접근할 때 사용.docker run [option] [container 별칭 or container ID]
이미지가 존재하지 않으면 DockerHub에서 image pull 한 뒤, 컨테이너를 실행시킨다.docker build --tag "[태그명]" [dockerfile 위치]
dockerfile 을 이용하여 image 생성.docker exec [option] container명 command
주로 동작중인 container shell에 접근할 때 사용. (ex: docker exec -it 컨테이너명 /bin/bash) docker rm container명
Container를 삭제.docker rmi container이미지명
Container image를 삭제.docker rmi $(docker images -f "dangling=true" -q)
: 과 같이 오류로 image명이 없는 것들을 삭제.)docker logs container명
Container에 문제가 생겼을 경우, 확인하는 log.FROM [--platform=<platform>] <images> [AS <name>]
RUN <command>
(기본적으로 linux 에서는 /bin/sh 로 실행.)RUN ['executable', 'param1', 'param2']
CMD ['executable', 'param1', 'param2']
CMD ['param1', 'param2']
CMD command param1 param
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>
ADD [--chown=<user>;<group>]<src>...<dest>
docker login
docker tag [이미지명] [DockerHub ID]/[repository 명]:[태그명]
docker push [DockerHub ID]/[repository 명]:[태그명]
docker pull [DockerHub ID]/[repository 명]:[태그명]
docker pull nginx
docker images | grep nginx
{: width="60%" height="60%"}
nginx-test
로 정한 후 port 80 으로 가동.docker run --name nginx-test -d -p 8080:80 nginx
(-d : run background, -p : publish (port 지정))docker ps | grep nginx
docker stats nginx-test --no-stream
(--no-stream : 상태 한번 띄우고 종료.(not waited))curl http://localhost:8080
docker exec -it nginx-test /bin/bash
cat /usr/share/nginx/html/index.html
test directory 생성 후, time.py
, Dockerfile
, requirement
file 작성. (기능 : 현재 시간을 반환해주는 web server)
time.py
from flask import Flask, request
import datetime
app = Flask(__name__)
def get_cur_time():
return str(datetime.datetime.now()) + "\n"
@app.route("/",methods=["POST", "GET"])
def main():
if request:
return get_cur_time()
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8888, threaded=True)
Dockerfile
FROM centos:7
RUN yum update -y && yum install -y python3 \
python3-pip
COPY ./requirement.txt /app/requirement.txt
WORKDIR /app
RUN python3 -m pip install pip --upgrade
RUN pip3 install -r requirement.txt
COPY . /app
CMD ["python3","time.py"]
requirement.txt
flask
docker build --tag time:1.0 .
(--tag option으로 이미지명 뒤에 : 을 붙여 version을 명시할 수 있음.) (명시하지 않으면 자동으로 latest로 설정됨.)docker images | grep time
docker run --name time-web -d -p 8888:8888 time:1.0
docker ps | grep time
(만약, ps에서 안뜨고 ps -a (종료된 상태) 로 검색된다면 오류. docker logs를 살펴보거나 test directory 하위 파일들의 문법오류를 check.) curl http://127.0.0.1:8888
정리해보자면,
1. docker build --tag 이미지명:version .
으로 이미지를 생성.(현재 test dir 의 Dockerfile, time.py, requirement.txt 를 기반으로)
2. docker run
해서 docker 이미지 기반으로 container가 실행됨.
3. docker ps | grep 컨테이너명
으로 잘 돌아가고 있는지 확인.
4. curl http://127.0.0.1:8888
으로 time-web 컨테이너의 작동을 직접 확인.
잘 되지 않는 경우 docker logs 컨테이너명
으로 로그 확인하여 에러 해결.
다음시간에는, 만든 image를 DockerHub 에 배포하고 Kubernetes를 통해 다른 Worker node에 배포해 보는 작업을 해 볼 것이다.