网站后台尺寸一般做多大的热门网站排名
Docker学习笔记整理
PS:关注文末公众号,可领取Docker电子版学习资料
1.概念&原理
-
Docker就是集装箱原理,现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
-
docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。简言之,就是可以在Linux上镜像使用的这么一个容器。
-
docker可以在什么情况下使用
- web应用自动化打包发布,像tomcat应用的发布。
- 自动化测试和持续集成、发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 搭建paas环境
-
使用docker有什么好处
- 简单易操作,简化了以往复杂的应用程序安装步骤,使用docker会变得非常简便。
- 可兼容多种应用,Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成镜像部署。
- 省钱 docker结合云可以做到高性能低价格
特别之处:Docker是基于Linux 64bit的,在32位机器上无法运行。
-
Docker三大基本组件
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
理解这三个概念,就理解了Docker的完整生命周期。 其中镜像和容器的关系分别对应类和实例的关系。镜像是静态的定义,容器是镜像运行时的实体。
Docker Registry
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,DockerRegistry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
2.DockerFile 模板:
FROM docker.4pd.io/python:3.7-slimLABEL maintainer="xxx" \email="xxx@xxxx.com"USER root# 设置语言
ENV LC_ALL=en_US.UTF-8 \LANG=en_US.UTF-8 \LANGUAGE=en_US.UTF-8 \LD_LIBRARY_PATH=/usr/cuda_files:/usr/local/cuda/lib64:$LD_LIBRARY_PATH# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN sed -i s@/deb.debian.org/@/mirrors.tuna.tsinghua.edu.cn/@g /etc/apt/sources.list
RUN apt clean && apt update
RUN apt install -y build-essential less curl wget bzip2 gcc g++ libcap-dev vim tmuxRUN mkdir ~/.pip && echo '[global]\n\
use-mirrors=true\n\
mirrors=https://pypi.pypi.douban.com\n\
index-url=https://pypi.douban.com/simple' > ~/.pip/pip.conf
RUN pip install -U pip# 加载文件 之下的内容是项目的配置,之上的内容是python项目的模板配置
COPY . /opt/file_converter_kb
RUN mkdir -p /opt/file_converter_kb/log# 默认工作目录
WORKDIR /opt/file_converter_kb# 设置依赖库
RUN apt install -y lsof libpoppler-cpp-dev libgl1-mesa-glx poppler-utils libgtk2.0-dev
RUN pip install -r requirements.txt# 设置端口
EXPOSE 5030# 容器启动默认执行的脚本
CMD ["python", "/opt/file_converter_kb/run.py"]
3. 《Docker从入门到实践》 笔记
-
镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。
-
不要使用docker commit定制镜像,定制镜像应该使用Dockerfile来完成。
-
虚悬镜像:由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为< none >的镜像
-
后台运行容器 -d,以及进入容器 exec [-it]
-
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。
-
使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息。
-
进入容器:
-
推荐使用exec命令的原因,从这个stdin中exit,不会导致容器的停止。这就是为什么推荐大家使用docker exec的原因。
-
-
如何定制镜像
- 镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
- Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。
- docker commit 命令的缺点
- docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。因此不推荐使用commit。
- 而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。
- 使用DockerFile定制镜像
- FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
- Docker还存在一个特殊的镜像,名为scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
- 当之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。因此没有必要建立很多层,这只是一层的事情。因此,这里没有使用很多个 RUN 。
- 对应不同的命令在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。即没有必要每一行都写RUN,可以使用&&将各个命令串起来。
- 比如:
- 更优雅的配置:
Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。
-
DockerFile常见指令
-
COPY复制文件
-
CMD容器启动命令
-
ENTRYPOINT入口点
-
4.实战:利用DockerFile将Flask项目部署到Docker上并测试
首先是本地调试好的项目目录结构:
第二步:写Dockerfile,将它放在run.py的同级目录下:
DockerFile的具体内容:
FROM docker.4pd.io/python:3.7-slimLABEL maintainer="xxx" \email="xxx@xxxxxxx.com"USER root# 设置语言
ENV LC_ALL=en_US.UTF-8 \LANG=en_US.UTF-8 \LANGUAGE=en_US.UTF-8 \LD_LIBRARY_PATH=/usr/cuda_files:/usr/local/cuda/lib64:$LD_LIBRARY_PATH# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN sed -i s@/deb.debian.org/@/mirrors.tuna.tsinghua.edu.cn/@g /etc/apt/sources.list
RUN apt clean && apt update
RUN apt install -y build-essential less curl wget bzip2 gcc g++ libcap-dev vim tmuxRUN mkdir ~/.pip && echo '[global]\n\
use-mirrors=true\n\
mirrors=https://pypi.tuna.tsinghua.edu.cn\n\
index-url=https://pypi.tuna.tsinghua.edu.cn/simple' > ~/.pip/pip.conf #换下载源
RUN pip install -U pip #升级pip# 加载文件 之下的内容是项目的配置(需要改),之上的内容是python项目的模板配置(一般情况下可以不用动)
# 这里指将当前目录下的所有文件(包括DockerFile),COPY到目标文件夹/opt/elements_extraction_server下
COPY . /opt/elements_extraction_server# 指定一个默认的工作目录,到上一步复制的目标文件
WORKDIR /opt/elements_extraction_server
# 设置依赖库,requirements.txt里面都是项目需要的包
RUN pip install -r requirements.txt
# 设置容器向外暴露的端口(等价于Flask应用run.py的port号),一般存在的意义是写DockerFile的人希望别人docker run的时候 -p [宿主机端口]:[容器端口],建议[容器端口]写EXPOSE的这个值,当然实际情况[容器端口]可以不和EXPOSE相同,这样EXPOSE值也没用了
EXPOSE 5030
# 容器启动默认执行的脚本,运行run.py
CMD ["python", "/opt/elements_extraction_server/run.py"]
其中的requirements.txt可以通过命令实现:
pip freeze > requirements.txt
有时候生成出来的包比较多(比如不在venv的情况下会生成系统中pip安装的所有包列表),实际部分用不上,因此可以删掉该项目不需要的包,如果发现没有需要的包,可以直接写在里面不带版本号也可,示例比如:
stringutils0.3.0
Flask1.1.2
Flask_SQLAlchemy2.4.4
requests2.24.0
concurrent_log_handler
flask-sqlalchemy
pymysql
第三步:将项目代码连同Dockerfile一块上传到服务器的某个目录
第四步:进入到服务器的项目目录下,该目录下有Dockerfile
第五步:编译构建镜像Image:
docker build -t [仓库名]:[版本号] .
(注意最后有个点".",当表当前Dockerfile的上下文,一个版本号对应一个镜像)
比如docker build -t elements_extraction_server:1.0 .
执行过程与结果截图:
看到Successfully balabala…可以通过docker images查看已经有了一个新的镜像:
第六步:运行镜像
docker run -it -p [宿主机端口]:[容器端口] --name [容器名] [仓库名]:[版本号]
比如:
docker run -it -p 1234:5030 --name container1 elements_extration:1.3
-p [宿主机端口]:[容器端口]
详解:因为flask是放在容器里运行的,所以flask项目的run.py里暴露的端口,即是容器向外暴露的端口,容器container告诉外面的【宿主机(服务器)端口】应该监听我的【容器端口】,我的【容器端口】其实也就是flask项目对外暴露的port。
第七步:其他主机浏览器访问URL部署在docker上的项目
比如: [服务器IP地址]:[宿主机端口]
关注下方公众号,后台回复【Docker】关键词免费获取《Docker从入门到实践》高清电子版。