前言
本篇是零基础学Docker系列的第三篇文章,在上一篇文章? 一文带你快速学习Docker常用命令中,已经为大家讲解了一些在Docker中常用的命令。本篇我们将对之前学过的内容进行复习,学以致用,需要完成的任务如下:
- Docker 安装 Nginx
- Docker 安装 Tomcat
- Docker部署elasticsearch kibana
- Portainer可视化面板安装
申明
部分内容来源于网上资源,如若侵犯到您的权益,请联系作者第一时间删除
Docker 安装 Nginx
- 本地搜索Nginx镜像
[root@localhost /]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13977 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1906 [OK]
richarvey/nginx-php-fpm Container running Nginx PHP-FPM capable of… 791 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 128
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 108
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 103 [OK]
bitnami/nginx Bitnami nginx Docker Image 90 [OK]
alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 80 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 65 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 63 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 45
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 39 [OK]
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 19
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 19 [OK]
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter 15
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 15
staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo… 14 [OK]
raulr/nginx-wordpress Nginx front-end for the official wordpress:f… 13 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13
sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK]
bitwarden/nginx The Bitwarden nginx web server acting as a r… 7
mailu/nginx Mailu nginx frontend 7 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 6 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 1 [OK]
wodby/nginx Generic nginx 1 [OK]
建议大家去docker的官方仓库进行搜索,可以看到帮助文档。
https://hub.docker.com/_/nginx
- 拉取镜像
# 执行pull命令,从配置的仓库拉取镜像
[root@localhost /]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
5a9f1c0027a7: Pull complete
b5c20b2b484f: Pull complete
166a2418f7e8: Pull complete
1966ea362d23: Pull complete
Digest: sha256:aeade65e99e5d5e7ce162833636f692354c227ff438556e5f3ed0335b7cc2f1b
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# 查看镜像列表
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c39a868aad02 2 days ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB
portainer/portainer latest 62771b0b9b09 3 months ago 79.1MB
- 运行docker镜像
# 运行测试
# -d 后台运行
# --name 给容器命名
# -p 暴露端口 格式: [宿主机端口:容器内部端口]
[root@localhost /]# docker run -d --name nginx01 -p 3344:80 nginx
558bc2331b63052f6ff3b4c490cc49a89692fa23868db2dd009df77e5224dd94
- 本机测试
# 查看容器列表
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
558bc2331b63 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:3344->80/tcp nginx01
# 本地测试
[root@localhost /]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
为了方便大家理解 端口暴露 的概念,大家可以参考下面的图:
当我们通过外网根据某一个端口(例如3344)通过-p
指定的映射关系,就可以测试访问到我们容器内部的服务了。
ok,接着我们来查看一下防火墙的状态。
代码语言:javascript复制[root@localhost /]# firewall-cmd --state
running
确保防火墙是开启的情况下,我们通过本地ip,试试在外网的浏览器上是否能否访问到我们容器内部的nginx服务。
以菌哥的本地的服务器为例:
当在浏览器上输入 http://192.168.100.128:3344/
回车进行访问的时候,页面上弹出这样的界面说明我们的访问时OK的
现在我们尝试通过命令行进入Nginx容器
代码语言:javascript复制[root@localhost /]# docker exec -it nginx01 /bin/bash
# 查看nginx的路径
root@558bc2331b63:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 切换到 nginx 目录下,查看目录下的文件
root@558bc2331b63:/# cd /etc/nginx
# 友情提示:我们可以根据nginx.conf文件动态修改网页上的内容
root@558bc2331b63:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
接下来我们退出容器,停止当前正在运行的nginx容器。
代码语言:javascript复制root@558bc2331b63:/etc/nginx# exit
exit
[root@localhost /]# docker stop 558bc2331b63
558bc2331b63
然后刷新我们的浏览器页面,可以发现页面已经显示不出来了。
思考问题: 我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我是否可以在容器外部提供一个映射路径,达到在容器外部修改文件名,容器内部就可以自动修改? 这个就是我们后面会讲到的一个关于 -v 数据卷的技术
Docker安装tomcat
- 安装tomcat镜像,并运行
# 官方的使用
docker run -it --rm tomcat:9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删除
当下载完,镜像开始运行,命令行会出现一长串的日志信息,相信大家看到最后的8080
一定不会感到陌生。这就是我们平时运行tomcat程序在控制台所打印的信息。
我们结束掉tomcat的容器任务,通过docker ps -a
却没有找到tomcat的信息。为什么会这样呢?
正如前面我们所说的, docker run -it --rm 镜像名
一般是用来测试,用完就删除。
我们现在处于学习阶段,暂时不建议这么玩。还是按着下面的步骤一步步地操作:
代码语言:javascript复制# 通过pull命令下载tomcat镜像
[root@localhost /]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
Digest: sha256:ad82afe54f2aa67167e873162578a751aed3173e42250a9ed68f306aa4b83025
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
# 验证
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 dab3cf97dd54 38 hours ago 648MB
tomcat latest dab3cf97dd54 38 hours ago 648MB
nginx latest c39a868aad02 2 days ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB
portainer/portainer latest 62771b0b9b09 3 months ago 79.1MB
- 启动tomcat
[root@localhost /]# docker run -d -p 3305:8080 --name tomcat01 tomcat
3475b4167b5b85952e61ab63637c82816d24806ccdf47c6010d699e2df72e3c0
我们进行公网的一个访问,发现测试访问没有问题,但为什么 tomcat 没有显示出来呢?
实际上官方提供的 tomcat 镜像是不完整的,如何解决这个问题,我们可以执行下面的操作:
代码语言:javascript复制# 根据容器名称进入tomcat容器
[root@localhost /]# docker exec -it tomcat01 /bin/bash
root@3475b4167b5b:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
# 缺少ll命令
root@3475b4167b5b:/usr/local/tomcat# ll
bash: ll: command not found
# 进入webapps目录
root@3475b4167b5b:/usr/local/tomcat# cd webapps
root@3475b4167b5b:/usr/local/tomcat/webapps# ll
bash: ll: command not found
# 目录下文件为空
root@3475b4167b5b:/usr/local/tomcat/webapps# ls
root@3475b4167b5b:/usr/local/tomcat/webapps
# 发现问题:1、linux命令少了。 2.webapps目录为空
# 原因:阿里云镜像的原因,阿里云默认是最小的镜像,所以不必要的都剔除掉
# 保证最小可运行的环境!
# 解决方案:
# 将webapps.dist下的文件都拷贝到webapps下即可
root@3475b4167b5b:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@3475b4167b5b:/usr/local/tomcat# cd webapps
root@3475b4167b5b:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@3475b4167b5b:/usr/local/tomcat# cd webapps
root@3475b4167b5b:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
当我们把webapps.dist目录下的内容拷贝到webapp目录下时,重新刷新浏览器页面,可以惊喜地发现“tomcat”出现了,说明我们把项目通过docker成功部署到tomcat上去了。当我们想把自己的项目部署上去时,操作也是一模一样的。
同样,这里也给大家留个问题:
思考问题: 我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,比如webapps,我们在外部放置项目,就自动同步内部就好了!
还有一个比较有意思的点
我们现在 docker容器中 包含 tomcat 网站
,亦或者docker容器中包含MySQL数据库
,万一有人把对应的容器删了,不就又上演了"删库跑路",所以这样的设计明显就很不科学,具体怎么解决,大家可以在评论区留下自己的想法
Docker部署elasticsearch kibana
在正式开始之前,先给小伙伴们科普介绍一下es的坑:
代码语言:javascript复制# es 暴露的端口很多
# es 十分的耗内存
# es的数据一般需要放置到安全目录下进行挂载
# es启动的配置参数中, --net somenetwork 代表的是 网络配置,这里到后面会详细介绍,这里暂且忽略
想在Docker上部署elasticsearch,我们还是可以按照之前的思路,先去DockerHub官方仓库上去搜索elasticsearch
镜像的内容。
翻到这里,How to use this image,我们可以查看详细的发行说明,点击here
页面链接直接跳转至elasticsearch的官网。
不拐弯抹角了,我们直接开始:
- 下载启动elasticsearch
# 启动 elasticsearch
[root@localhost /]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
Unable to find image 'elasticsearch:7.6.2' locally
7.6.2: Pulling from library/elasticsearch
ab5ef0e58194: Pull complete
c4d1ca5c8a25: Pull complete
941a3cc8e7b8: Pull complete
43ec483d9618: Pull complete
c486fd200684: Pull complete
1b960df074b2: Pull complete
1719d48d6823: Pull complete
Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711fa
Status: Downloaded newer image for elasticsearch:7.6.2
01fe53e8d7f583f7475537a9db004559b75727bbbbf9f3965291965bb21539d0
如果遇到 es 卡住了,我们可以使用命令 docker stats
查看 cpu实时的状态
[root@localhost /]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
01fe53e8d7f5 elasticsearch 0.04% 462.4MiB / 972.3MiB 47.55% 656B / 0B 3.1GB / 91.2MB 42
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
01fe53e8d7f5 elasticsearch 0.04% 462.4MiB / 972.3MiB
...
也可以先把一些暂且用不上的容器停止
- 测试下es是否启动成功
[root@localhost /]# curl localhost:9200
{
"name" : "01fe53e8d7f5",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "x2tkargaTOiGQyNnGbLG1Q",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
测试成功之后,我们通过stats命令,发现es非常的耗内存
我们赶紧将其关闭,增加内存的限制,修改配置文件,通过 -e 环境配置修改
[root@localhost /]# 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
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1919ec7c66d elasticsearch:7.6.2 "/usr/local/bin/dock…" 42 seconds ago Up 41 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
[root@localhost /]# docker stats b1919ec7c66d
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b1919ec7c66d elasticsearch02 0.29% 351MiB / 972.3MiB 36.10% 656B / 0B 228MB / 1.67MB 43
可以发现内存消耗相较于之前,小了很多
- 进行es的再次测试
[root@localhost /]# curl localhost:9200
{
"name" : "b1919ec7c66d",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "oyhG_CzNQ9-og0-mzJF2nQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
到这里关于 Docker部署elasticsearch kibana就先告一段落。有小伙伴可能就会问了:elasticsearch我懂了,那关于kibana的内容呢。这个问题问的好,这里给大家留下个思考题:
思考题:使用kibana连接es (elasticSearch)?思考网络如何才能连接
这里同样提供一张过程图给小伙伴们一点提示:
具体答案会在后面的文章中揭晓,大家可以多去研究一下。
Portainer可视化面板安装
什么是portainer?
简单理解,就是一个Docker图形化界面管理工具,提供一个后台面板供我们操作!
代码语言:javascript复制# 安装命令
[root@localhost /]# docker run -d -p 8080:9000
> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
43f1dffb44d5729082a675e8c37003b760ae64c84e7518cbea2b9576765f4fce
安装完毕之后,我们就可以通过网址来进行访问,以菌哥本地的服务器为例:http://192.168.100.128:8088/
,然后就可以进入到下面这个界面。
然后我们选择local本地连接完毕之后, 就可以看到这样的工作台界面。页面上详细展示了当期docker上镜像,容器,网络,卷等相关信息。
需要注意的是:可视化面板我们平时不会使用,大家测试体验下即可!
彩蛋
有幸收藏过一份尚硅谷周阳老师制作的Docker思维导图,想获取源文件的朋友,可以在公众号【猿人菌】后台回复“Docker思维导图”获取哟~
小结
本篇文章到这里就结束了,下一篇讲些什么,暂且保密。你知道的越多,你不知道的也就越多。 我们下一期见!
一键三连,养成习惯~
文章持续更新,可以微信搜一搜「 猿人菌 」第一时间阅读,思维导图,大数据书籍,大数据高频面试题,海量一线大厂面经…期待您的关注!