环境:lunix+centos
- 如果系统中已经安装dockers,想要移除执行以下指令:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
2.安装docker
#Set up the repository
yum install -y yum-utils
yum -config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#To install the latest version, run:
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#Start Docker.
systemctl start docker
#Verify that the Docker Engine installation is successful by running the hello-world image.
docker run hello-world
docker常用指令
docker ps 是查看当前运行的容器
docker ps -a 是查看所有容器(包括停止的)。
docker rm 容器id 移除容器
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker rm - f $(docker ps -aq) 删除所有容器
docker rmi 容器id 删除镜像
docker exec -it 容器ID 进入当前正在运行的容器
docker commit 容器id tomcat:basic 保存镜像
docker save/export
docker load/import
3.docker 安装 ElasticSearch
# 查看所有镜像
docker images
# 搜索镜像
docker search elasticsearch
# 拉取 7.12.1 版本镜像
docker pull elasticsearch:7.12.1
拷贝配置文件
# 运行 elasticsearch -d 后台运行 -it使用交互方式运行,进入容器内部查看 -p指定容器端口 -P随机端口 --net network网络
docker run -d --name es --net host -P -e "discovery.type=single-node" elasticsearch:7.12.1 # 进入容器查看配置文件路径
docker exec -it es /bin/bash
cd config
在 config 中可看到 elasticsearch.yml 配置文件,再执行 pwd 可以看到当前目录为: /usr/share/elasticsearch/config,所以退出容器,执行文件的拷贝:
# 将容器内的配置文件拷贝到 /usr/local/elk/elasticsearch/ 中 在/root 中建好elasticsearch文件夹
docker cp es:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch/
# 修改文件权限
chmod 666 elasticsearch/elasticsearch.yml
# 在elasticsearch 目录下再创建data目录,同时修改权限
chmod -R 777 elasticsearch/data
这里要修改文件的权限为可写,否则,进行挂载后,在外部修改配置文件,容器内部的配置文件不会更改。同时,创建 data 目录进行挂载。
重新运行容器并挂载:
# 先删除旧的容器
docker rm -f es
# 运行新的容器
docker run -d --name es --net host -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --privileged=true -v $PWD/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v $PWD/elasticsearch/data/:/usr/share/elasticsearch/data elasticsearch:7.12.1
# 查看容器日志
docker logs es
curl localhost:9200
4.docker 安装kibana
docekr search kibana
docker pull kibana:7.12.1
# 启动 kibana 容器并连接同一网络
docker run -d --name kibana --net host -P -e "ELASTICSEARCH_HOSTS=http://192.168.47.128:9200" -e "I18N_LOCALE=zh-CN" kibana:7.12.1
注意: -e "ELASTICSEARCH_HOSTS=http://es:9200" 表示连接刚才启动的 elasticsearch 容器,因为在同一网络(elk)中,地址可直接填 容器名+端口,即 es:9200, 也可以填 http://192.168.47.128:9200,即 http://ip:端口。
docker cp kibana:/usr/share/kibana/config/kibana.yml kibana/
chmod 666 kibana/kibana.yml
拷贝完成后,修改该配置文件,主要修改 elastissearch.hosts 并新增 i18n.locale 配置:
es 地址改为刚才安装的 es 地址,因容器的隔离性,这里最好填写 http://ip:9200;
kibana 界面默认是英文的,可以在配置文件中加上 i18n.locale: zh-CN(注意冒号后面有个空格)。
这样有了配置文件,在启动容器时就不用通过 -e 指定环境变量了。
kibana.yml文件配置:
server.name: kibana
server.host: "0"
# elasticsearch 地址
elasticsearch.hosts: [ "http://192.168.47.128:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
# 开启 kibana 的汉化
i18n.locale: zh-CN
注意:如果使用挂载配置文件的方式启动的话,elasticsearch.hosts 这需填写 http://ip:9200,而不能使用容器名了,否则后面 kibana 连接 es 会失败。
重新开个容器
#删除原来未挂载的容器
docker rm -f kibana
# 启动容器并挂载
docker run -d --name kibana -p 5601:5601 -v $PWD/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml --net host kibana:7.12.1
查看结果
打开浏览器,输入:http://192.168.47.128:5601 打开 kibana 控制台,如果未能成功打开,可以使用: docker logs kibana 查看容器日志看是否运行有误等。
5.docker安装logstash
docker pull logstash:7.12.1
docker run -d -P --name logstash --net host logstash:7.12.1
# 拷贝数据
docker cp logstash:/usr/share/logstash/config logstash/
docker cp logstash:/usr/share/logstash/data logstash/
docker cp logstash:/usr/share/logstash/pipeline logstash/
#文件夹赋权
chmod -R 777 logstash/
修改 logstash/config 下的 logstash.yml 文件,主要修改 es 的地址:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.47.128:9200" ]
修改 logstash/pipeline 下的 logstash.conf 文件:
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044
codec => json_lines # 数据格式
}
}
input{
log4j {
host => "0.0.0.0"
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://192.168.47.128:9200"] # ElasticSearch 的地址和端口
index => "elk" # 指定索引名
codec => "json"
}
stdout {
codec => rubydebug
}
}
启动容器并挂载
#注意先删除之前的容器
docker rm -f logstash
# 启动容器并挂载
docker run -d --name logstash --net host --privileged=true -p 5044:5044 -p 9600:9600 -v $PWD/logstash/data/:/usr/share/logstash/data -v $PWD/logstash/config/:/usr/share/logstash/config -v $PWD/logstash/pipeline/:/usr/share/logstash/pipeline logstash:7.12.1
docker logs -f logstash
6.docker 部署tomcat
docker pull tomcat:9.0.41
// -v(挂载) 虚拟机目录 容器目录
docker run -d --name tomcat -p 8080:8080 -v $PWD/tomcat/:/usr/local/tomcat/webapps/ tomcat:9.0.41
容器中安装常用工具
更新apt 工具 : apt update
安装vim编辑器: apt install vim
安装rz上传命令: apt install lrzsz
正常情况下运行了tomcat访问http://192.168.47.128:8080/ 能看到tomcat首页,但是实际上有可能会出现访问tomcat404报错,这是因为拉下来的镜像中webapp文件夹中是空的,需要进入容器进行webapps的建设
docker exec -it tomcat /bin/bash
cp -r webapps.dist/* webapps
// 备份配置好的tomcat容器
docker commit f5a09ef00256 tomcat:basic
宿主机和容器间文件拷贝指令:上传war文件 上传成功后会自动生成对应的文件夹
将宿主机的war文件拷贝至容器里,并将首页页面放到/usr/local/tomcat/webapps/ROOT中
docker cp /root/mongodb.war tomcat:/usr/local/tomcat/webapps/
将容器里的文件拷贝至宿主机
docker cp tomcat:/usr/local/tomcat/webapps/ /root
进入/usr/local/tomcat/conf 目录 打开server.xml文件在Host节点下新增Context 节点配置 保存并退出
path:指定访问该Web应用的URL入口。
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
<Context path="/" docBase="mongodb" reloadable="true"/>
退出容器,重启tomcat:
docker restart 容器id
正常情况下能访问到项目的首页
7.docker安装mongodb
docker pull mongo:3.4.24
创建mongo数据持久化目录
mkdir mongodb/data
docker run -itd --name mongo -v $PWD/mongodb/data:/data/db -p 27017:27017 mongo:3.4.24 --auth
-v: 将宿主机的mongodb/data映射到容器的/data/db目录,将数据持久化到宿主机,以防止删除容器后,容器内的数据丢失
–auth:需要密码才能访问容器服务
创建用户
登录mongo容器,并进入到【admin】数据库
docker exec -it mongo mongo admin
创建一个用户,mongo 默认没有用户
db.createUser({ user:'root',pwd:'root',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
【user:‘root’ 】:设置用户名为root
【pwd:‘root’】:设置密码为root
【role:‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
【db: ‘admin’】:可操作的数据库
【‘readWriteAnyDatabase’】:赋予用户读写权限
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
连接、测试
连接mongo数据库 db.auth('root', 'root')
测试数据库,插入一条语句 db.user.insert({"name":"zhangsan","age":18})
8.安装过程中遇到的问题:
1)Tomcat原来安装的最近一个版本,部署项目的时候出现了报错,所以删除了原来的镜像,重新拉取了tomcat9,报错解决:
Tomcat10 报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
原来是 Servlet、JSP 与 Spring 的版本之间的匹配出了问题。众所周知,2018 年,Java EE 改名为 Jakarta EE。这导致一些 JAR 包的包名也在之后的版本中进行了更改。这对本项目的影响是,Spring 本身是不含 Servlet、JSP 的 JAR 包的,但其依赖这些 JAR 包。如果在 Tomcat 服务器中部署的项目使用了 Spring,则这部分的 JAR 包将由 Tomcat 服务器来提供。而问题在于,Spring 5.2.9.RELEASE 期望的 JAR 包前缀是 javax,而Tomcat 10.0.0 提供的 JAR 包前缀是 jakarta。因此,Spring 报了一个认为没有 Servlet、JSP 的 JAR 包的错。
(查看 Tomcat 的各版本对应的 Servlet 等的版本的网址是:http://tomcat.apache.org/whichversion.html)
由于 Tomcat 与 Servlet、JSP 的 JAR 包关系密切,因此无法通过替换 Tomcat 下的文件夹 lib 中 Servlet、JSP 的 JAR 包来解决。而且这也无法通过在 Maven 中添加正确的 Servlet、JSP 依赖来解决,实际上,如果该工程的纯 Java 代码的部分没有使用到 Servlet、JSP 的 JAR 包,其实这里在 Maven 添加的 Servlet、JSP 依赖都可以删掉。(更专业的说法是,在基于 Maven 的 Web 应用中,对 Servlet、JSP 的依赖范围为 provided。)
幸运的是,Tomcat 9.0.41 使用的 JAR 包前缀是 javax 。因此,这里只需要再安装一个Tomcat 9.0.41 即可解决(不需要卸载已有的 Tomcat,因为不同版本的 Tomcat 的安装路径可以不同,只是安装时需要先关闭已有的 Tomcat 服务器,避免占用同一个端口号)。
2)关于log4j和logback
log4j和logback可以一起使用吗?
不可以,会产生冲突。最多只能使用其中一种日志框架
日志配置文件名
Logback:logback.xml, logback-spring.xml, logback-spring.groovy, logback.groovy
Log4j:log4j.properties, log4j.xml,log4j-spring.properties, log4j-spring.xml,
Log4j2:log4j2.xml,log4j2-spring.xml
JDK (Java Util Logging):logging.properties
logback与log4j一样,也需要在classpath中编写配置文件。但logback配置文件似乎比log4j复杂一些:log4j不仅支持xml格式的配置文件,还支持properties格式的,而logback只支持xml格式的。有在线工具,可以将log4j.properties文件直接转换成logback.xml文件,也可以反过来。补充说明,如果logback.xml在classpath下面,是不需要在web.xml里面配置任何信息的,包括监听、配置文件路径的配置。