Docker(七)—镜像制作

 

镜像换源

注册一个阿里云用户,访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors获取专属Docker加速器地址

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你自己的加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info
#命令查看是否修改

镜像

Docker中镜像是指镜像文件,包括代码,基础系统,依赖库,工具。

镜像分层思想

在这里插入图片描述

Dockerfile

Dockerfile(制作镜像脚本化), 是一个文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

在制作镜像之前,需要知道为什么需要制作镜像,docker hub不是有很多吗。

原因:

  • 不能满足生产应用环境的需求。
  • 不够安全,有安全隐患。

镜像制作

docker打镜像的过程

  • 启动一个临时容器
  • 顺序执行dockerfile命令
  • build -t 保存并改名为指定的名称作本地保存
  • 把临时容器删除
  • 上传到镜像仓库

自制docker镜像制作(python2.7,redis)

源码文件地址 https://download.yutao.co/mydocker/

创建文件夹

mkdir mydocker
cd mydocker/

编辑Dockerfile文件

vim Dockerfile
FROM python:2.7-slim
#以python:2.7为模板制作镜像,注意要提前下载好该镜像
WORKDIR /app
#在docker容器里的工作目录,进入docker容器时,所在的目录,相当于家目录。
ADD . /app
#添加当前目录下的所有内容到容器里的/app目录下,ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统
VOLUME ["/data_flask"]
#使用/data_flask卷
RUN pip install --trusted-host 
#从pypi.python.org网站下载requirements.txt里面的库,只在制作镜像时运行
EXPOSE 80
#暴露80端口发布
ENV NAME World
ENV AUTHOR wyt
#定义环境变量,NAME和AUTHOR
CMD ["python","app.py"]
#容器启动时第一个启动的程序

编辑requirements.txt文件

vim requirements.txt
Flask
Redis
#下载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)
    

mydocker文件夹里面的三个文件

在这里插入图片描述

建立镜像

docker build -t wyt-hello .
#使用当前目录的文件建立镜像,名为wyt-hello

启动容器

docker run --name wyt_hello -d -p 8088:80 wyt-hello
#启动wyt-hello镜像的容器wyt_hello

在这里插入图片描述

这里没有连接redis,报错。

连接redis

docker run --name redis_1 -d -p 6379:6379 redis
#启动redis镜像的redis_1容器
docker run -d --name wyt_hello_2 -p 8089:80 --link redis_1:redis wyt-hello
#启动wyt_hello_2容器,这里用到多容器建立链接,目的是在wyt_hello_2容器的/etc/hosts增加redis的域名解析记录,使wyt_hello_2可以与redis_1通信

可以看到已经与redis建立连接,统计访问次数,每刷新一次增加1

在这里插入图片描述

进入容器终端可以看到自己定义的环境变量

在这里插入图片描述