五一节是为了纪念劳动者,而老婆庆祝节日的方式是睡懒觉
前面我们学会了如何启动别人的镜像,今天来学习如何生成自己的镜像。
一、Docker镜像原理
1、先来个灵魂三问:
- 1、docker镜像本质是什么?
- 2、为什么docker中一个centos镜像只有200MB,而一个centos的操作系统文件要几个G?
- 3、为什么docker中一个tomcat镜像只有500MB,而一个tomcat安装包只有70M?
2、下面是网上抄的资料,请自行理解:
3、我总结的灵魂三问答案:
- 1、docker镜像是一个分层文件系统。
- 2、centos的操作系统包含bootfs和rootfs,而docker镜像复用操作系统的bootfs,只有rootfs和其他镜像。
- 3、由于docker中镜像是分层的,tomcat虽然只有70MB,但它需要依赖父镜像和基础镜像(包括jdk等等),所以对外暴露一共500多MB。
二、Docker镜像和压缩文件互相转换
#将docker容器转换成一个新的镜像docker commit ffe114 wufantest:1.0#将镜像转换成压缩文件docker save -o wufantestTar.tar wufantest:1.0#将压缩文件转换成镜像docker load -i wufantestTar.tar
三、Dockerfile生成centos镜像
dockerfile是docker最常用的打包方式,下面是我总结的dockerfile知识点:
- Dockerfile是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建成一个新的镜像
1、dockerfile如何学习?最简单的方式就是去直接抄别人写好的
我们可以访问:
https://hub.docker.com/_/centos
选择一个镜像,点进去就可以查看它的dockerfile
2、dockerfile常用关键字
3、自己学着写一个dockerfile案例:
- 案例需求:
自定义centos镜像:1、默认登录路径为/usr2、可以使用vim
- 案例实现:
#定义父镜像:FROM centos:7#定义作者信息:MAINTAINER wufan<wufan@cmiot.chinamobile.com> #安装vim命令: RUN yum install -y vim#定义默认工作目录:WORKDIR /usr#定义容器启动执行的命令:CMD /bin/bash
4、通过新建的dockerfile文件生成镜像,注意最后有个可爱的小点。
docker build -f ./centos_dockerfile -t wufan_new_centos:1 .
5、将镜像生成容器,进入容器,需求全部实现。
docker run -it --name=c2 wufan_new_centos:1
四、Dockerfile生成django日报系统镜像
1、首先新建一个requirements.txt,里面写日报系统需要依赖的python库
Django==2.2.6PyMySQL==0.9.3Pillowrequestsmysqlclient==1.3.14xlwt
2、新建一个daily_dockerfile,注意看我的注释,每一句话都有它的意义。启动时有几个雷我已经帮忙排了。
#项目依赖python3.7版本FROM python:3.7#添加项目作者MAINTAINER wufan#根目录新建一个django文件夹,并且把这个文件夹设置成工作目录RUN mkdir /djangoWORKDIR /django#将本地文件拷贝到镜像里ADD ./DailySystem/ /django/#更换pip install的源RUN pip install -U pipRUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simpleRUN pip config set install.trusted-host mirrors.aliyun.com#安装日报系统需要依赖的python库RUN pip install -r ./needfiles/requirements.txt#将已经修改好的base和operation文件替换python原始文件,#解决之前报的那个mysqlclient 1.3.13 or newer is required错误RUN mv -f ./needfiles/base.py /usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.pyRUN mv -f ./needfiles/operations.py /usr/local/lib/python3.7/site-packages/django/db/backends/mysql/operations.py#执行python启动命令CMD python3 manage.py runserver 0.0.0.0:8000
3、通过daily_dockerfile 文件生成镜像。
docker build -f ./daily_dockerfile -t dailysystem:1 .
4、生成容器并进入。这里有个新的知识点:
-p 8001:8000 将容器里的8000端口映射到宿主机8001,
这里主要为了演示,一般情况下映射的两个IP相同
docker run -it --name=c3 -p 8001:8000 dailysystem:1
5、如果报错django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'XXXX' (using password: YES)")
记得在django关联的数据库里执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'[宿主机IP]' IDENTIFIED BY '[数据库root密码]' WITH GRANT OPTION;
5、浏览器输入[宿主机IP]:8001/daily/list/,访问成功。
现在日报系统有了镜像,我再也不用担心服务器迁移了。
下一章我们来学习docker-compose,欢迎继续关注。