docker应用实践
由于项目部署的现场环境通常为离线环境,因此需要将项目打包为docker文件,便于部署。1. docker安装yum install docker -y设置自启动systemctl start dockersystemctl enable docker2. 制作包含中文语言环境和python3服务的基础centos镜像此处采用dockerfile文件进行制作,首先拉取一个原始的centos7镜像。d
由于项目部署的现场环境通常为离线环境,因此需要将项目打包为docker文件,便于部署。
1. docker安装
yum install docker -y
设置自启动
systemctl start docker
systemctl enable docker
2. 制作包含中文语言环境和python3服务的基础centos镜像
此处采用dockerfile文件进行制作,首先拉取一个原始的centos7镜像。
docker pull docker.io/centos:7
编写dockerfile文件的内容。
# 指定操作的镜像
FROM docker.io/centos:7
# 安装ssh服务
RUN yum install -y openssh-server
RUN yum install -y passwd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
RUN echo "123456" | passwd --stdin root # 系统密码,可自行更改
ADD run.sh /run.sh
EXPOSE 22
CMD ["/run.sh"]
# 安装centos的yum源
RUN yum -y install epel-release
RUN yum repolist
RUN yum -y install vim wget gcc make libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python3-devel
# 指定语言,防止中文日志乱码
RUN yum -y update \
&& yum install kde-l10n-Chinese -y \
&& yum reinstall glibc-common -y \
&& localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 \
&& echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf \
&& source /etc/locale.conf
ENV LC_ALL=zh_CN.UTF-8 \
LANG=zh_CN.UTF-8
# 安装python 3.6.8
WORKDIR /opt/install
RUN wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
# 解压
RUN tar -zxvf Python-3.6.8.tgz
WORKDIR Python-3.6.8
RUN ./configure
RUN make&&make install
RUN python3 -m pip install --upgrade pip
# 设置/opt为进入容器的默认位置
WORKDIR /opt
run.sh文件的内容如下,与dockerfile处于同一目录下:
#! /bin/bash
/usr/sbin/sshd -D
创建镜像
docker build -t ch_centos:0 .
制作镜像的时候,可能出现报错的情况,对于创建报错的镜像none,可以采用如下命令进行删除
docker rmi $(docker images | grep "none" | awk '{print $3}')
3. 更新centos的sqlite3版本
一个很离谱的问题:centos7自带的sqlite3版本是3.7,然而启动django时sqlite3版本要求>=3.8,因此第2节中的基础镜像在打包django服务时会报错。
- 首先创建基于ch_centos:0生成的容器,并进入容器
docker run -tid --name base --privileged=true -t ch_centos:0 /usr/sbin/init
docker exec -it base /bin/bash
- 更新sqlite3版本
# 下载源码
# 本人习惯把安装包下载/opt/install的目录下
cd install
wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
# 编译
tar zxvf sqlite-autoconf-3290000.tar.gz
cd sqlite-autoconf-3290000/
./configure --prefix=/usr/local
make && make install
# 替换系统低版本 sqlite3
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
echo "/usr/local/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
# 查看系统环境中的sqlite3版本
sqlite3 -version
# 查看python3中的sqlite3版本,二者一致即可
python3
import sqlite3
sqlite3.sqlite_version
在进入python3中检查sqlite3时,出现了另一个问题,python3运行出现警告“UserWarning:Could not import the lzma module .Your installed Python is incomplete.”
补充lzma的安装,首先下载相关安装包
yum install xz-devel -y
yum install python-backports-lzma -y
pip3 install backports.lzma
cd到python3的依赖包目录下,修改lzma.py
cd /usr/local/lib/python3.6
ls
vim lzma.py
修改内容如下:
try:
from _lzma import *
from _lzma import _encode_filter_properties, _decode_filter_properties
except ImportError:
from backports.lzma import *
from backports.lzma import _encode_filter_properties, _decode_filter_properties
上述操作完成后,退出镜像,将base容器制作为新镜像,至此,一个基础的镜像已经完成。后续项目的打包可以在该镜像下进行具体项目文件的更新。
exit
docker commit base ch_centos:1
4. 设置时区
由于容器中的时间与本地时间差了8小时,查看日志不太方便,因此进行时区的配置
- 查看容器时间
date
- 查看Shanghai时区文件是否存在,若不存在,则从服务上复制到容器中,建立软链接即可。
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
5. 编排工具docker_compose
docker-compose用于启动N个容器,管理容器会比较方便些。compose 中有两个重要的概念:
- 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
5.1 安装
compose是一个独立的产品,需要独立安装。安装文档:https://docs.docker.com/compose/install/#install-compose
5.2 示例
首先,创建docker-compose.yaml文件,内容如下,web中包含的内容和采用docker -tid ....
的命令行启动参数基本一致:
# start django service
version: "3"
services:
web:
build: .
# 镜像来源
image: web:latest
# 容器名称
container_name: web
# 启动命令
cmd: python3 manage.py runserver 0.0.0.0:8080
# 对外端口
ports:
- 8080:8080
# 挂载目录
volumes:
- /var/logs/web:/web/logs
# 挂了保持自动重启
restart: always
启动:
# -d表示后台运行
docker-compose up -d
关闭:
docker-compose down
更多推荐
所有评论(0)