Docker简介与搭建ElasticSearch实例
Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是Docker提出的”Build once,Run anywhere”。
首先,需要了解一下几个概念:镜像,容器,仓库
- 镜像(Image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
- 容器(Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
- 仓库(Registry):仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
Docker安装
docker只能运行在linux环境,windows下是没办法直接运行docker的,所以如果要在windows下跑docker需要安装linux虚拟机环境。
Win10专业版安装
1.启用Hyper-V
打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:
点击确定后,启用完毕会提示重启系统,我们可以稍后再重启。
2.安装Docker
Docker下载地址为:https://store.docker.com/editions/community/docker-ce-desktop-windows 点击如图处即可下载安装包:
下载完成后运行安装包,安装完成后界面如图:
单击Close and log out
,这个时候我们重启一次电脑。
3.启动Docker
在桌面找到Docker for Windows快捷方式,双击启动即可!启动成功后托盘处会有一个小鲸鱼的图标。打开命令行输入命令:docker version
可以查看当前docker版本号,如图:
更换镜像源地址,中国官方镜像源地址为:https://registry.docker-cn.com,点击托盘处docker图标右键选择-Settings,然后修改如下:
点击Apply后会重启Docker。
载入测试镜像测试,输入命名docker run hello-world
可以加载测试镜像来测试。如图:
Win10家庭版安装
由于win10家庭版,没有自带Hyper-V功能,所以我们要采用另外一种方式安装:
下载docker-toolbox
直接安装
下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
双击下载好的程序:
注意:安装路径千万不要有中文!
对最后一项打上钩,安装虚拟机环境VirtualBox
:
注意:如果安装完成后,运行提示找不到boot2docker.iso
镜像
将toolbox安装目录下的boot2docker.iso
拷贝到这个目录C:\Users\xxx\.docker\machine\cache
设置windows目录共享
采用docker-toolbox安装的docker,实际上是启用的docker-machine作为宿主机,docker是在该宿主机上启动的容器。需要先让该宿主机和windows实现目录共享。
查看虚拟器ip:1
docker-machine ip
进入虚拟机:1
docker-machine ssh [default]
设置国内镜像源
- 打开终端执行命令:
docker-machine ssh
- 修改配置文件:
sudo vi /var/lib/boot2docker/profile
在--label provider=virtualbox
的下一行添加:--registry-mirror https://xxx.mirror.aliyuncs.com
- 重启docker:
docker-machine restart
Linux安装
使用yum
进行安装
1.首先安装依赖项
1 |
|
2.添加软件镜像源
1 |
|
3.安装docker-ce
1 |
|
4.启动docker服务
1 |
|
设置国内镜像源
在/etc/docker/daemon.json
中添加:1
2
3
4{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com`"]
}
重启docker服务1
systemctl restart docker
检查是否配置成功1
2
3
4docker info|grep Mirrors -A 1
#输出
#Registry Mirrors:
# https://xxx.mirror.aliyuncs.com/
配置个人阿里云镜像源地址
访问https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
点击镜像加速器查看地址:
实例:搭建ElasticSearch环境
安装ElasticSearch
查看镜像版本
有2种方式可以查看要安装的软件有没有docker版本:
- 通过docker仓库官网搜索镜像 https://hub.docker.com/
- 通过命令搜索
1
docker search elasticsearch
拉取镜像
1 |
|
如果不加版本号,默认选择最新版本
启动容器
1 |
|
注意:
9200 是供 http 访问端口,9300 是供 tcp 访问的端口,如果不做端口映射,浏览器就不能访问 elasticsearch 的服务。
如果需要实现数据持久化的话,可以在启动时通过 -v 参数将 docker host 上的目录 mount 到 Elasticsearch 容器里。其中 /es/data
和 /es/logs
是宿主机的目录地址。
安装Elasticsearch-Head
安装
1 |
|
修改head插件的跨域访问问题
进入elasticsearch容器,打开
elasticsearch.yml
1
2
3
4docker ps -a #拿到运行容器elasticsearch的id
docker exec -it ******(容器id) /bin/bash
cd ./config
vim elasticsearch.yml在
elasticsearch.yml
中添加:1
2http.cors.enabled: true
http.cors.allow-origin: "*"重启elasticsearch容器
1
docker restart es
提交报application/x-www-form-urlencoded不允许的错误
进入head容器后,查找文件
vendor.js
1
find . -name vendor.js # /usr/src/app/_site/vendor.js
将文件拷贝到宿主机器:
1
docker cp 11cc:/usr/src/app/_site/vendor.js vendor.js
修改文件
vendor.js
,修改第6886行内容:contentType:”application/x-www-form-urlencoded”,改成contentType:”application/json”,重启head服务:
1
docker restart es-head
Docker启动参数
docker run最常用的3个参数:
Options | Mean |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
-d | 后台运行容器,并返回容器ID |
其他参数:
Options | Mean |
---|---|
-a stdin | 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 |
-P | 随机端口映射,容器内部端口随机映射到主机的高端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
–name=“nginx-lb” | 为容器指定一个名称 |
–dns 8.8.8.8 | 指定容器使用的DNS服务器,默认和宿主一致 |
–dns-search example.com | 指定容器DNS搜索域名,默认和宿主一致 |
-h “mars” | 指定容器的hostname |
-e username=“ritchie” | 设置环境变量 |
–env-file=[] | 从指定文件读入环境变量 |
–cpuset=“0-2” or —cpuset=“0,1,2” | 绑定容器到指定CPU运行 |
-m | 设置容器使用内存最大值 |
–net=“bridge” | 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 |
–link=[] | 添加链接到另一个容器 |
–expose=[] | 开放一个端口或一组端口 |
–volume , -v | 绑定一个卷 |
生成自定义镜像
生成镜像
找到要发布的文件夹publish
,在和publish
同一级下,创建dockerfile
文件,内容如下:
1 |
|
dockerfile指令介绍:
FROM
指定定制镜像的基础镜像
MAINTAINER
镜像的作者信息,只是起标识作用
RUN
在docker build过程中执行的命令
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径
WORKDIR
指定的工作目录,必须是提前创建好的
EXPOSE
声明镜像的开放端口,多个连续端口号
EXPOSE 12300-22300
CMD
类似于 RUN 指令,用于运行程序,不同之处是在docker run时执行
生成镜像执行命令:
1 |
|
将镜像导出到文件
1 |
|
部署到服务器
将userbehaviorapi.tar拷贝到服务器
导入镜像1
docker load --input xxx.tar 或 docker load < xxx.tar
查看所有镜像看是否导入成功1
docker images ls
常用操作
设置容器开机重启
1.创建容器的时候,使用--restart=always
参数
1 |
|
—restart具体参数值详细信息:
- no - 容器退出时,不重启容器;
- on-failure - 只有在非0状态退出时才从新启动容器;
- always - 无论退出状态是如何,都重启容器;
2.非创建时,通过update
命令
1 |
|
设置容器时区和宿主机一致
有的docker镜像内置的是UTC标准时间,需将时区调整为UTC + (+0800),可以直接将宿主机配置拷贝到容器中
1 |
|
为已创建的容器添加端口映射
方法一
1.获取容器ip地址1
docker inspect `container_name` | grep IPAddress
2.设置iptable转发端口,将容器的8000端口映射到docker主机的8001端口
1 |
|
方法二
1.停止所有容器
停止容器会覆盖配置,所以先停止容器后再修改
2.停止docker服务
1 |
|
3.修改hostconfig.json
1 |
|
找到这个 PortBindings 值。在这个json集合里边追加新端口1
2
3
4
5
6
7
8
9
10
11
12
13
14"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
其中80/tcp对应的是容器内部的80端口,HostPort对应的是映射到宿主机的端口8080
4.修改config.v2.json
1 |
|
config.v2.json文件里边修改值 : config->ExposedPorts 和 networsettings->Ports1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
另:如果config.v2.json
里面没有ExposedPorts,在config.v2.json
里面添加一个配置项 “ExposedPorts”:{“80/tcp”:{}} , 将这个配置项添加到 “Tty”: true, 前面。
5.重启docker的守护进程
1 |
|
查看配置项是否已经修改成功
1 |
|
docker访问宿主机
有时docker是需要访问宿主机的,那么在docker中宿主机的ip是多少呢?
在宿主机执行ifconfig
,会看到 docker0 那个 ip,docker中可以使用这个ip地址来访问宿主机。