Before moving forward make sure, you have up and running Docker service
In this example, I will be using flask-app
Ref: https://training.docker.com/user/consume/course_pathway/7c7fcfcb-8e2f-32dc-9531-1db82f671120/92/aa9e230a-6617-3e0b-a8ba-d6f6245aee0a?complete=0&tab=overview
1) Create directory called flask-app
mkdir flask-app
cd flask-app
2) Create a file app.py
cat > app.py
from flask import Flask, render_template
import random
app = Flask(__name__)
# list of cat images
images = [
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26388-1381844103-11.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr01/15/9/anigif_enhanced-buzz-31540-1381844535-8.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26390-1381844163-18.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-1376-1381846217-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3391-1381844336-26.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-29111-1381845968-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3409-1381844582-13.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr02/15/9/anigif_enhanced-buzz-19667-1381844937-10.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26358-1381845043-13.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-18774-1381844645-6.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-25158-1381844793-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/10/anigif_enhanced-buzz-11980-1381846269-1.gif"
]
@app.route('/')
def index():
url = random.choice(images)
return render_template('index.html', url=url)
if __name__ == "__main__":
app.run(host="0.0.0.0")
#########################
3) Create a file called requirements.txt
cat > requirements.txt
Flask =0.10.1
4) Create directory templates and then file index.html in it
mkdir templates
cat > templates/index.html
<html>
<head>
<style type="text/css">
body {
background: black;
color: white;
}
div.container {
max-width: 500px;
margin: 100px auto;
border: 20px solid white;
padding: 10px;
text-align: center;
}
h4 {
text-transform: uppercase;
}
</style>
</head>
<body>
<div class="container">
<h4>Cat Gif of the day</h4>
<img src="{{url}}" />
<p><small>Courtesy: <a href="http://www.buzzfeed.com/copyranter/the-best-cat-gif-post-in-the-history-of-cat-gifs">Buzzfeed</a></small></p>
</div>
</body>
</html>
5) Write a Dockerfile, create a file called Dockerfile in flask-app directory with following content
FROM alipine:3.5
RUN apk add --update py2-pip
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates
EXPOSE 5000
CMD ["python", "/usr/src/app/app.py"]
6) Verify Dockerfile
##out base image
FROM alpine:3.5
# Install python and pip
RUN apk add --update py2-pip
# Install python modules needed by the python app
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
# copy files required for the app to run
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/
# tell the port number the container should expose
EXPOSE 5000
# run the application
CMD ["python", "/usr/src/app/app.py"]
7) Build the image (make sure you are in flask-app where Dockerfile exists)
docker build -t manoj/myfirstapp .
It's output in last lines will be
Removing intermediate container 65fce60d1108
Step 8/8 : CMD python /usr/src/app/app.py
---> Running in 59d87e1975ed
---> af2bf7953190
Removing intermediate container 59d87e1975ed
Successfully built af2bf7953190
8) Now its time to run your own image
docker run -p 8888:5000 --name myfirstapp manoj/myfirstapp
8888 is the port will be running on Docker Host and 5000 port which we exposed in container
Output should be like
docker run -p 8888:5000 --name myfirstapp manoj/myfirstapp
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
9) Now try browsing http://docker-host:8888
10) Its time push your repository to Docker Hub if you want
1st login to docker using command line
docker login --username=manojXXXX
this will prompt for password, enter password to connect to you account
11) As login is successful, We can tag our image to our docker username and change its path similar to our docker hub account like
docker tag manoj/myfirstapp manojXXXX/flask-app
12) Now we can push our image to Docker Hub, with latest tag
docker push manojsamtani/flask-app:latest
Output should be like
The push refers to a repository [docker.io/manojsamtani/flask-app]
806f2b9df705: Pushed
8b394632d523: Pushed
decd7faa1c3f: Pushed
3cb442886a35: Pushed
f18037a76d54: Pushed
23b9c7b43573: Pushed
latest: digest: sha256:5a1f8cf7518c532867a835a225bbe1256cb1baaec06029093ae112089765efd2 size: 1572
13) Now we can stop/remove containers locally
docker stop myfirstapp
docker rm myfirstapp
or
docker rm -f myfirstapp
In this example, I will be using flask-app
Ref: https://training.docker.com/user/consume/course_pathway/7c7fcfcb-8e2f-32dc-9531-1db82f671120/92/aa9e230a-6617-3e0b-a8ba-d6f6245aee0a?complete=0&tab=overview
1) Create directory called flask-app
mkdir flask-app
cd flask-app
2) Create a file app.py
cat > app.py
from flask import Flask, render_template
import random
app = Flask(__name__)
# list of cat images
images = [
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26388-1381844103-11.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr01/15/9/anigif_enhanced-buzz-31540-1381844535-8.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26390-1381844163-18.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-1376-1381846217-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3391-1381844336-26.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-29111-1381845968-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3409-1381844582-13.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr02/15/9/anigif_enhanced-buzz-19667-1381844937-10.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26358-1381845043-13.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-18774-1381844645-6.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-25158-1381844793-0.gif",
"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/10/anigif_enhanced-buzz-11980-1381846269-1.gif"
]
@app.route('/')
def index():
url = random.choice(images)
return render_template('index.html', url=url)
if __name__ == "__main__":
app.run(host="0.0.0.0")
#########################
3) Create a file called requirements.txt
cat > requirements.txt
Flask =0.10.1
4) Create directory templates and then file index.html in it
mkdir templates
cat > templates/index.html
<html>
<head>
<style type="text/css">
body {
background: black;
color: white;
}
div.container {
max-width: 500px;
margin: 100px auto;
border: 20px solid white;
padding: 10px;
text-align: center;
}
h4 {
text-transform: uppercase;
}
</style>
</head>
<body>
<div class="container">
<h4>Cat Gif of the day</h4>
<img src="{{url}}" />
<p><small>Courtesy: <a href="http://www.buzzfeed.com/copyranter/the-best-cat-gif-post-in-the-history-of-cat-gifs">Buzzfeed</a></small></p>
</div>
</body>
</html>
5) Write a Dockerfile, create a file called Dockerfile in flask-app directory with following content
FROM alipine:3.5
RUN apk add --update py2-pip
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates
EXPOSE 5000
CMD ["python", "/usr/src/app/app.py"]
6) Verify Dockerfile
##out base image
FROM alpine:3.5
# Install python and pip
RUN apk add --update py2-pip
# Install python modules needed by the python app
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
# copy files required for the app to run
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/
# tell the port number the container should expose
EXPOSE 5000
# run the application
CMD ["python", "/usr/src/app/app.py"]
7) Build the image (make sure you are in flask-app where Dockerfile exists)
docker build -t manoj/myfirstapp .
It's output in last lines will be
Removing intermediate container 65fce60d1108
Step 8/8 : CMD python /usr/src/app/app.py
---> Running in 59d87e1975ed
---> af2bf7953190
Removing intermediate container 59d87e1975ed
Successfully built af2bf7953190
8) Now its time to run your own image
docker run -p 8888:5000 --name myfirstapp manoj/myfirstapp
8888 is the port will be running on Docker Host and 5000 port which we exposed in container
Output should be like
docker run -p 8888:5000 --name myfirstapp manoj/myfirstapp
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
9) Now try browsing http://docker-host:8888
10) Its time push your repository to Docker Hub if you want
1st login to docker using command line
docker login --username=manojXXXX
this will prompt for password, enter password to connect to you account
11) As login is successful, We can tag our image to our docker username and change its path similar to our docker hub account like
docker tag manoj/myfirstapp manojXXXX/flask-app
12) Now we can push our image to Docker Hub, with latest tag
docker push manojsamtani/flask-app:latest
Output should be like
The push refers to a repository [docker.io/manojsamtani/flask-app]
806f2b9df705: Pushed
8b394632d523: Pushed
decd7faa1c3f: Pushed
3cb442886a35: Pushed
f18037a76d54: Pushed
23b9c7b43573: Pushed
latest: digest: sha256:5a1f8cf7518c532867a835a225bbe1256cb1baaec06029093ae112089765efd2 size: 1572
13) Now we can stop/remove containers locally
docker stop myfirstapp
docker rm myfirstapp
or
docker rm -f myfirstapp