본문 바로가기

Linux/Docker

[Docker] Docker 시작하기. 예제를 하나 만들고 실행해보자

Docker과 무엇을 의미하는지, container와 image의 개념은 무엇인지에 대한 기본 내용은 이전 글에서 다루었으니 docker가 뭔지 모르시겠는 분들은 그 글을 참고하시고 이 글은 code를 base로 진행할게요.


Docker을 시작하시는 분들은 기본적인 리눅스 명령어, pip 을 이용한 설치, 삭제 과정은 아시리라 가정하고 설명할게요.



▼ 이전 글

[Docker] Docker 시작하기. Docker란? Docker와 Container의 개념에 대하여


● 흐름


1. app.py라는 이름으로 테스트해볼 프로그램을 작성한다. ( 필요한 python modules는 install 한다 )

2. app.py가 잘 작동되는지 확인한다. 

3. pip uninstall 을 통해 app.py를 실행시키는데 필요한 모듈을 삭제해본다.

4. python을 실행시키고 module이 삭제되었는지 확인해본다.

5. 삭제되었으면 app.py를 실행시켜도 모듈이 없다며 오류가 나야한다.

6. 내 컴퓨터에서는 app.py가 실행이 안되는 상태에서

requirements.txt와 Dockerfile을 생성한다.

7. docker build를 통해 image를 빌드한다

8. build된 image를 이용해 docker run 한다.

9. 성공적으로 프로그램이 실행된다.


app.py 는


* 실행된 python의 version을 출력한다.

* 제 Docker Tutorial 글에 접속하는 http request 를 보내고, 그 페이지의 게시글의 제목을 따오는 크롤러 입니다. BeautifulSoup과 requests 모듈을 필요로 해요.


● 예제 시작!


(예제에 등장하는 모든 소스https://github.com/umi0410/docker_tutorial_1에 올려놓겠습니다.)



1. app.py라는 이름으로 테스트해볼 프로그램을 작성한다. ( 필요한 python modules는 install 한다 )

( 필요한 모듈은 bs4, requests )

$ vi app.py

혹은 윈도우는 그냥 에디터나 메모장

### all comments are in English
### because sometimes korean comments throw errors though they're just comments


import sys
import requests
from bs4 import BeautifulSoup

url="https://senticoding.tistory.com/49" # url to send HTTP request
headers={"user-agent":"docker_tutorial"}
print(sys.version) # to check out what version of python I am using
# rq is a variable to save the HTTP request
# pass "user-agent" to prevent to be blocked by things like robot
rq=requests.get(url, headers=headers)

#soupObject is a beautifulsoup object
soupObject=BeautifulSoup(rq.content, 'html.parser', from_encoding="utf-8")

# print(rq.status_code) #status_code should be 200 which means a success

print(soupObject.select(".tit_post a"))	# print the title of bs based on the request

# result should be 
# the title of the post in the url
# like
"""
[[Docker] Get started with Docker. What is Docker?]
"""


2. app.py가 잘 작동되는지 확인한다. 

$ python3 app.py

or

$ python app.py

등등 자기 환경에 맞는 명령어를 통해 python 실행



: 제 환경의 경우 python3.6은 한글도 문제없이 출력되는데

python2.7은 한글은 깨져서 출력되네요.



3. pip uninstall 을 통해 app.py를 실행시키는데 필요한 모듈을 삭제해본다.

$ sudo pip uninstall bs4 requests


환경에 따라 pip3 등등



4. python을 실행시키고 module이 삭제되었는지 확인해본다.

$ python

>>> import bs4

>>> import requests



위와같이 삭제한 module을 import 하려할 때 에러가 발생되면 잘한거임!!



혹시 bs4를 지웠음에도 import bs4가 에러가 뜨지 않았다면

$ sudo pip uninstall beautifulsoup4

를 통해 다시 한 번 지워보세요.


5. 삭제되었으면 app.py를 실행시켜도 모듈이 없다며 오류가 나야한다.


$ python app.py



6. 내 컴퓨터에서는 app.py가 실행이 안되는 상태에서

requirements.txt와 Dockerfile을 생성한다. (requiremetns는 app.py등 프로그램을 실행시킬 때 설치할 모듈들 )

$ vi requirements.txt

$ vi Dockerfile


# Dockerfile

# without an file extension


# Use an official Python runtime as a parent image 

FROM python:3.7-slim 


 # Set the working directory to /app 

WORKDIR /app 


 # Copy the current directory contents into the container at /app 

COPY . /app  


# Install any needed packages specified in requirements.txt 

RUN pip install --trusted-host pypi.python.org -r requirements.txt 


 # Make port 80 available to the world outside this container 

EXPOSE 80 


 # Define environment variable 

ENV NAME World 


 # Run app.py when the container launches 

CMD ["python", "app.py"]


requirements.txt 내용

bs4

requests



7. docker build를 통해 image를 빌드하세요

$ docker build --tag=docker_tutorial_1 .

등 자기가 원하는 이름

. 도 빼먹지 말아요



--tag라는 옵션으로 image의 이름을 줄 수 있습니다.

뭐라고 뭐라고 주루루루룩 뜬 다음에 마지막에 Successfully가 뜨면 되겠죠~~





성공적으로 image를 build하면 위처럼

$ docker image ls

입력 시 몇 개의 image가 뜰 수 있습니다. ( 방금 껀 무조건 떠야하고 )


8. build된 image를 이용해 docker run 한다.

$ docker run docker_tutorial_1



9. 성공적으로 프로그램이 실행된다.


위의 그림과 같이 나오면 됩니다!

제 컴퓨터에서는 아까 bs4와 requests를 remove했는데도 다시 install 하지 않았지만, 마치 install 한 것처럼 작동이 되는 것입니다!! 가상환경에서 작업이 이루어지기 때문인것이죠.

그럼 아까 bs4랑 rquests를 지웠으니 다시

$ sudo pip install bs4 requests

를 이용해 module을 설치해주세요 ( 안 쓰시는 모듈이면 안 해도 됨. )