Docker安装ElasticSearch(实现全文检索)

1 Docker

1.1 毛线是docker?

1.1.1 Docker是使用最广泛的开源容器引擎
  • 容器:

    1容器是一个操作系统级别下的虚拟化技术,运行一个容器就行运行一个进程一样

    2容器依赖linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)

1.1.2 一种操作系统基本的 虚拟化技术

我们使用的VMware虚拟机就是虚拟化技术
一个操作系统下,虚拟出来,其他操作系统的机器

1.1.3 一种简单的应用程序打包工具
1.1.4 依赖Linux内核特性

Namespace(资源隔离) 和 Cgroup(资源限制)

1.2 资源隔离和资源限制

  • 资源隔离:

    1)Linux Namespaces 机制提供一种资源隔离方案,每个namespace看上去就像一个单独的

Linux系统。

​ 2)PID ,IPC(进程通信), Network 等系统资源不再是全局性的,而是属于某个特定的

Namespace。

​ 3)每个namespace下的 资源对于其他namespace 下的资源都是透明, 不可见的 。

​ 4)系统中可以同时存在 两个进程号为0,1,2的进程 ,由于 属于不同的namespace ,所以它们

之间并不冲突。

​ 5)而在用户层面上只能看到属于用户自己namespace下的资源,例如使用ps命令只能列出自

己namespace下的进程。

​ 6)这样 每个namespace看上去就像一个单独的Linux系统 。

  • 资源限制:

    1)为了让容器中的进程更加可控, Docker 使用 Linux cgroups 来限制容器中的进程允许使

用的系统资源 。

​ 2)可以在启动容器是指定每个容器可以使用的 网络、磁盘、CPU以及内存等

1.3 ubuntu安装docker

1.3.1 安装docker
# 1.卸载旧版本 
sudo apt-get remove docker docker-engine docker.io containerd runc 

# 2.更新ubuntu的apt源索引 
# 修改apt国内源为中科大源 
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/' /etc/apt/sources.list sudo apt update

# 3.安装包允许apt通过HTTPS使用仓库 
sudo apt-get install  apt-transport-https  ca-certificates  curl  software-properties-common

# 4.添加Docker官方GPG key 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 

# 5.设置Docker稳定版仓库(国内使用都用用国内的源) 
# 5.1 设置使用阿里云 
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 

# 5.2 设置使用官方,很慢(不建议用这个) 
sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable" 

# 6.添加仓库后,更新apt源索引 
sudo apt-get update 

# 7.安装最新版Docker CE(社区版) 
sudo apt-get install docker-ce 

# 8.检查Docker CE是否安装正确 
sudo docker run hello-world
1.3.2 docker默认是国外源可以设置成国内镜像源
root@linux-node1 django-docker]  # vim /etc/docker/daemon.json   # 设置docker镜像源 
{ 
    "registry-mirrors": ["http://hub-mirror.c.163.com"] 
}
或者
{ 
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 
}

[root@linux-node2 ~]	# systemctl daemon-reload 		# 重载文件 
[root@linux-node2 ~]	# systemctl restart docker  	# 重启docker生效
1.3.3 docker启动设置
# 启动Docker服务并设置开机启动 
systemctl start docker 
systemctl enable docker
1.3.4 docker简单使用(创建一个ngixn容器)
# 1、创建一个nginx容器 
docker run -it nginx 

# 2、查看docker运行的容器(可以获取到这个容器的id) 
docker ps 

# 3、访问这个容器 
# 进入这个nginx容器(进入的文件系统和宿主机是完全隔离的,有自己独立的文件系统) 
docker exec -it 73877e65c07d bash 

# 4、查看当前容器的 IP 
docker inspect 73877e65c07d 		# 73877e65c07d是通过docekr ps查看到的容器ID 
curl 172.17.0.2 					# 测试这个nginx容器是否可以访问

2 Docker基本使用

2.1 镜像常用管理命令

[root@linux-node4 diff]# docker help 					# 查看docker帮助 
[root@linux-node4 diff]# docker image --help 			# 查看 docker中 镜像 相关帮助 
[root@linux-node4 diff]# docker image ls 				# 查看当前所有镜像 
[root@linux-node4 diff]# docker image inspect nginx 	# 查看指定镜像 (nginx镜像)详细信息 
[root@linux-node4 diff]# docker pull nginx:1.14 		# 下载指定版本镜像 nginx 
[root@linux-node4 diff]# docker image rm nginx:1.14 	# 删除nginx 1.14版 本

2.2 docker创建容器常用命令

  • docker run基本使用
root@dev:~# docker run -itd nginx 
root@dev:~# docker ps 
root@dev:~# docker rm -f e182a69f841d
  • docker run常用参数
-d 					# 后台运行容器,并返回容器ID; 
-i 					# 以交互模式运行容器,通常与 -t 同时使用; 
-t 					# 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 
-P 					# 随机端口映射,容器内部端口随机映射到主机的高端口 
-p 					# 指定端口映射,格式为:主机(宿主)端口:容器端口 
--name="nginx-lb" 	# 为容器指定一个名称; 
--dns 8.8.8.8 		# 指定容器使用的DNS服务器,默认和宿主一致;
  • docker使用
[root@linux-node4 diff]			# docker container run -d --name web3 -e test=123456 -p 8800:80 -h webhostname --restart always nginx 
-d 								# 后台启动nginx容器 
--name web3 					# 自定义容器名字(默认会是一段随机字符串) 
-e test=123456 					# 启动容器添加变量 test=123456 (echo $test) 
-p 8800:80 						# 宿主机的8800端口映射到docker容器的80端口中 
-h webhostname 					# docker容器主机名 (a300f394af88) 
--restart always 				# 宿主机重启自动拉起这个docker容器 nginx # 使用这个nginx镜像启动容器 注:http://192.168.56.12:8800/ 访问这个docker nginx 
[root@linux-node4 diff]			# docker logs web # 查看上 面启动的web容器的日志 
[root@linux-node4 diff]			# docker exec -it web bash # 进入容器web

2.3 docker安装ES

2.3.1 拉取docker镜像
# 从仓库拉取镜像 
sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0 
2.3.2 使用docker安装ES
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch delron/elasticsearch-ik:2.4.6-1.0 
2.3.3 测试结果
http://192.168.56.100:9200/

2.4 具体代码

2.4.1 settings.py
INSTALLED_APPS = [
    'haystack', # haystack要放在应用的上面
    'apps.user.apps.UserConfig',        # 用户app
]


TEMPLATES = [
    {
        'DIRS': [os.path.join(BASE_DIR,'templates')],
    },
]

# ES引擎
HAYSTACK_CONNECTIONS = {
      'default': {
              'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
              'URL': 'http://127.0.0.1:9200/',     # Elasticsearch服务器ip地址,端口号固 定为9200
              'INDEX_NAME': 'syl'                   # Elasticsearch建立的反向索引库的名称
      },
}

# 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
2.4.2 views.py
from syl import settings
from django.core.paginator import InvalidPage, Paginator
from haystack.forms import ModelSearchForm
from django.http import JsonResponse, HttpResponse
import json

# 如果settings.py中配置就是用settings中配置的,否则就每页15条
RESULTS_PER_PAGE = getattr(settings, 'HAYSTACK_SEARCH_RESULTS_PER_PAGE', 15)

def course_index_search(request):
    # 1.获取前端传过来的关键字(查询数据)
    query = request.GET.get('q', None)
    page = int(request.GET.get('page', 1))  # 第几页
    page_size = int(request.GET.get('page_size', RESULTS_PER_PAGE))     # 每页多少条
    # 2.获取查询条件,进行查询
    if query:
        form = ModelSearchForm(request.GET, load_all=True)      # 将查询条件传递给查询对象
        if form.is_valid():
            results = form.search()     # 查询出来的最终数据
        else:
            results = []
    else:
        return HttpResponse({"code": 404, "msg": 'No file found!', "data": []})
    # 3.对结果集进行分页
    paginator = Paginator(results, page_size)
    try:
        page = paginator.page(page)     # 从分好的页中拿第几页
    except InvalidPage:                 # 如果分页出错
        return JsonResponse({"code": 404, "msg": 'No file found!', "data": []})
    # 4.把查询的分页结果集对象转换成json格式
    jsondata = []
    for result in page.object_list:  # 分页后的课程查询结果
        data = {
            'id': result.object.id,
            'title': result.object.title,
            'desc': result.object.desc,
            'img': request.scheme + '://' + request.META['HTTP_HOST'] + result.object.img.url,
            # 'follower': result.object.follower,
            'learner': result.object.learner,
            'status': result.object.status,
            'course_type': result.object.course_type.id
        }
        jsondata.append(data)
        result = {
            "code": 200,
            "msg": 'Search successfull',
            "data": {"count": page.paginator.count, "results": jsondata}
        }
        # return JsonResponse(result)
        return HttpResponse(json.dumps(result, ensure_ascii=False))
2.4.3 构建倒排索引
python manage.py rebuild_index
2.4.4 测试接口
http://192.168.56.100:8888/search/?q=入门&page=1&page_size=1

3 安装常用报错

3.1 给指定ubuntu更改源

3.1.1 查看ubuntu版本
cat /etc/issue

# Ubuntu 18.04.5 LTS 
 l
3.1.2 这里以 18.04.5为例更改源
sudo gedit /etc/apt/sources.list
  • 把这几行代码放在最上面
    • 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
  • 还可以加入阿里源
    • 阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  • 还可以加入中科大
    • 中科大
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
  • save文件
sudo apt-get update
sudo apt-get upgrade
  • 注意!!!
# Ubuntu 18.04 在系统设置里面是找不到软件源设置界面按钮的(找了好久都没找到T-T),所以需要一些指令帮助启动图形界面以便设置软件源。
sudo update-manager -c -d
  • 设置源

3.2 容器报错

  • 使用docker 出现Error response from daemon: Conflict. The container name is already in use
  • 解决方法:

1)给容器换一个名字, 比如说 docker run -it --name=mycentos2 centos:7 /bin/bash, 可以解决问题.
2)将原来的容器删除

  • 查询当前容器:
docker container ls -all
  • 删除存在的容器
删除当前容器:
docker container rm 容器名
# 提示: 这一步要确定删除容器没问题的情况下, 才可以做

3.3 显示没有安装elasticsearch

  • pycharm中要安装elasticsearch
原文地址:https://www.cnblogs.com/mapel1594184/p/13962275.html