Docker学习 二 构建Docker容器并上传
上一篇: CentOS 7 安装Docker
使用Dockerfile定义一个容器
Dockerfile 定义了容器中的运行环境。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件到那个环境。
Dockerfile
在你的本地机器上创建一个空文件夹.进入到这个新文件夹,创建一个Dockerfile文件,将下面信息拷贝到Dockerfile文件中,保存。注意文件中的注释。
# 使用官方提供的Python环境作为父镜像
FROM python:2.7-slim
# 设置工作目录为/app
WORKDIR /app
# 将本地的'.'目录下面的内容复制到容器的/app目录下
COPY . /app
# 安装必要的python包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 使用80端口和容器外部进行通信
EXPOSE 80
# 定义环境变量
ENV NAME World
# 当容器启动之后执行app.py
CMD ["python", "app.py"]
APP 包含的内容
创建两个文件,requirements.txt 和 app.py,同时将它们放到Dockerfile同级目录下,当上面的Dockerfile被构建成镜像,app.py 和 requirements.txt 会拷贝到镜像中由于COPY 命令。并且通过EXPOSE建立外部http通信。
requirements.txt (文件内容)
Flask
Redis
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)
构建APP
当前的文件目录是这样的:
$ ls
Dockerfile app.py requirements.txt
执行构建命令(特别注意命令的最后有个 ‘.’,用于指明当前目录):
docker build --tag=friendlyhello .
查看你的镜像:
$ docker image ls
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
执行镜像
-p 4000:80指定容器和外部的端口映射
docker run -p 4000:80 friendlyhello
打开浏览器,访问http://localhost:4000 .
使容器与运行在后台:
docker run -d -p 4000:80 friendlyhello
查看容器的id:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
利用容器id停止容器:
docker container stop 1fa4ab2cf395
共享你的容器
注册帐号:
在 https://hub.docker.com/ 注册帐号
登陆:
docker login
镜像打Tag:
格式:docker tag image-name username/repository:tag
docker tag friendlyhello gordon/get-started:part2
查看打包好的tag:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest d9e555c53008 3 minutes ago 195MB
gordon/get-started part2 d9e555c53008 3 minutes ago 195MB
python 2.7-slim 1c7128a655f6 5 days ago 183MB
上传镜像:
格式:docker push username/repository:tag
docker push gordon/get-started:part2
下载并执行镜像:
docker run -p 4000:80 gordon/get-started:part2