目录
一、镜像images
二、镜像的层次结构
三、镜像的制作
一、镜像images
A Docker container image is a lightweight, standalone, executable package of sofrware that includes everything needed to run an application: code,runtime,system tools, system libraries and settings. (来自docker官方文档)
镜像可以理解成一个软件,是一个app封装,里面有核心代码,系统工具,系统库等。
二、镜像的层次结构
容器启动的时候,内核启动bootfs后直接将base镜像加载,然后一层一层的加载,是自下而上;
容器运行后访问文件的时候,是自下而上,一层一层往下访问的。
scratch是最基础的docker镜像,是一个空白的镜像。
镜像分层结构的最大好处就是资源共享。
可写层和镜像层:当容器启动时,一个新的可写层被加载到镜像的顶部,这一层被称作“容器层”,容器层之下的都叫“镜像层”。所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
三、镜像的制作
接下来只是制作镜像一个流程
1.新建一个空目录
[root@docker mydocker]# mkdir mydocker
[root@docker mydocker]# cd mydocker/
2.新建Dockerfile文件
[root@docker mydocker]# vim Dockerfile
#下载一个python2.7的基础镜像模板(python3.9也行)
FROM python:2.7-slim
#创建容器后,进入docker容器所在的目录
WORKDIR /app
#复制当前目录下的所有的内容到容器里的/app目录下
ADD . /app
#数据卷,可以不写
VOLUME ["/data_flask"]
#下载requirements.txt里的库,在制作镜像的时候运行
RUN pip install --trusted-host pypi.python.org -r requirements.txt
#表示开放80端口
EXPOSE 80
#声明环境变量NAME,值为World
ENV NAME World
#容器启动的时候执行的命令
CMD ["python","app.py"]
3.新建requirements.txt文件
[root@docker mydocker]# vim requirements.txt
[root@docker mydocker]# cat requirements.txt
Flask
Redis
4.新建app.py文件
[root@docker 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 = "cannot connect to Redis, counter disabled"html = "Hello {name}!
" \"Hostname: {hostname}
" \"Visits: {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)
5.生成名字为sc_friendlyhello_1的镜像
[root@docker mydocker]# docker build -t sc_friendlyhello_1 .
6.查看生成的镜像
[root@docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sc_friendlyhello_1 latest e2dc0bc22059 2 seconds ago 151 MB
7.创建并运行容器
[root@docker mydocker]# docker run -d -p 4000:80 --name sc-hello-1 sc_friendlyhello_1
8.测试
在另一个终端去执行,下面表示linux里去访问网站
[root@docker ~]# curl 192.168.10.10:4000
Hello World!
Hostname: 102212ba7691
Visits: cannot connect to Redis, counter disabled
此时可以说明自己制作的镜像已经成功,但是发现不能连接到redis数据库,因为当前还没有启动redis数据库容器,所有web服务不能连接到redis数据库,接下来我们再拉取redis镜像,并且启动一个redis容器,再次启动一个自己制作镜像的容器,链接到redis容器,然后再去测试。
[root@docker ~]# docker pull redis
[root@docker ~]# docker run -d -p 6379:6379 --name sc-redis-1 redis
[root@docker ~]# docker run -d --name sc-hello-2 -p 4001:80 --link sc-redis-1:redis sc_friendlyhello_1
[root@docker ~]# curl 192.168.10.10:4001