零基础学Docker【3】 | 一文带你快速进行Docker实战

2021-01-27 16:41:34 浏览数 (1)

前言

本篇是零基础学Docker系列的第三篇文章,在上一篇文章? 一文带你快速学习Docker常用命令中,已经为大家讲解了一些在Docker中常用的命令。本篇我们将对之前学过的内容进行复习,学以致用,需要完成的任务如下:

  • Docker 安装 Nginx
  • Docker 安装 Tomcat
  • Docker部署elasticsearch kibana
  • Portainer可视化面板安装

申明

部分内容来源于网上资源,如若侵犯到您的权益,请联系作者第一时间删除

Docker 安装 Nginx

  1. 本地搜索Nginx镜像
代码语言:javascript复制
[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

  1. 拉取镜像
代码语言:javascript复制
# 执行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
  1. 运行docker镜像
代码语言:javascript复制
#  运行测试
# -d 后台运行
# --name 给容器命名
# -p 暴露端口  格式: [宿主机端口:容器内部端口]
[root@localhost /]# docker run -d --name nginx01 -p 3344:80 nginx
558bc2331b63052f6ff3b4c490cc49a89692fa23868db2dd009df77e5224dd94
  1. 本机测试
代码语言:javascript复制
# 查看容器列表
[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

  1. 安装tomcat镜像,并运行
代码语言:javascript复制
# 官方的使用
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
  1. 启动tomcat
代码语言:javascript复制
[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的官网。

不拐弯抹角了,我们直接开始:

  1. 下载启动elasticsearch
代码语言:javascript复制
# 启动 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实时的状态

代码语言:javascript复制
[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
...

也可以先把一些暂且用不上的容器停止

  1. 测试下es是否启动成功
代码语言:javascript复制
[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 环境配置修改

代码语言:javascript复制
[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

可以发现内存消耗相较于之前,小了很多

  1. 进行es的再次测试
代码语言:javascript复制
[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思维导图”获取哟~

小结

本篇文章到这里就结束了,下一篇讲些什么,暂且保密。你知道的越多,你不知道的也就越多。 我们下一期见!

一键三连,养成习惯~

文章持续更新,可以微信搜一搜「 猿人菌 」第一时间阅读,思维导图,大数据书籍,大数据高频面试题,海量一线大厂面经…期待您的关注!

0 人点赞