学习目标: · 掌握Docker基础知识,能够理解Docker镜像与容器的概念 · 完成Docker安装与启动 · 掌握Docker镜像与容器相关命令 · 掌握Tomcat Nginx 等软件的常用应用的安装 · 掌握docker迁移与备份相关命令 · 能够运用Dockerfile编写创建容器的脚本 · 能够搭建与使用docker私有仓库
1. 初始Docker
1.1 docker概念
我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境:
可能由于环境不同,而失败。如果我们能将开发环境需要的内容和war一起就好了。
•Docker 是一个开源的应用容器引擎
•诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
•Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
•容器是完全使用沙箱机制,相互隔离
•容器性能开销极低。
•Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
1.2 安装docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS 7 安装Docker。官网:https://www.docker.com
这五个命令从头到尾执行完即可。对于第一个和第四个需要花费好多时间、对于第四个,可能会失败(可能是网络原因,多执行两次),还有第四个中的y是确认的意思,如果没有,那么你安装过程中需要输入几次y确定。
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
1.2 安装docker(详细命令)
我这里步骤有点多,但是最全的。
1.yum 包更新到最新(该步骤耗时,可以省略该步骤),出现确认,点y
yum update
2.卸载之前docker(如果没有则不需要)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
3.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
4.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5.安装docker,出现输入的界面都按 y,但是我们安装命令有,就不需要了。
yum install -y docker-ce docker-ce-cli containerd.io
6.查看docker版本,验证安装成功
docker -v
7.启动docker
systemctl start docker
8.设置开机自启
systemctl enable docker
9.配置docker的阿里云镜像加速(每个人不一样,自己注册阿里云查看!),这是四个命令,但是我们一下子全复制,回车即可。(这是我的)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://upbi0ek8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
10.检查镜像是否配置成功
cat /etc/docker/daemon.json
11.重启docker
systemctl restart docker
1.3 docker架构
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
1.3.2 配置Docker镜像加速器
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
- USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
- 阿里云
- 网易云
- 腾讯云
怎么配置??
登录阿里云;选择控制台;点击面包按钮,有产品与服务,搜索镜像;选择容器镜像服务;找到最后的镜像加速器;复制操作,sudo可不加,加上也不错。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://upbi0ek8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2. Docker命令
2.1 进程相关命令
启动docker服务:
systemctl start docker
停止docker服务:
systemctl stop docker
重启docker服务:
systemctl restart docker
查看docker服务状态:
systemctl status docker
设置开机启动docker服务:
systemctl enable docker
查看版本
docker version
2.2 镜像相关命令
2.2.1 查看本地所有的镜像
docker images
o REPOSITORY:镜像名称
o TAG:镜像标签
o IMAGE ID:镜像ID
o CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
这些镜像都是存储在Docker的 /var/lib/docker 目录下。
这个命令后面有用
docker images -q # 查看所有镜像的id
2.2.2 搜索镜像:看网络上是否有这个镜像
docker search 镜像名称
2.2.3 拉取镜像:从Docker仓库拉去
docker pull 镜像名称 # 该条拉去的是最新镜像
docker pull 镜像名称:版本号 # 拉去对应版本
版本好查找需要到docker hub上面。版本号必须是这里面有的。
这里拉去最新的和5.0版本的redis
2.2.4 删除镜像
docker rmi 镜像id # 删除执行本地镜像
docker rmi 镜像名称:版本号 #这是另一种方式
# 如果你像删除所有镜像怎么办??可以一个一个删除
# 也可以用下面的命令 ,其实就是把docker images -q作为参数传入,即传入所有镜像id
docker rmi `docker images -q` # 删除本地所有镜像
下面这几个命令可以了解下
docker rmi -f 镜像ID # 删除单个镜像(-f 强制删除)
docker rmi -f 镜像名1:TAG 镜像名2:TAG # 删除多个镜像
docker rmi -f $(docker images -qa) # 删除所有镜像
2.3 容器相关命令
容器也是docker中的核心概念,镜像是创建容器的软件 , 容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。
如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用。比如网站、程序甚至是系统环境。
2.3.1 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包括未运行的
docker ps -f status=exited # 查看停止的容器
2.3.2 创建并启动容器
其实就是用镜像创建容器,镜像和容器的关系就是类和对象的关系。
docker run 参数
参数说明:
- -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
- -t:为容器重新非陪一个伪输入终端,通常与-i同时使用。即表示容器启动后会进入其命令行。
- -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。
- -it:创建的容器一般称为交互式容器;-id创建的容器一般称为守护式容器
- —name:为创建的容器命名。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
解释:-i其实是必加的,意思是如果没有客户端链接这个容器,容器不会自动关闭;-t和-d是选择的,且可以和-t连起来使用,应该是一般选择-d吧,-it是创建临时容器,且要直接进入容器,退出后容器就关闭了,-id是创建容器,但不会直接进入容器内部,退出容器,其也不会关闭;—name不用说,给容器命名。
注意这个/bin/bash可以省略。
上面属于创建两种容器的方式:前者是交互式容器,后者是守护式容器。对于交互式容器,创建即进入容器内部,并运行,退出则容器结束运行。对于守护式容器,要自己启动和关闭。
守护式容器和交互式容器的创建方式区别:
# ① -it 换成 -id
# ② 去掉后面的 /bin/bash
2.3.3 进入容器(守护式容器)
用-id创建的可以进入
docker exec -it 容器名称 (或者容器ID) /bin/bash
# 比如
docker exec -it mycentos10 /bin/bash
2.3.4 停止容器
docker stop 容器名称/容器id
2.3.5 启动容器
docker start 容器名称/容器id
2.3.6 删除容器
正在运行容器无法删除
# 删除容器的时候,如果容器在运行,会报错,必须先停止容器
docker rm 容器名称/id
你想一下子删除好几个
docker rm 容器名称1 容器名称2 容器名称3
# 当然你也可以,应该可以理解吧,q是只显示id,-a自然是所有的容器
docker rm `docker ps -aq`
2.3.7 查看容器信息(包含了容器IP地址)
docker inspect 容器名称/id
这个信息非常多,后面用到再说
通过inspect 可以查看的信息太多,如果想单纯有针对性的查看某个信息,也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
# 例如:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos11
2.3.8 文件拷贝
我们需要在容器内安装一个软件,软件首先需要有安装包,我们就需要把安装包拷贝到容器内。我们通常的操作是先把文件上传到宿主机,然后我们在将文件从宿主机拷贝到容器内的某个目录下面进行安装。
将linux宿主机中的文件拷贝到容器内可以使用命令:
从宿主机拷贝到容器
docker cp anaconda-ks.cfg mycentos2:/usr/local/
拷贝当前目录下的文件anaconda-ks.cfg,到 mycentos2 的 /urs/local/ 文件下面。
从容器拷贝到宿主机
# 拷贝到当前目录下
docker cp mycentos2:/usr/local/anaconda-ks.cfg ./
2.3.9 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器添加-v参数后边为宿主机目录:容器目录,例如:
# 创建并启动容器mycentos3,并挂载linux中的/usr/local/myhtml目录到容器的/usr/local/myhtml;也就是在linux中的/usr/local/myhtml中操作相当于对容器相应目录操作
docker run -di --name=容器的名字 -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
比如:docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7
3. Docker容器数据卷(看目录挂载,加深理解)
3.1 数据卷概念及作用
思考:
- Docker容器删除后,在容器中产生的数据还在吗? 不存在了,那不安全啊,还敢用吗?
- Docker容器和外部机器可以直接交换文件吗? 不能,比如这是tomcat容器,我们想在外部机器开发的war包部署进去,发现不行,这怎么行??
- 容器之间想要进行数据交互?
数据卷
- 数据卷是宿主机中的一个目录或文件(当然单纯一个目录不叫数据卷,要挂载到容器才算是数据卷)
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载 (可以实现两个容器的通信)
- 一个容器也可以被挂载多个数据卷
数据卷作用
1.目录必须是绝对路径
2.如果目录不存在,会自动创建
3.可以挂载多个数据卷
删除所有容器
拉取centos:7镜像,当然你也可以直接用redis镜像操作,我这里是为了和老师的保持一致,因此拉取了centos:7
这样启动容器就创建了数据卷:/root/data:就会在宿主机创建这个目录,如果有,就不会创建了;另外一个是在容器中创建/root/data_container目录,有则不创建。
docker run -it --name centos -v /root/data:/root/data_container centos:7
此时在宿主机创建文件,那么容器内部也就自动有了。
创建多个数据卷,其实没什么演示的,只是一个符号值得关注 \,如果你一行没有写完,可以用这个在另一行写。
此外,你在宿主机的/root/data也可以改写为~/data,但是容器就不可以。
两个容器如何通信呢?很简单,就是共用一个数据卷,这个就不写命令了,很简单。
那么怎么查看你给容器配置的数据卷呢?以后忘了怎么办?
就是上面提到的docker inspect 容器id,有两个地方可以查看。
3.3 配置数据卷容器
3.3.1 数据卷容器介绍
这个好奇怪,什么是数据卷,我们知道了,什么是容器我们也知道了。
那什么是数据卷容器呢?其实就是拿一个容器充当一个数据卷,好抽象啊!!!
数据卷容器
多容器进行数据交换
- 多个容器挂载同一个数据卷
- 数据卷容器
数据卷容器绑定到宿主机数据卷;然后两个容器绑定到数据卷容器;然后相当于这两个容器绑定到了宿主机的数据卷。
3.3.2 配置数据卷容器
1.创建启动c3数据卷容器,使用-v 参数 设置数据卷 注意,这里并没有宿主机目录,只有容器目录/volume,就是在数据卷容器内部创建这个目录,至于宿主机目录是自动生成的,后面可以用docker inspect 容器id查看。
docker run –it --name=c3 –v /volume centos:7 /bin/bash
2.创建启动c1 c2容器,使用 —volumes-from 参数 设置数据卷 这一步其实就是将两个容器绑定到数据卷容器
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash
这些都不演示了,大胆点尝试,没什么。至于宿主机的目录,是自动生成的。
3.3.3 数据卷容器的优势
对于3.2其实我们已经介绍过一种容器通信的方式,这里为什么还有数据卷容器??
答案:我不清楚,百度吧!!!!
3.4 数据卷小结
- 数据卷概念
- 宿主机的一个目录或文件
- 数据卷作用
- 容器数据持久化
- 客户端和容器数据交换
- 容器间数据交换
- 数据卷容器
- 创建一个容器,挂载一个目录,让其他容器继承自该容器( —volume-from )。
- 通过简单方式实现数据卷配置
4. Docker应用部署
4.1 MySQL部署
4.1.1 废话
案例:需求
在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。
案例:实现步骤
①搜索mysql镜像
②拉取mysql镜像
③创建容器
④操作容器中的mysql
其实所有部署基本都是这个步骤!
MySQL部署
•容器内的网络服务和外部机器不能直接通信
•外部机器和宿主机可以直接通信
•宿主机和容器可以直接通信
•当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务。
•这种操作称为:端口映射
容器不能和外部机器通信;但是容器可以和宿主机通信;宿主机可以和外部机器通信;因此搞一个端口映射,那么间接地就可以和外部机器通信。
4.1.2 命令走起,就是干
1.搜索mysql镜像,常见的不用搜,直接拉
2.拉取mysql镜像,之一查版本https://hub.docker.com/search?q=mysql&type=image# 可省略
docker search mysql
3.创建容器,设置端口映射、目录映射(数据、配置和日志)docker pull mysql:5.7
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
参数说明:docker run -id \
-p 3306:3306 \
--name=mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7
- -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
- -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录,其实则容器内部这个/etc/mysql/my.cnf是本来就存在的
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录,其实则容器内部这个/etc/mysql/conf.d是本来就存在的
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录,其实则容器内部这个/var/lib/mysql 是本来就存在的
- -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。root用户是默认的
4.进入容器,操作mysql
docker exec -it mysql /bin/bash
4.2 Tomcat部署
1.搜索tomcat镜像
docker search tomcat
2.拉取tomcat镜像,这个拉取最新tomcat
docker pull tomcat
3.创建容器,设置端口映射、目录映射(只需要映射webapp目录)
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
参数说明:
- -p 8080:8080:将容器的8080端口映射到主机的8080端口
- -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps
4.使用外部机器访问tomcat http://192.168.1.27:8080,当然里面没有内容,因此
在宿主机/root/tomcat目录下创建test文件夹,vim index.html,里面写
Hello tomcat docker
然后浏览器访问http://192.168.1.27:8080/test/index.html
4.3 Nginx部署
注意:nginx部署,需要自己在外部创建nginx.conf文件,因为里面要直接编辑一些内容。
1.搜索nginx镜像
docker search nginx
2.拉取nginx镜像,拉取最新的
docker pull nginx
3.创建容器,设置端口映射、目录映射,首先要创建文件nginx.conf,在里面编辑内容(复制)
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
docker run -id --name=nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
参数说明:
- -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
- -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
- -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
这里报错,解决方案如下,我这里就不解决了。
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/root/nginx/conf/conf/nginx.conf" to rootfs at "/etc/nginx/nginx.conf" caused: mount through procfd: 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.
https://blog.csdn.net/qierkang/article/details/92657302
4.使用外部机器访问nginx,访问默认是80端口,因此可以不写端口号。
如果想访问,需要在$PWD/html目录下创建index.html文件。
4.4 Redis部署
4.4.1 下载镜像文件
拉取最新版
docker pull redis
4.4.2 创建文件夹和redis.conf文件
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
4.4.3 创建实例并启动
最后一句是默认启动redis是用redis.conf配置文件启动。
docker run -p 6379:6379 --name redis --restart=always -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf --appendonly yes
此外:经过测试,开启持久化必须在redis-server之后。
4.4.4 使用redis镜像执行redis-cli命令
以前这个命令是/bin/bash进入控制台,这里直接链接redis客户端进行测试
docker exec -it redis redis-cli
进入后,我们可以设置和获取值。再次进入,依然有值。
但是假设我们关闭容器,再启动容器,这个里面还有值吗?答案,没有,即没有持久化!
见鬼了,我的竟然还存在,啥情况!!!!此问题先不管了。下面依然做持久化设置。
4.4.5 持久化设置(该步省略,启动容器已有)
vi /mydata/redis/conf/redis.conf
记得重启
docker restart redis
4.5 Elasticsearch
4.5.1 获取镜像
拉取elasticsearch镜像
# 存储和检索数据
docker pull elasticsearch:7.4.2
4.5.2 获取可视化镜像
拉取可视化界面,你也可以不需要,但是有界面不是挺好的吗?
docker pull kibana:7.4.2
4.5.3 创建映射目录
依次创建两个文件夹和写一个文件
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
4.5.4 运行镜像
启动elasticsearch
看到下面是单节点启动
# 下面是使用,测试时"-Xms64m -Xmx128m"(虚拟机1G内存);使用时"-Xms64m -Xmx512m"(虚拟机3G)
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
4.5.5 查看ES日志
5.报错,查看日志方法docker logs elasticsearch
错误是访问权限,因此修改权限
[root@localhost config]# docker logs elasticsearch
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
{"type": "server", "timestamp": "2021-09-13T07:14:46,580Z", "level": "WARN", "component": "o.e.b.ElasticsearchUncaughtExceptionHandler", "cluster.name": "elasticsearch", "node.name": "36aafb208fda", "message": "uncaught exception in thread [main]",
"stacktrace": ["org.elasticsearch.bootstrap.StartupException: ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];",
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:125) ~[elasticsearch-cli-7.4.2.jar:7.4.2]",
"at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.4.2.jar:7.4.2]",
"Caused by: org.elasticsearch.ElasticsearchException: failed to bind service",
"at org.elasticsearch.node.Node.<init>(Node.java:614) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.node.Node.<init>(Node.java:255) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.4.2.jar:7.4.2]",
"... 6 more",
"Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",
"at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?]",
"at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]",
"at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[?:?]",
"at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:389) ~[?:?]",
"at java.nio.file.Files.createDirectory(Files.java:693) ~[?:?]",
"at java.nio.file.Files.createAndCheckIsDirectory(Files.java:800) ~[?:?]",
"at java.nio.file.Files.createDirectories(Files.java:786) ~[?:?]",
"at org.elasticsearch.env.NodeEnvironment.lambda$new$0(NodeEnvironment.java:272) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:209) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:269) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.node.Node.<init>(Node.java:275) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.node.Node.<init>(Node.java:255) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.4.2.jar:7.4.2]",
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.4.2.jar:7.4.2]",
"... 6 more"] }
[root@localhost config]#
4.5.6 修改权限
6.修改权限chomd -R 777 /mydata/elasticsearch
4.6.7 浏览器访问
7.浏览器访问
http://1.15.122.141:9200/
其实我这里有一个疑问:我修改权限后,没有重启ES,就可以直接访问了,不过想一想,这应该没啥!
8.如果你的访问是被拒绝的,我的解决方案是:(当然,最好你什么都不要改,等两三分钟再访问,还不行,再说)
https://blog.csdn.net/star1210644725/article/details/103903993
# 在ES的配置文件/config/elasticsearch.yml 中新增配置项(在配置文件里边的最下边直接粘贴就可以了)
network.host: 0.0.0.0
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300
4.7.8 启动Kibana容器
9.安装Kibana
其实安装好elasticsearch后,可以不安装kibana,可以直接用postman发送命令,但是呢?有客户端不是很好吗?
注意:一定要是自己Linux的地址哦!!!
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.64.29:9200 -p 5601:5601 -d kibana:7.4.2
10访问:如果页面报错Kibana server is not ready yet
,多访问几次。是因为还没有启动起来。
http://192.168.64.29:5601/
4.7.9 ES设置分词器
在设置分词器前,用的是默认分词器,一个一个分词。
参考这篇文章:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
我们这里使用第一章方式在线安装
这个地址是在github找的,https://github.com/medcl/elasticsearch-analysis-ik/tags?after=v7.7.0注意版本对应。
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
4.6 RabbitMQ安装
搜素(可以省略)
docker search rabbitmq
4.6.1 获取镜像
拉取最新镜像,如果需要其它版本,可添加版本号
docker pull rabbitmq
4.6.2 运行镜像
基于镜像,创建容器(采用这条命令) ```java docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin —name rabbitmq —restart=always —hostname=my-rabbit rabbitmq
最后一个rabbitmq是镜像名称<br />下面仅是参考:
```java
#方式一:默认guest 用户,密码也是 guest
docker run -d --hostname my-rabbit --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management
#方式二:设置用户名和密码
docker run -d --hostname my-rabbit --name rabbitmq -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management
# 这两个密码的区别,暂时没有确定答案
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9
说明:
-d 后台运行容器;
—name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
—hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
4.6.3 浏览器访问
http://1.15.122.141:15672/:出现错误,我这个是安装在腾讯云,不知道本地安装是否有访问错误!
解决方案:需要安装一个插件(原因未知)
# 进入容器
docker exec -it 镜像ID /bin/bash
# 安装插件
rabbitmq-plugins enable rabbitmq_management
# 退出容器
exit
# 重启
docker restart rabbitmq
5. 迁移与备份
其中涉及到的命令有:
o docker commit 将容器保存为镜像
o docker save 将镜像备份为tar文件
o docker load 根据tar文件恢复为镜像
5.1 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
# 保存nginx容器为镜像
docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i
保存后,可以用docker images查看该镜像。当然你也可以用你刚刚制作的镜像通过docker run命令制作成镜像。
5.2 镜像备份
我们可以通过以下命令将镜像保存为tar 文件,会保存在当前目录下。
# 命令形式:docker save –o tar文件名 镜像名
# 保存镜像为文件 -o:表示output 输出的意思
docker save -o mynginx.tar mynginx_i
5.3 镜像恢复与迁移
首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复
# 命令形式:docker load -i tar文件名
docker load -i mynginx.tar
-i 表示input输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
我们需要直接恢复刚刚的 tar 文件 ,就需要先删除 mynginx_i 镜像,才能恢复, 直接删除 mynginx_i 镜像 ,发现会报错,因为当前镜像的容器正在运行,需要先停止容器,删除容器 , 在删除镜像
6. Dockerfile
Dockerfile,其实就是Docker文件,剧透一下,这个Dockerfie是用来制作镜像的。
6.1 什么是Dockerfile
前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfile
Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
6.2 常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |