Docker 学习笔记(四):练习篇,Linux 中使用 Docker 部署 Nginx,Tomcat,以及 ElasticSearch

一、前言

记录时间 [2024-4-8]

前置文章:
Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识
Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)
Docker 学习笔记(三):Centos7 中 Docker 使用,镜像、容器,以及操作等常用命令小结

笔者对关于Docker学习的文章进行了整理,需要的朋友可以参考上面专栏哦。

学前准备工作:


在前几篇文章中,笔者讲述了关于Docker学习的入门知识,相信大家对Docker有了一定的了解,会进行安装,还会一些常用的操作,如查看镜像、创建容器等等。

接下来,本文主要是关于Centos7Docker学习的几个小练习,通过以下练习,相信大家在使用Docker时会更加得心应手。

  • Docker部署Nginx
  • Docker部署Tomcat
  • Docker部署ES + Kibana

二、部署 Nginx

1. 搜索镜像

使用docker search命令搜索nginx镜像:

docker search nginx

也可在远程仓库中查看nginx相关信息,快速部署方式:

docker run --name some-nginx -d -p 8080:80 some-content-nginx

查看一些版本信息:

在这里插入图片描述


2. 下载镜像

先去远程仓库拉取nginx镜像,然后下载到本地:

docker pull nginx

下载完成后查看一下:

[root@localhost ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED       SIZE
nginx                 latest    605c77e624dd   2 years ago   141MB

3. 创建容器并运行

使用docker run命令创建容器并运行,参数如下:

  • -d:后台运行
  • --name:给容器命名
  • -p:暴露端口
# 暴露端口  -p 宿主机端口:容器内部端口
docker run -d --name nginx01 -p 3344:80 nginx

使用docker ps查看容器是否运行

 [root@localhost ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                   CREATED          STATUS          PORTS                    NAMES
a794a5252a40   nginx                 "/docker-entrypoint.…"   16 seconds ago   Up 15 seconds   0.0.0.0:3344->80/tcp     nginx01

进入宿主机暴露的端口查看:

curl localhost:3344

结果如下:

[root@localhost ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

4. 关于端口暴露

容器端口与宿主机端口之间的联系,如图所示。

在这里插入图片描述


5. 外网测试访问

http://ip:3344

在这里插入图片描述


6. 进入容器

docker exec -it nginx01 /bin/bash

查看nginx

whereis nginx

结果如下:

root@a794a5252a40:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

# 进入 nginx 目录
root@a794a5252a40:/# cd /etc/nginx

# 查看目录下文件
root@a794a5252a40:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

7. 思考

每次改动nginx配置文件,都需要进入容器内部吗?

显然这十分的麻烦,解决方法是-v数据卷技术。提供一个映射路径,便可在容器外部对容器内部进行修改。


三、部署 Tomcat

1. 官方文档

可在远程仓库中查看tomcat相关信息,官方使用:

docker run -it --rm tomcat:9.0

对比之前在后台启动,当容器停止后,我们依然可以在宿主机查询到容器的相关信息;

--rm一般用于测试,当容器停止后,镜像相关的内容就被完全删除了。


2. 下载 tomcat 镜像再启动

docker pull tomcat

下载完成查看一下:

[root@localhost ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED       SIZE
tomcat                latest    fb5657adc892   2 years ago   680MB

启动运行:

docker run -d -p 3355:8080 --name tomcat01 tomcat

3. 浏览器测试访问

启动后可以在浏览器测试访问:

http://ip:3355

发现问题

发现能成功访问,但是状态为404未找到!为什么呢?

因为阿里云镜像中默认是最小的镜像,所有不必要的东西都被剔除掉了,只保证最小可运行的环境

  • 容器中运行的tomcat不是完整版;
  • 容器中Linux命令不完整;
  • 容器中webapps目录下没有内容。

在这里插入图片描述


解决方法

先进入tomcat01容器:

docker exec -it tomcat01 /bin/bash

查看下当前目录,发现存在webapps.dist目录

root@704918de29fa:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work

进入该目录查看下里面的内容,发现里面正是webapps目录下所需要的内容

root@704918de29fa:/usr/local/tomcat# cd webapps.dist
root@704918de29fa:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager

回到上一级目录

cd ../

webapps.dist目录下的所有内容拷贝到webapps目录

cp -r webapps.dist/* webapps

查看是否拷贝成功:

root@704918de29fa:/usr/local/tomcat# cd webapps
root@704918de29fa:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

然后浏览器测试一下,刷新404界面,可以看到服务启动成功了。

在这里插入图片描述


4. 思考

如果每次都要进入容器中部署项目,是否十分麻烦?

解决思路:在容器外部提供一个映射路径webapps,在外部放置项目就能自动同步到容器内部。


四、部署 ES + Kibana

1. 官方文档

可在远程仓库中查看elasticsearch相关信息elasticsearch更多信息

官方使用:

docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag

2. 启动 ES

部署elasticsearch需要注意的地方:

  • 暴露的端口多
  • 十分耗内存
  • 数据一般需要挂载到安全目录
  • 需要配置网络--net somenetwork
# 启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

注意:启动之后 Linux 会非常卡!非常卡!


3. 测试 ES 是否启动成功

curl localhost:9200

成功

[root@localhost ~]# curl localhost:9200
{
  ......
  "tagline" : "You Know, for Search"
}

4. 查看 CPU 状态

docker stats查看下CPU状态:

docker stats

结果如下,elasticsearch占据了很大部分内存,所以就卡住了。

[root@localhost ~]# docker stats
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT
5164b9a709df   elasticsearch   9.02%     1.257GiB / 1.694GiB

弄完赶紧关掉吧

docker stop 容器id

5. 给 ES 增加内存限制

限制内存方法:修改配置文件,使用-e修改环境配置。

重新运行一个带参数的elasticsearch

docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

查看CPU状态就会发现,它正常很多了,不会卡了。


6. 思考

那么,KibanaES如何连接呢?

  • 肯定不能直接通信,因为Docker容器之间是隔离的!
  • 通过Linux的内部网络进行转发,涉及网络原理。

五、总结

本文讲述了三个Centos7Docker学习的小练习,通过练习,我们对Docker暴露端口、进入容器操作,以及容器配置文件修改等有了更加深入的认识。


一些参考资料

狂神说系列Docker教程:https://www.bilibili.com/video/BV1og4y1q7M4/

Docker官方文档:https://docs.docker.com/engine/install/centos/

Docker远程仓库:https://hub.docker.com/

FinalShell下载:http://www.hostbuf.com/t/988.html

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 22:36:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 22:36:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 22:36:01       87 阅读
  4. Python语言-面向对象

    2024-04-12 22:36:01       96 阅读

热门阅读

  1. Kubernetes 部署前内核升级

    2024-04-12 22:36:01       52 阅读
  2. vim插件配置

    2024-04-12 22:36:01       96 阅读
  3. MySQL:MySQL的查询(下)

    2024-04-12 22:36:01       35 阅读
  4. WebKit结构简介

    2024-04-12 22:36:01       37 阅读
  5. 【数据可视化】教程及案例

    2024-04-12 22:36:01       32 阅读
  6. 解决SpringBoot在IDEA中热部署失效问题

    2024-04-12 22:36:01       40 阅读
  7. Nacos 基本知识与使用

    2024-04-12 22:36:01       38 阅读