centos7下docker的常用方案
本地环境
1.安装
业务背景:宿主机为centos7的主机,未配置软件源
考虑到后续对其他组件的使用,如Pyyaml等的安装,此处建议直接配置阿里源或者其他源,配置之后直接yum进行安装即可;
只有一种情况推荐直接下载某个特定版本的rpm包,如docker-manage-2.0-123.noarch.rpm,即对docker的版本有着严格要求,轻易不会修改,也不需要新版本的功能。
2.使能服务配置及服务启动
配置一些使能服务,定时监控docker服务的运行
systemctl enable crond.service
systemctl enable docker.service
启动docker服务
service docker start
3.制作镜像
docker是go编写的,此处以go语言类比如下,
go: 源代码——“编译”——编译后的可执行的程序——“程序运行”——在cache中的进程
docker:dockerfile文件——“docker build”——构件好的机器可运行的一个镜像,即docker image——“docker run”——在cache中运行的一个容器,即docker container
故,在一个环境内运行一个docker容器,需要准备一个docker镜像,这个镜像可以在本地制作(docker build),也可以从其他地方移植(docker pull);同样的也可以将制作好的镜像推送到镜像仓库或某个指定的仓库(docker push),来方便他人获取。
3.1本地制作
在本地制作镜像,大致有三个关键点:
3.1.1 配置基础镜像源
在本场景中,最终容器内运行的是python的代码,此处配置的基础镜像源决定了最终的python代码运行的版本,以alpine为例,如果采用alpine3.13,则其对应的python版本为3.8.15;同时alpine3.13也限制了很多组件的版本,以常用的git为例,alpine3.13源中内置了git 2.30.6,如果该版本满足用户的需求,则在制作镜像时无需另外安装git。当这种情况的极限就是,除了alpine3.13,不需要再安装其他任何的组件包,这会大大缩减制作docker image的时间,并且减小最终成品镜像的大小。
3.1.2 制作基础镜像
如果最终容器中运行的程序需要发送http请求,但是alpine的源中又没有相关的组件包能完成这一功能,这时候就要在基础镜像源上加装相对应的组件包,如requests包,其他如深度学习必备的NumPy和pandas等,都是需要加装的;加装上程序运行需要的组件包之后的镜像,称之为基础镜像。
3.1.3制作业务镜像
万事俱备只欠“代码”,在基础镜像之外,包上一层自己的业务代码,已经指定业务代码运行的进程顺序等操作,将“一坨”整个打包成镜像,即为业务镜像,该镜像为本地环境下的最终产物,内部包含三部分,代码+代码运行所需要的环境+代码依照怎样的顺序执行,所以将该镜像完整移植到任何需要的环境上,不需要再另外配置除docker服务外的其他任何东西,就可以在容器内运行该业务
搞清楚上面三个关键点之后,剩下的就很简单了,按部就班即可,以下三点与上面三个关键点的内容相对应:
①配置基础镜像源
以alpine3.13为例:
https://mirrors.zte.com.cn/alpine/v3.13/main
https://mirrors.zte.com.cn/alpine/v3.13/community
②制作基础镜像
配置和自己业务运行所需要的dockerfile:
FROM alpine:3.13
配置repositories
ADD repositories /etc/apk
RUN echo “nameserver 10.40.8.8” >> /etc/resolv.conf && apk update
安装python相关
RUN echo “nameserver 10.40.8.8” >> /etc/resolv.conf &&
apk add python3-dev &&
apk add py3-pip &&
apk add bash
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN ln -sf /usr/bin/pip3 /usr/bin/pip
配置pip
RUN mkdir -p /root/.pip
COPY pip.conf /root/.pip/
此处仅以pandas和numpy的安装为例
RUN echo “nameserver 10.40.8.8” >> /etc/resolv.conf &&
pip install pandas1.0.4 &&
pip install numpy1.22.3
配置完成后执行docker build命令即可,该命令会选取同目录下的dockerfile来构建镜像
③制作业务镜像
与②类似,只是在制作时,将业务代码copy进去
3.2获取docker仓库内已有的镜像
这个比较简单,与git pull类似,执行docker pull + 镜像所在的仓库路径即可
异地环境
异地环境只考虑对象的使用,一些细节很难文字说明,这里只提供一些实用场景的命令,具体问题具体沟通。
1.对镜像的操作
docker images:查看当前环境已导入的镜像
docker load:若镜像包只copy到当前环境,则需要将其导入
docker rmi :删除镜像
docker pull:从仓库获取镜像
2.对容器的操作
docker ps:查看当前运行的容器
docker run:将某个image运行起来
docker exec -it sh:进入该container
docker stop:停止该container运行
docker rm -f:删除该container
3.容器
要注意设置python的主路径,不然在执行不同app的相同文件时会乱掉:
export PYTHONPATH=‘/home’ 一般默认为/home路径,可以根据代码的实际情况进行选择
4.容器内外透传操作
4.1 挂载目录
这是一个比较简单、常用的内外透传文件的操作,最大的好处就是容器只要起来,就可以实现文件的内外共用,不需要任何额外的进程等操作。
一般选择在一个脚本中集中配置,docker run --restart=always 命令可以后缀多个参数,该命令用来保证在容器每次重启时都会实现的操作,为docker内部的操作命令,常用的如:
–name:容器名称
–network:配置容器使用的网络
-v:外部目录:内部目录
-p:外部端口:内部端口
4.2 消息队列
这个方式适用于一些内外都对接有第三方消息处理的渠道的场景,比如外部的消息市容rabbitMQ获取,经过处理后要吐到kafka里,容器内的进程选取对应的topic从kafka里取数据。
这种情况要具体问题具体分析,只需要在容器run起来的时候配置好容器网络,保证内外网络相通,剩余的和正常消息队列的使用没有什么大的区别