Docker 服务的安装配置

若服务器中已经有 docker 容器了请忽略此处配置讲解(通过简单 docker 命令能否被识别),服务器中 docker 若不存再请看如下:

  • 我们决定采用 yum 安装,先更新配置 yum 源头(此处非必须,看情况!)

    一般研发在服务器中若安装好了 docker,一般此步操作不需要执行。

    用 yum 安装 docker 可以,或者 wget 安装 docker 后再解压也行

    下面操作主要是更新 yum 为了安装新版的 docker,而不是很老旧版本的 docker,然后对 yum 库的配置

    # yum 更新,过程中一切都是 [yes],这一步极其慢
    yum -y update
    
    # yum 安装几个必要的包,其中含有设 yum 库的命令
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 设置阿里仓库 yum
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  • yum 安装 docker-ce,因为老旧版本的才叫 docker 或 docker-engine

    # 查看有哪些 docker-ce
    yum list docker-ce --showduplicates | sort -r
    
    # 我选择了 18 年末的一个版本的 docker 安装
    yum install docker-ce-18.03.1.ce
    
    # 启动 docker 服务
    systemctl start docker
    
    # 将其加入开机启动
    systemctl enable docker
    
    # 想看 docker 服务是不是真起来了,通过 ps 命令,要是有列名即使没有容器也不要紧,说明已经起来了
    docker ps
    
  • docker 拉取镜像替换称国内镜像源,使下载镜像速度提升

    # 添加镜像源地址
    vi /etc/docker/daemon.json
    

    json 内容如下

    {
      "registry-mirrors" : [
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com"
      ],
      "insecure-registries" : [
        "registry.docker-cn.com",
        "docker.mirrors.ustc.edu.cn"
      ],
      "debug" : true,
      "experimental" : true
    }
    
  • 重启 docker 服务

    # 进程
    systemctl daemon-reload
    
    # docker 服务重启
    systemctl restart docker
    
  • docker弄好了之后需要拉取镜像

docker pull python:alpine3.7

等到镜像拉取完成之后可以使用docker images来查看

ps: 以下为实验部分为了弄清原理,简单的用了一个临时的容器

docker run -it --rm python:alpine3.7 sh

使用了以上的命令之后,进入到了容器中。

先设置好PIP国内的镜像源

mkdir $HOME/.pip/
# 利用tee命令把下面的配置写入daemon.json
tee $HOME/.pip/pip.conf<<-'EOF'
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
EOF

然后是设置好alpine的源,这里的意思等同是在linux服务器里面,使用yum指令拉取东西的时候会很慢,所以会对yum的镜像源做一个配置,同理也需要对alpine容器内的包管理器做一个镜像源的设置,alpine容器内部的包管理器是使用的apk,以下对apk镜像源设置做一个讲解

注意 : 以下的指令都是作用在容器内的

  1. 查看容器内部本身的镜像源
cat /etc/apk/repositories
  1. 设置阿里云的镜像源
echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories

3.同上文的设置yum的镜像源一样,改好配置之后需要重新启动

apk update && apk upgrade
  1. 在容器内安装pythonFlask的镜像库
python -m pip install -U flask

执行完之后这个时候可以来试一试使用flask run来执行一下,这个时候会报一个FLASK_APP未设置的错,这个值是一个环境变量,需要我们提前设置好之后才能用flask run的指令来运行

以下是实验部分
5. 在容器内创建一个test.py文件,并且写入

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "hello world"

@app.route("/abc")
def abc():
    return "hello world"

if __name__ == "__main__":
    app.run()

创建完了之后如果我们直接使用python test.py就直接启动了这个
6. Xshell另外开一个窗口,进入到这个实验容器

docker ps
docker exec -it 容器id sh
  1. 用管道命令查询
ps -ef | grep python

注意 因为你上文是采用python加执行文件的形式启动的项目,所以这里就筛选python就可以了。
查询完之后可以看到有一个进程以python的形式运行。
8. 使用curl指令来测试接口

curl: localhost:5000

可能curl工具没有使用apk add curl命令来安装。
8. 再说说如何用flask run的指令来运行

export FLASK_APP=/test.py

然后就可以直接运行了。
可以重复执行6-7步实验

  • 以上部分就是实验完了这个容器,这时候我们做一个镜像,拥有这个容器内的全部功能,需要提前写好配置文件,直接就能生成这个镜像。
  1. ~目录下生成一个名字为flask的空文件夹
  2. 写一个pip的配置文件 pip.conf内容为
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
  1. 创建一个Dockerfile文件,内容为
FROM python:alpine3.7
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN mkdir /app
RUN mkdir $HOME/.pip/
COPY ./pip.conf $HOME/.pip/
RUN pip install flask
EXPOSE 5000
CMD ["flask","run"]

简单的介绍以下上文的作用
以python:alpine3.7为基础,叠加下面的配置,2-3行,配置镜像源,4行重启加载镜像源,5行在进行内部创建app文件夹,6行 在用户目录下创建一个.pip文件夹,7行copy 当前linux机器下的pip.conf文件到用户目录下的.pip文件夹里面去,8行在镜像内部使用pip指令安装flask,9行 暴露容器内部的5000端口方便后续的端口映射,10行 代表启动这个容器之后,不加任何命令他会主动去运行flask run这条命令
4. 以上的配置文件写好之后,运行以下指令开始构建镜像。

docker build -t myflask:1.0 .

最后这个.代表他会去当前目录下的Dockerfile去编译
5. 到这一步就构建出来了一个和上文实验部分功能一样的镜像了,唯一的差别在于,此时的镜像中是没有test.py的文件的,这是后生成容器的时候把linux宿主机上的文件映射过去。

  • 上文构建了一个基础的镜像,这个时候就需要做的是生成容器
  1. ~目录下创建一个myapp的文件夹
  2. 进入到文件夹内部,创建一个test.py的文件,内容如下
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "hello world"

@app.route("/abc")
def abc():
    return "hello world"

if __name__ == "__main__":
    app.run()
  1. 开始运行,指令如下
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0

对这个指令做一个解释,–nam myapp 这里是给容器取了这么一个名字, -d 容器在后台运行, -p 8080:5000 这里是端口映射,把linux机器上的8080端口映射到容器内的5000端口上,-v 路径映射,把linux下的/root/myapp路径,这个路径就是创建test.py的路径,映射到容器的/app下,-e FLASK_APP=/app/test.py,设置环境变量,最后是镜像的名称加tag
这里可以用docker logs myapp来查看日志
4. linux机器内部访问,curl localhost:8080 发现访问不了,是因为test.py没有设置端口
5. 把原来的容器停止并且删除

docker stop myapp && docker rm myapp
  1. 重新启动
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0 flask run -h 0.0.0.0

注意这里容器内部还是使用的flask run的方法来运行的,但是如果在启动命令后加了flask run -h 0.0.0.0会替代上文的Dockerfile里面配置文件最后那句CMD ["flask","run"]
8. 这样启动之后直接就可以在linux宿主机内使用

curl localhost:8080

来进行访问了

版权声明:本文为blinktooo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/blinktooo/p/12852254.html