步骤
1.编辑Dockerfile
[root@docker1 scdocker]# mkdir /mydocker/
[root@docker1 scdocker]# cd /mydocker/
[root@docker1 mydocker]# vim Dockerfile
内容为:
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
ENV AUTHOR cali
CMD ["python","app.py"]
解释:
FROM python:2.7-slim #导入基础镜像,镜像里已经安装了python 2.7
WORKDIR /app #进入到容器后,会进入的文件夹
ADD . /app #复制linux系统当前目录下的内容到容器的/app目录下 类似于执行docker cp
RUN pip install --trusted-host pypi.python.org -r requirements.txt #在容器内部执行的命令
EXPOSE 80 #容器暴露80端口,监听80端口
ENV NAME World #定义了环境变量NAME赋值world
ENV AUTHOR cali #定义了环境变量AUTHOR赋值cali
CMD [“python”,“app.py”] #容器启动的时候执行命令 python app.py
RUN和CMD指令是不同的阶段执行的
RUN是在制作镜像的过程中执行的,可以RUN很多命令
CMD是镜像制作完成,启动容器使用镜像的时候执行的,容器启动后执行的命令
2.编辑requirements.txt文件
在go目录下编写Dockerfile,vim Dockerfile
[root@docker1 mydocker]# vim requirements.txt
Flask
Redis
3.编辑app.py文件
编辑app.py文件,这是我们的程序文件。
[root@docker1 mydocker]# vim app.py
内容:
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
4.生成镜像文件
生成sc-hello_1的镜像,执行docker build -t sc-hello_1 .
-t后面指定镜像名字和版本
[root@docker1 mydocker]# docker build -t sc-hello_1 .
[+] Building 87.5s (9/9) FINISHED
查看
5.使用镜像,启动容器
执行docker run -d -p 5544:80 --name jiang-flask-1 sc-hello_1
[root@docker1 mydocker]# docker run -d -p 5544:80 --name jiang-flask-1 sc-hello_1
d9f122061fa54453aa07cca9e554d0b00f29f1596c9af30cb789e61cdf376076
6.访问容器的web服务
curl或者chrome浏览器访问
宿主机ip:http://192.168.1.132:5544/
显示了:
Hello World!
Hostname: f4aeb5d5305a
Visits: cannot connect to Redis, counter disabled
注意出现这个提示证明访问是正常的,只不过提示是因为redis数据库容器没有启动,flask web服务不能连接到redis数据库!!!
7.启动redis容器
执行docker run -d -p 6379:6379 --name jiang-redis-1 redis
[root@docker1 mydocker]# docker run -d -p 6379:6379 --name jiang-redis-1
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
efbbd2eec449972dbbef502b20c5782b6b780a05612c507431eb2b9a46bfd12e
8.链接到redis容器
将前面启动的容器删除,再次启动链接redis容器:
删除:
[root@docker1 mydocker]# docker rm jiang-flask-1
jiang-flask-1
[root@docker1 mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
efbbd2eec449 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp jiang-redis-1
再次启动:
[root@docker1 mydocker]# docker run -d --name jiang-flask-1 -p 5544:80 --link jiang-redis-1:redis sc-hello_1
00623259acd41b22c9c717396a3490192e685c7a45b334ebedfb6bbf6bb8fb6c
[root@docker1 mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00623259acd4 sc-hello_1 "python app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5544->80/tcp, :::5544->80/tcp jiang-flask-1
efbbd2eec449 redis "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp jiang-redis-1
进入查看:
[root@docker1 mydocker]# docker exec -it jiang-flask-1 bash
root@00623259acd4:/app# cat /etc/host
cat: /etc/host: No such file or directory
root@00623259acd4:/app# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 redis efbbd2eec449 jiang-redis-1
172.17.0.2 00623259acd4
9.再次访问容器的web服务
curl或者chrome浏览器访问
宿主机ip:http://192.168.1.132:5544/
可点击刷新页面,“Visit:”后面的数会依次增加1。