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学习 二 构建Docker容器并上传
使容器与运行在后台:

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

下一篇: Docker 入门(三:Service 服务)