美文网首页Python
Centos下的纯命令记录Docker学习(9)-docker

Centos下的纯命令记录Docker学习(9)-docker

作者: 小钟钟同学 | 来源:发表于2020-11-13 15:48 被阅读0次

背景

一个服务运行往往依赖多个服务。完整的服务链一般肯定是由多个服务进行组成,所以一键的部署相关的服务也是有必要。

实践

服务的调用链示意图:


image.png

完整项目图示:


image.png

(1)flask api 服务搭建

#!/usr/bin/evn python
# coding=utf-8

from flask import Flask
app = Flask(__name__)

# reids模块
import redis   # 导入redis 模块
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 数据库的连接模块
import psycopg2
# 获得连接



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


@app.route("/set/redis")
def set_redis():
    r.set('name', '我是redis缓存中的-设置redis数据成功')  # 设置 name 对应的值
    return '设置redis数据成功'

@app.route("/get/redis")
def get_redis():
    return r.get('name')  if  r.get('name') else  '没有数据'  # 设置 name 对应的值

@app.route("/conn/pg")
def conn_pg():
    # 获得游标对象
    conn = psycopg2.connect(database="xiaozhongceshi", user="postgres", password="123456", host="localhost", port="5432")
    cursor = conn.cursor()
    # sql语句
    sql = "SELECT VERSION()"
    # 执行语句
    cursor.execute(sql)
    # 获取单条数据.
    data = cursor.fetchone()
    # 打印
    print("database version : %s " % data)
    # 事物提交
    conn.commit()
    # 关闭数据库连接
    conn.close()
    return '连接数据库查询成功'+str(data)


if __name__ == "__main__":
    app.run(debug=True,port=5000)

(2)生产服务依赖所需的requirements.txt

click==7.1.2
Flask==1.1.2
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
psycopg2==2.8.6
redis==2.10.6
Werkzeug==1.0.1

(3)编写Flask模块下的Dockerfile,用于构建flask api镜像

修正前:
FROM python:3.6

WORKDIR /data/Project/dockerflask

COPY requirements.txt ./

RUN pip install --no-cache-dir --default-timeout=100  -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

CMD ["gunicorn", "main:app", "-c", "./gunicorn.conf"]

修正后:
FROM python:3.6

WORKDIR /data/Project/dockerflask

COPY /data/dockerflask/requirements.txt ./

RUN pip install --no-cache-dir --default-timeout=100 -r requirements.txt -i [https://pypi.tuna.tsinghua.edu.cn/simple](https://pypi.tuna.tsinghua.edu.cn/simple)

COPY . .

CMD ["gunicorn", "main:app", "-c", "./gunicorn.conf"]


(4)编写nginx挂载出来的配置文件,用于负载均衡多服务

upstream dcokerflaskapi {

    server dockerflask_01_yaml weight=1 max_fails=0 fail_timeout=12s; # PS:这服务dockerflask_01_yaml名称不需要再加端口号了,容器已自动映射别名进行关联和端口的绑定了
    server dockerflask_02_yaml weight=1 max_fails=0 fail_timeout=12s; # PS:这服务dockerflask_02_yaml名称不需要再加端口号了,容器已自动映射别名进行关联和端口的绑定了
}

server {
    listen 80;
    server_name 192.168.219.130; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://dcokerflaskapi ; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

(5)编写reids挂载出来的配置文件,修改redis配置信息

配置远程访问(生产环境请勿开启)
bind 127.0.0.1 ---->bind 0.0.0.0 

protected-mode no #默认yes,开启保护模式,限制为本地访问

daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败

databases 16 #数据库个数(可选)

appendonly yes #redis持久化(可选)

requirepass  密码 #配置redis访问密码

(6)编写对应服务编排文件docker-compose.yaml

version: "3.3"
services:
    dockerflask_nginx:
        container_name: dockerflask_nginx_yaml
        restart: always
        image: nginx
        privileged: true
        volumes:
           - /data/dockerflask/nginx/nginx_api.conf:/etc/nginx/conf.d/default.conf
        ports:
           - "80:80"

    dockerflask_pgdb:
        container_name: dockerflask_pg_yaml
        restart: always
        image: postgres:9.4
        environment:
          POSTGRES_PASSWORD: 123456
        volumes:
           - /data/dockerflask/pgdata:/var/lib/postgresql/data
        ports:
           - "5432:5432"

     dockerflask_redis:
        container_name:  dockerflask_redis_yaml
        restart: always
        image: redis:4.0.14
        volumes:
           - /data/ dockerflask/redis/redis.conf:/etc/redis/redis.conf
           - /data/dockerflask/redis/redisdata:/data
        command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
        ports:
           - "6379:6379"

     dockerflask_api1:
        image: dockerflask:latest
        #build: .构建镜像的Dockerfile目录
        container_name: dockerflask_01_yaml
        restart: always
        ports:
            - "1255:80"
        depends_on:
            - flask_web_stj_redis
            - flask_web_stj_pgdb

    fldockerflask_api2:
        image: dockerflask:latest
        #build: . 构建镜像的Dockerfile目录
        container_name: dockerflask_02_yaml
        restart: always
        ports:
            - "1256:80"
        depends_on:
            - dockerflask_nginx
            - dockerflask_redis
            - dockerflask_pgdb

(7)上传项目到linux目录下

image.png

(8)构建基础的dockerflask:latest 镜像,用途后续的docker-compose进行编排的使用(可选,直接的使用build)

1:进入的需要进行构建的目录下

[root@localhost data]# cd dockerflask/docker/flask/
[root@localhost flask]# docker build -t='dockerflask' .
Sending build context to Docker daemon  2.048kB
Step 1/6 : FROM python:3.6
 ---> 1297140c6dd2
Step 2/6 : WORKDIR /data/Project/web_statistics
 ---> Using cache
 ---> 6a8302b34c3a
Step 3/6 : COPY requirements.txt ./
COPY failed: stat /var/lib/docker/tmp/docker-builder473572026/requirements.txt: no such file or directory
[root@localhost flask]#



临时策略:


image.png

继续构建:


[root@localhost flask]# docker build -t='dockerflask' .
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM python:3.6
 ---> 1297140c6dd2
Step 2/6 : WORKDIR /data/Project/dockerflask
 ---> Using cache
 ---> 4c12c20e4454
Step 3/6 : COPY requirements.txt ./
 ---> a8d1c4627b9e
Step 4/6 : RUN pip install --no-cache-dir --default-timeout=100  -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
 ---> Running in 60ec63aacbb2
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting click==7.1.2
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d2/3d/fa76db83bf75c4f8d338c2fd15c8d33fdd7ad23a9b5e57eb6c5de26b430e/click-7.1.2-py2.p
Collecting Flask==1.1.2
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f2/28/2a03252dfb9ebf377f40fba6a7841b47083260bf8bd8e737b0c6952df83f/Flask-1.1.2-py2.p
Collecting gunicorn==20.0.4
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/69/ca/926f7cd3a2014b16870086b2d0fdc84a9e49473c68a8dff8b57f7c156f43/gunicorn-20.0.4-p
Collecting itsdangerous==1.1.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.
Collecting Jinja2==2.11.2
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/30/9e/f663a2aa66a09d838042ae1a2c5659828bb9b41ea3a6efa20a20fd92b121/Jinja2-2.11.2-py2
Collecting MarkupSafe==1.1.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/b2/5f/23e0023be6bb885d00ffbefad2942bc51a620328ee910f64abe5a8d18dd1/MarkupSafe-1.1.1-
Collecting psycopg2==2.8.6
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/fd/ae/98cb7a0cbb1d748ee547b058b14604bd0e9bf285a8e0cc5d148f8a8a952e/psycopg2-2.8.6.ta
Collecting redis==2.10.6
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/3b/f6/7a76333cf0b9251ecf49efff635015171843d9b977e4ffcf59f9c4428052/redis-2.10.6-py2.py3-none-any.whl (64 kB)
Collecting Werkzeug==1.0.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Requirement already satisfied: setuptools>=3.0 in /usr/local/lib/python3.6/site-packages (from gunicorn==20.0.4->-r requirements.txt (line 3)) (50.3.2)
Building wheels for collected packages: psycopg2
  Building wheel for psycopg2 (setup.py): started
  Building wheel for psycopg2 (setup.py): finished with status 'done'
  Created wheel for psycopg2: filename=psycopg2-2.8.6-cp36-cp36m-linux_x86_64.whl size=462255 sha256=fb24a1a7ba10f288d71e230e4070bdd67f88ae2d158f2b1450fe60a2bef08e8b
  Stored in directory: /tmp/pip-ephem-wheel-cache-nk0cfshd/wheels/60/09/36/65ac0167bb3b0eeda3c0ce12fead322af1c2e680777b9e9a4b
Successfully built psycopg2
Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, gunicorn, psycopg2, redis
Successfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 gunicorn-20.0.4 itsdangerous-1.1.0 psycopg2-2.8.6 redis-2.10.6
Removing intermediate container 60ec63aacbb2
 ---> 903ed2a138b0
Step 5/6 : COPY . .
 ---> 63b78acf2d6f
Step 6/6 : CMD ["gunicorn", "main:app", "-c", "./gunicorn.conf"]
 ---> Running in 9aa5b4d7cdae
Removing intermediate container 9aa5b4d7cdae
 ---> e8a8c6b861c3
Successfully built e8a8c6b861c3
Successfully tagged dockerflask:latest
[root@localhost flask]#

(9)停止当前的一些运行的容器,避免端口占用导致服务启动异常


[root@localhost dockerflask]# docker stop $(docker ps -a -q)

(10)修改docker-compose.yaml,注意缩进问题

version: "3.3"
services:
  dockerflask_nginx:
    container_name: dockerflask_nginx_yaml
    restart: always
    image: nginx
    privileged: true
    volumes:
        - /data/dockerflask/nginx/nginx_api.conf:/etc/nginx/conf.d/default.conf
    ports:
        - "80:80"

  dockerflask_pgdb:
    container_name: dockerflask_pg_yaml
    restart: always
    image: postgres:9.4
    environment:
          POSTGRES_PASSWORD: 123456
    volumes:
        - /data/dockerflask/pgdata:/var/lib/postgresql/data
    ports:
          - "5432:5432"

  dockerflask_redis:
    container_name:  dockerflask_redis_yaml
    restart: always
    image: redis:4.0.14
    volumes:
        - /data/ dockerflask/redis/redis.conf:/etc/redis/redis.conf
        - /data/dockerflask/redis/redisdata:/data
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    ports:
        - "6379:6379"

  dockerflask_api1:
    image: dockerflask:latest
    container_name: dockerflask_01_yaml
    restart: always
    ports:
      - "1255:80"
    depends_on:
      - dockerflask_nginx
      - dockerflask_redis
      - dockerflask_pgdb

  dockerflask_api2:
    image: dockerflask:latest
    container_name: dockerflask_01_yaml
    restart: always
    ports:
      - "1256:80"
    depends_on:
      - dockerflask_nginx
      - dockerflask_redis
      - dockerflask_pgdb

(11)执行构建

root@localhost dockerflask]# docker-compose -f docker-compose.yaml up -d
Starting dockerflask_redis_yaml ...
Starting dockerflask_pg_yaml    ...
Starting dockerflask_nginx_yaml ... error

ERROR: for dockerflask_nginx_yaml  Cannot start service dockerflask_nginx: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449Starting dockerflask_redis_yaml ... done
Starting dockerflask_pg_yaml    ... done
\\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

ERROR: for dockerflask_nginx  Cannot start service dockerflask_nginx: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/data/dockerflask/nginx/nginx_api.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/764a37ae2bdc6bbc80d9ec749988941e52579f97d7beb8408127bccd6243fd37/merged\\\" at \\\"/var/lib/docker/overlay2/764a37ae2bdc6bbc80d9ec749988941e52579f97d7beb8408127bccd6243fd37/merged/etc/nginx/conf.d/default.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.
[root@localhost dockerflask]#

还是出现异常,主要是文件目录的问题

调整项目目录


image.png

更改配置文件(主要调整目录)

version: "3.3"
services:
  dockerflask_nginx:
    container_name: dockerflask_nginx_yaml
    restart: always
    image: nginx
    privileged: true
    volumes:
        - /data/dockerflask/nginx_api.conf:/etc/nginx/conf.d/default.conf
    ports:
        - "80:80"

  dockerflask_pgdb:
    container_name: dockerflask_pg_yaml
    restart: always
    image: postgres:9.4
    environment:
          POSTGRES_PASSWORD: 123456
    volumes:
        - /data/dockerflask/pgdata:/var/lib/postgresql/data
    ports:
          - "5432:5432"

  dockerflask_redis:
    container_name:  dockerflask_redis_yaml
    restart: always
    image: redis:4.0.14
    volumes:
        - /data/ dockerflask/redis.conf:/etc/redis/redis.conf
        - /data/dockerflask/redisdata:/data
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    ports:
        - "6379:6379"

  dockerflask_api1:
    image: dockerflask:latest
    container_name: dockerflask_01_yaml
    restart: always
    ports:
      - "1255:80"
    depends_on:
      - dockerflask_nginx
      - dockerflask_redis
      - dockerflask_pgdb

  dockerflask_api2:
    image: dockerflask:latest
    container_name: dockerflask_02_yaml
    restart: always
    ports:
      - "1256:80"
    depends_on:
      - dockerflask_nginx
      - dockerflask_redis
      - dockerflask_pgdb

再次的停止和删除所有容器(慎用)

$  docker stop $(docker ps -a -q) #  stop停止所有容器
$  docker  rm $(docker ps -a -q)  #  remove删除所有容器
[root@localhost dockerflask]# docker ps -a

再次启动


[root@localhost dockerflask]# docker-compose -f docker-compose.yaml up -d
Creating dockerflask_redis_yaml ... done
Creating dockerflask_pg_yaml    ... done
Creating dockerflask_nginx_yaml ... done
Creating dockerflask_01_yaml    ... done
Creating dockerflask_02_yaml    ... done
[root@localhost dockerflask]#

(12)验证流程接口,首页正常,但是请求redis的时候异常,

访问发现无法连接:
查看日志信息,提示异常


[root@localhost dockerflask]# docker logs -f dockerflask_nginx_yaml

2020/11/13 06:38:41 [emerg] 1#1: host not found in upstream "dockerflask_01_yaml" in /etc/nginx/conf.d/default.conf:3
nginx: [emerg] host not found in upstream "dockerflask_01_yaml" in /etc/nginx/conf.d/default.conf:3

修改docker-compose.yaml配置文件,新增连接:


image.png

注意事项点:

1:flask 容器内部启动的端口号和docker-compose.yaml端口号问题
2:注意查阅flask容器内部请求的日志的情况
image.png image.png

请求redis异常信息


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/data/Project/web_statistics/main.py", line 24, in set_redis
    r.set('name', '我是redis缓存中的-设置redis数据成功')  # 设置 name 对应的值
  File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 1171, in set
    return self.execute_command('SET', *pieces)
  File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 673, in execute_command
    connection.send_command(*args)
  File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 610, in send_command
    self.send_packed_command(self.pack_command(*args))
  File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 585, in send_packed_command
    self.connect()
  File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 489, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 101 connecting to localhost:6379. Network is unreachable.


(13)修改代码

修改为容器内的主机:

image.png image.png

(14)停止和删除容器且删除镜像,再重构flask镜像

再访问redis接口


image.png

进入到redis容器内部查询情况:


[root@localhost dockerflask]# docker exec -it dockerflask_redis_yaml bash
root@3fb26026e7c7:/data# redis-cli --raw
127.0.0.1:6379> GET 'name'
NOAUTH Authentication required.

127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> GET 'name'
我是redis缓存中的-设置redis数据成功
127.0.0.1:6379>

访问数据库接口
出现502异常:


image.png

查看日志信息:


image.png
工具连接数据库,然后创建数据库
image.png
然后再请求链接数据库访问:
image.png

补充负载实现的另一个方式

修改docker-compose.yaml文件
修改点:多开的容器不能指定container_name

version: "3.3"
services:
  dockerflask_nginx:
    container_name: dockerflask_nginx_yaml
    restart: always
    image: nginx
    privileged: true
    volumes:
        - /data/dockerflask/nginx_api.conf:/etc/nginx/conf.d/default.conf
    ports:
        - "80:80"
    links:
        - dockerflask_apisclasl

  dockerflask_pgdb:
    container_name: dockerflask_pg_yaml
    restart: always
    image: postgres:9.4
    environment:
          POSTGRES_PASSWORD: 123456
    volumes:
        - /data/dockerflask/pgdata:/var/lib/postgresql/data
    ports:
          - "5432:5432"

  dockerflask_redis:
    container_name:  dockerflask_redis_yaml
    restart: always
    image: redis:4.0.14
    volumes:
        - /data/ dockerflask/redis.conf:/etc/redis/redis.conf
        - /data/dockerflask/redisdata:/data
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    ports:
        - "6379:6379"

  dockerflask_apisclasl:
    image: dockerflask:latest
    restart: always
    ports:
      - "80"
    depends_on:
      - dockerflask_redis
      - dockerflask_pgdb

启动命令:开启 --scale dockerflask_apisclasl=3 3个服务


[root@localhost dockerflask]# docker-compose -f docker-compose.yaml up --scale dockerflask_apisclasl=3  -d

查看启动结果

[root@localhost dockerflask]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                    NAMES
1703d89eba37        nginx                "/docker-entrypoint.…"   18 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp       dockerflask_nginx_yaml
8a76885b3a0f        dockerflask:latest   "gunicorn main:app -…"   19 seconds ago       Up 17 seconds       0.0.0.0:32771->80/tcp    dockerflask_dockerflask_apisclasl_4
108e4636ad40        dockerflask:latest   "gunicorn main:app -…"   19 seconds ago       Up 17 seconds       0.0.0.0:32770->80/tcp    dockerflask_dockerflask_apisclasl_3
21ed38073514        dockerflask:latest   "gunicorn main:app -…"   20 seconds ago       Up 19 seconds       0.0.0.0:32769->80/tcp    dockerflask_dockerflask_apisclasl_2
78b09529fe75        postgres:9.4         "docker-entrypoint.s…"   About a minute ago   Up 19 seconds       0.0.0.0:5432->5432/tcp   dockerflask_pg_yaml
cbb631de8347        redis:4.0.14         "docker-entrypoint.s…"   About a minute ago   Up 19 seconds       0.0.0.0:6379->6379/tcp   dockerflask_redis_yaml

总结

1:docker-compose.yaml 文件格式的缩进问题
2:flask 容器内部启动的端口号和docker-compose.yaml端口号问题
3:注意查阅flask容器内部请求的日志的情况
4:容器内内互联的定义了镜像名的,对于的HOST是走对应的名称
5:注意NGINX负载均衡器上的HOST,对应的是容器的名称

相关文章

网友评论

    本文标题:Centos下的纯命令记录Docker学习(9)-docker

    本文链接:https://www.haomeiwen.com/subject/xfiubktx.html