Docker学习笔记 2

桌桌 2022-8-21 136 8/21

部署Nginx

1 搜索镜像
[root@VM-4-12-centos ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        17281     [OK]       
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   173                  
...
2 拉取镜像
[root@VM-4-12-centos ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
1efc276f4ff9: Pull complete 
baf2da91597d: Pull complete 
05396a986fd3: Pull complete 
6a17c8e7063d: Pull complete 
27e0d286aeab: Pull complete 
b1349eea8fc5: Pull complete 
Digest: sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
3 启动镜像

先设置一下防火墙,之后启动设置宿主机端口使用这个,使用3344就可以访问

Docker学习笔记 2

[root@VM-4-12-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    b692a91e4e15   2 weeks ago     142MB
centos       latest    5d0da3dc9764   11 months ago   231MB

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@VM-4-12-centos ~]# docker run -d --name nginx01 -p 3344:80 nginx
f1047a6189941b298618490259561462d55e5890171fc999d7f5ddf72344e49c
[root@VM-4-12-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
f1047a618994   nginx     "/docker-entrypoint.…"   41 seconds ago   Up 40 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01

测试本机的3344端口

[root@VM-4-12-centos ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>

以下是端口暴露概念图

Docker学习笔记 2

测试是否成功

Docker学习笔记 2

4 进入容器
[root@VM-4-12-centos ~]# docker exec -it nginx01 /bin/bash
root@f1047a618994:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f1047a618994:/# cd /etc/nginx
root@f1047a618994:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@f1047a618994:/etc/nginx# 

部署tomcat

# 官方的使用
docker run -it --rm tomcat:9.0

# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到
# docker run -it --rm tomcat:9.0 一般是用来测试的,用完就会删除

# 启动后使用ctrl+c退出后
[root@VM-4-12-centos ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS     NAMES
f1047a618994   nginx     "/docker-entrypoint.…"   19 minutes ago   Exited (0) 6 minutes ago             nginx01
178c87fe1ac0   centos    "/bin/bash"              12 days ago      Exited (0) 12 days ago               recursing_chebyshev

# 下载并启动
[root@VM-4-12-centos ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
d19f32bd9e41: Already exists 
60ffabbc7d49: Already exists 
f094bb0c8b4d: Already exists 
fde4950fc6ef: Already exists 
34eeeee27a4f: Already exists 
a9f9c08dfe70: Pull complete 
8f63f2537b0f: Pull complete 
Digest: sha256:1c95c053578c1f229fb45e28ce17da5447b25178f276379c87c418d9bc2c8d21
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@VM-4-12-centos ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
fba346b92826888f5807446408297246466e604561392473b88307fdd3125d0c

外网访问测试如下:

Docker学习笔记 2

测试访问没有问题,但是没有显示tomcat,是因为官方的这个镜像是阉割版的

[root@VM-4-12-centos ~]# docker exec -it tomcat01 /bin/bash
root@fba346b92826:/usr/local/tomcat# ls
bin           CONTRIBUTING.md  logs            README.md      temp          work
BUILDING.txt  lib              native-jni-lib  RELEASE-NOTES  webapps
conf          LICENSE          NOTICE          RUNNING.txt    webapps.dist
root@fba346b92826:/usr/local/tomcat# cd webapps
root@fba346b92826:/usr/local/tomcat/webapps# ls

发现问题:

  • 命令缺少

  • 没有webapps

阿里云镜像的原因。默认是最小的镜像,所有不必要的东西都删掉了,保证最小的可运行环境

此时我们将webapps.dist中的网页资源放到webapps中,再访问就可以得到正常的页面了。

root@fba346b92826:/usr/local/tomcat# cp -r  webapps.dist/* webapps

此时访问测试如下:

Docker学习笔记 2

思考问题:每次改动nginx配置文件都需要进入容器进行修改十分的麻烦,有没有办法在容器外提供一个映射路径,例如webapps,,达到在容器外部修改文件,容器内部就可以自动同步? -v 数据卷

部署es+kibana

# es 暴露的端口很多
# es 十分占用内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置

# 启动
# 7.17.5从官网查
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.5

# docker stats 查看cpu状态
# es比较耗内存 1.xG

内存消耗如下所示:

Docker学习笔记 2

docker stats

Docker学习笔记 2

测试:

[root@VM-4-12-centos ~]# curl localhost:9200
{
  "name" : "372b778dc388",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "GMpN2G5yQo2VASwPw-9Yeg",
  "version" : {
    "number" : "7.17.5",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
    "build_date" : "2022-06-23T21:57:28.736740635Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

内存消耗太大,修改配置文件增加对内存的限制

# -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"  elasticsearch:7.17.5

修改后如下所示:

Docker学习笔记 2

注意:需要修改一下容器名,同时还要把之前开启的es给关闭,否则会容器名冲突和端口冲突

测试一下:

[root@VM-4-12-centos ~]# curl localhost:9200
{
  "name" : "419408fc7936",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "S9anRIqlSjKVXMMnCY7lnw",
  "version" : {
    "number" : "7.17.5",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
    "build_date" : "2022-06-23T21:57:28.736740635Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

可视化

  • portainer

  • Rancher(CI/CD再用)

什么是portainer?

docker图形化界面管理工具,提供一个后台面板供我们操作

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock --privileged=true portainer/portainer

访问测试一下:(记得放防火墙)

Portainer

Docker学习笔记 2

选择本地仓库即可

Docker学习笔记 2

Docker镜像

镜像可以理解为一个独立的软件包,轻量级且可执行,用于导报软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包含了代码、运行库、库、环境变量和配置文件。

所有的应用,直接打包docker镜像就可以直接跑起来

如何得到镜像:

  • 从远程仓库下载

  • 朋友拷贝

  • 自己制作一个镜像Dockerfile

联合文件系统(UnionFS)

是一种分层、轻量级并且高性能的文件系统,支持把对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但是从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层文件和目录。

Docker镜像加载原理

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs,这一层与典型的Linux/Unix系统是一样的,包含了boot加载器和内核,当boot加载完成之后整个内核都在内存中,此时内存的使用权已经有bootfs转交给内核,此时系统也会卸载bootfs。

系统启动需要引导加载,类似与我们装机时必须要设置的引导项。

rootfs(root file system),在bootfs之上,包含的就是典型的Linux系统中的/dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,CentOS等

为什么docker中的centos只有200M,而平时装机都是好几个G?

Docker学习笔记 2

对于一个精简版的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用的Host的kernel,自己只需要提供rootfs就可以了,由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

理解:镜像使用的内核用的是主机的,镜像就不需要再重复提供bootfs,只需要提供rootfs

对分层的理解

所有的docker镜像都起始于一个基础的镜像层,当进行修改或增加新的内容时,就会在当前的镜像层上创建新的镜像层。

例如,假如基于Ubuntu linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加python包,就会在基础镜像层上创建第二个镜像层;如果再添加一个安全补丁,就会创建第三个镜像层。

特点

docker镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部

这一层就是常说的容器层,容器之下的都叫镜像层,我们的所有的操作都是基于容器层的

commit镜像

docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
- THE END -

桌桌

8月21日16:34

最后修改:2022年8月21日
0

非特殊说明,本博所有文章均为博主原创。