Docker Study Notes_Design in 2023

文章目录

1.Docker 学习

弱小和无知不是生存的障碍,傲慢才是。

  • Docker 概述
  • Docker 安装
  • Docker 命令
    • 镜像命令
    • 容器命令
    • 操作命令
  • Docker镜像
  • 容器数据卷
  • Docker网络原理
  • IDEA整合Docker
  • Docker Compose
  • Docker Swarm
  • CI\CD Jenkins

知道的越多,不知道的越多

2.Docker 概述

2.1 Docker出现的理由

java ---- jar(环境) ---- 打包项目带上环境(镜像) ---- (Docker仓库:商店)---- 其他人下载我们发布的镜像

Docker的思想就来源于集装箱

2.2 Docker的历史

Docker来源于2010年美国成立的一家做pass与计算,LXC有关的容器技术公司,他们将自己的容器化技术命名成Docker,2013年开源爆火。在容器化技术出现前,我们都是使用虚拟机技术

虚拟机: 在window中装一个 Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑! 很笨重!
虚拟机也是属于虚拟化技术,Docker 容器技术,也是一种 虚拟化技术!

  • docker:隔离, 镜像(最核心的环境 4m + dk + mysgl)十分的小巧, 运行像就可以了!
  • VM几个G,笨重

2.3 Docker能干嘛

Docker:能打包镜像发布测试,一键运行

虚拟机技术缺点

  1. 资源占用十分多
  2. 几余步骤多
  3. 启动很慢!

注意容器化技术:容器化技术不是模拟的一个完整的操作系统

Docker技术示例
Docker是内核级别的虚拟化
在这里插入图片描述

比较Docker 和 虚拟机技术的不同 :

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件,
  • 容器内的应用直接运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了每个容器间是互相隔离,
  • 每个容器内都有一个属于自己的文件系统,互不影响。

3.Docker安装

3.1 Docker的基本组成

在这里插入图片描述

镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomat01 容器(提供服务器),通过这个镜像可以创建多个容器( 最终服务运行或者项目运行就是在容器中的 )。
容器(containe):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令 !
可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub( 默认是国外的)
阿里云…都有容器服务器(配置镜像加速 !)

3.2 安装步骤(演示Centos7)

硬件要求:系统内核要求3.10以上

3.2.1环境检查

# 内核要求3.10以上
[root@VM-8-16-centos home]# uname -r
3.10.0-1160.71.1.el7.x86_64
[root@VM-8-16-centos home]# 
# 系统版本
[root@VM-8-16-centos home]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@VM-8-16-centos home]# 

3.2.2 开始安装检查卸载Docker
Docker帮助文档

检查卸载Docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

3.2.2安装需要的依赖包

yum install -y yum-utils

3.2.3 设置镜像仓库

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.2.4 更新yum软件包索

yum makercache fast

3.2.5 安装最新版Docker引擎 (ce社区版本,ee企业版)

sudo yum install docker-ce docker-ce-cli containerd.io

3.2.6 启动Docker

sudo systemctl start docker

3.2.7 检查是否安装成功

docker version
[root@VM-8-16-centos home]# docker version
Client: Docker Engine - Community
 Version:           20.10.22
 API version:       1.41
 Go version:        go1.18.9
 Git commit:        3a2c30b
 Built:             Thu Dec 15 22:30:24 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.22
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.9
  Git commit:       42c8b31
  Built:            Thu Dec 15 22:28:33 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.15
  GitCommit:        5b842e528e99d4d4c1686467debf2bd4b88ecd86
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@VM-8-16-centos home]# 

3.2.8 hello-world命令测试

docker run helle-world

3.2.9 查看镜像是否存在

docker images

3.2.10 配置阿里云容器镜像

在这里插入图片描述
在这里插入图片描述

3.3回顾HelloWorld流程

在这里插入图片描述

3.4 底层原理

Docker是什么工作的?
Docker 是一个 Client- Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer 接收到 Docker-Client 的指令,就会执行这个命令 !
在这里插入图片描述
Docker 为什么比 VM 快?
1、Docker有着比虚拟机更少的抽象层。
2、docker 利用的是宿主机的内核,vm 需要是 Guest os.
在这里插入图片描述

4 Docker常用命令

4.1 帮助命令

docker version     #版本信息
docker info        #显示Docker的系统消息
docker 命令 --help  #万能命令

帮助文档地址

4.2 镜像命令

docker images
[root@VM-8-16-centos home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   16 months ago   231MB
#解释
REPOSITORY 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的id
CREATED    镜像的创建时间
SIZE       镜像的大下

# 可选项
  -a, --all             # 列出所有
  -q, --quiet           # 只显示镜像的id

docker search 搜索模拟

docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13672     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5224      [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   718       [OK]       
percona                         Percona Server is a fork of the MySQL relati…   598       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                      80                   [OK]
databack/mysql-backup           Back up mysql databases to... anywhere!         78                   
linuxserver/mysql-workbench                                                     47                   
ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   41                   
linuxserver/mysql               A Mysql container, brought to you by LinuxSe…   38                   
circleci/mysql                  MySQL is a widely used, open-source relation…   28                   
google/mysql                    MySQL server for Google Compute Engine          22                   [OK]
rapidfort/mysql                 RapidFort optimized, hardened image for MySQL   13                   
bitnami/mysqld-exporter                                                         4                    
ibmcom/mysql-s390x              Docker image for mysql-s390x                    2                    
vitess/mysqlctld                vitess/mysqlctld                                1                    [OK]
newrelic/mysql-plugin           New Relic Plugin for monitoring MySQL databa…   1                    [OK]
hashicorp/mysql-portworx-demo                                                   0                    
rapidfort/mysql-official        RapidFort optimized, hardened image for MySQ…   0                    
docksal/mysql                   MySQL service images for Docksal - https://d…   0                    
mirantis/mysql                                                                  0                    
rapidfort/mysql8-ib             RapidFort optimized, hardened image for MySQ…   0                    
cimg/mysql                                                                      0                    
eclipse/mysql                   Mysql 5.7, curl, rsync                          0                    [OK]
drud/mysql                                                                      0                    
silintl/mysql-backup-restore    Simple docker image to perform mysql backups…   0                    [OK]
[root@VM-8-16-centos home]# 

搜索出来的镜像就是STARTS大于3000

docker serach  mysql --filter=STARS=3000

docker pull 下载镜像

docker pull mysql
# 下载镜像 docker pu11 镜像名[:tag]
[root@VM-8-16-centos home]# docker pull mysql
Using default tag: latest #如果不写tag,默认是lastest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载  docker image的核心文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

docker rmi 删除镜像

docker rmi -f  容器id # 删除指定的容器
docker rm $(docker ps -aq)# 删除全部容器

4.3 容器命令

创建容器,本地没有,就会在docker上搜索

docker pull centos

新建容器并启动

docker run

# 参数说明
--name="Nmae" 容器名称  tomcat01 tomcat02,用来区别容器
-d            后台方式运行
-it           使用交互方式运行,进入容器查看内容
-p            指定容器的端口 -p 8080:8080

# 测试,启动并进入容器
[root@VM-8-16-centos home]# docker run -it centos /bin/bash

Citl+P+Q 退出容器虚拟机

[root@eb0cf00aec92 /]# [root@VM-8-16-centos home]# ls
jiaoxin1112  jiaoxin.java  lighthouse  test.java
[root@VM-8-16-centos home]# 

4.4 常用其他命令

4.4.1 进入当前正在运行的容器

#通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

# 命令
docker exec -it 容器id bashShell

# 测试
​```
[root@VM-8-16-centos /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
30a700d4723b   centos    "/bin/sh -c 'while t…"   9 minutes ago   Up 9 minutes             nostalgic_mcnulty
[root@VM-8-16-centos /]# docker exec -it 30a700d4723b /bin/bash
[root@30a700d4723b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@30a700d4723b /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:48 ?        00:00:00 /bin/sh -c while true;do echo jiaxin;sleep 1;done
root       590     0  0 07:57 pts/0    00:00:00 /bin/bash
root       628     1  0 07:58 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       629   590  0 07:58 pts/0    00:00:00 ps -ef
[root@30a700d4723b /]# 

# 方式二
docker attach 容器id
#测试
[root@VM-8-16-centos ~]# docker attach 30a700d4723b
正在执行当前代码...

# docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach #进入容器正在执行的终端,不会启动新的进程

4.4.2 从容器内拷贝文件到主机

dockers cp 容器id:容器内路径  目的主机路径 

[root@VM-8-16-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-8-16-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   16 months ago   231MB
[root@VM-8-16-centos ~]# docker run -it centos /bin/bash
[root@dfc6bc41d8ae /]# [root@VM-8-16-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
dfc6bc41d8ae   centos    "/bin/bash"   11 seconds ago   Up 11 seconds             zealous_liskov
[root@VM-8-16-centos ~]# cd /home/
[root@VM-8-16-centos home]# ls
jiaoxin1112  lighthouse
[root@VM-8-16-centos home]# touch jiaoxin.java

#查看当前主机目录下
[root@VM-8-16-centos home]# ls
jiaoxin1112  jiaoxin.java  lighthouse
[root@VM-8-16-centos home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
dfc6bc41d8ae   centos    "/bin/bash"   About a minute ago   Up About a minute             zealous_liskov

#进入docker容器内部
[root@VM-8-16-centos home]# docker attach dfc6bc41d8ae
[root@dfc6bc41d8ae /]# d /home/
bash: d: command not found
[root@dfc6bc41d8ae /]# cd /home/
[root@dfc6bc41d8ae home]# ls
#在容器内新建一个文件
[root@dfc6bc41d8ae home]# touch test.java
[root@dfc6bc41d8ae home]# exit
exit
[root@VM-8-16-centos home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-8-16-centos home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   16 months ago   231MB

#将这文件拷贝到主机上
[root@VM-8-16-centos home]# docker cp 5d0da3dc9764:/home/test.java /home 
Error: No such container:path: 5d0da3dc9764:/home/test.java
[root@VM-8-16-centos home]# docker attach dfc6bc41d8ae
You cannot attach to a stopped container, start it first
[root@VM-8-16-centos home]# docker cp dfc6bc41d8ae:/home/test.java /home 
[root@VM-8-16-centos home]# ls
jiaoxin1112  jiaoxin.java  lighthouse  test.java
[root@VM-8-16-centos home]# 

# 拷贝是一个手动的过程,未来我们可以使用 -V 卷的技术,可以实现,自动同步 /home /home

4.4.3 设置docker镜像自动启动

docker update --restart=always 镜像名/镜像id

4.5 案例练习

4.5.1 docker部署Nginx

Docker 安装Nginx

4.5.1.1 搜索镜像

docker search nginx #搜索镜像

4.5.1.2 下载镜像

docker pull nginx #下载镜像

4.5.1.3 查看是否下载成功

docker images #查看是否下载成功

4.5.1.4 运行容器

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,暴露容器内部端口
[root@VM-8-16-centos ~]# docker run -d --name nginx01 -p:3344:80 nginx #运行镜像并给容器命名,不命名就是默认名称,给一个运行端口3344,并映射nginx的80端口
a4b53450f356b2f2f711e26dd36ce429c764329373a45ec56d42f06b89ed415e
[root@VM-8-16-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   12 months ago   141MB
mysql        latest    3218b38490ce   13 months ago   516MB
centos       latest    5d0da3dc9764   16 months ago   231MB
[root@VM-8-16-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a4b53450f356   nginx     "/docker-entrypoint.…"   31 seconds ago   Up 28 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
eb0cf00aec92   centos    "/bin/bash"              7 days ago       Up 7 days                                               jovial_hertz
[root@VM-8-16-centos ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

4.5.1.4.1 docker run -d --name nginx01 -p:3344:80 nginx 命令解释
在这里插入图片描述
4.5.1.5 进去容器

docker exec -it nginx01 /bin/bash -it 直接进去运行

[root@VM-8-16-centos ~]# docker exec -it nginx01 /bin/bash #进入容器运行窗口
root@a4b53450f356:/# whereis nginx #查看容器位置
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@a4b53450f356:/# cd /etc/nginx/ #进入Nginx配置目录
root@a4b53450f356:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@a4b53450f356:/etc/nginx# 

4.5.1.6 测试完毕退出容器并停止,Nginx服务

root@a4b53450f356:/etc/nginx# exit  #退出容器
exit
[root@VM-8-16-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a4b53450f356   nginx     "/docker-entrypoint.…"   23 minutes ago   Up 23 minutes   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
eb0cf00aec92   centos    "/bin/bash"              7 days ago       Up 7 days                                               jovial_hertz
[root@VM-8-16-centos ~]# docker stop a4b53450f356 #停止docker服务
a4b53450f356
[root@VM-8-16-centos ~]# 

思考问题:我们每次改动nginx配置文件,都需要进入容器内部?我要是可以在容器外部提供一个映射路径,达到在容器修改文件名加粗样式,容器内部就可以自动修改 ? - v 数据卷技术 !

4.5.2 docker部署tomcat

docker 安装tomcat

4.5.2.1 下载最新版tomcat
docker pull tomcat
4.5.2.2 启动运行tomcat
  • -d:后台运行
  • -p 3344:8080:指定端口。外部端口3344映射到tomcat的内部端口8080
  • –name:指定tomcat名称
docker run -d -p 3344:8080 --name tomcat01 tomcat
4.5.2.3 访问测试,可以访问到端口

官方提供的tomcat是阉割版的,所以404
在这里插入图片描述

4.5.2.4 进入容器
docker exec -it tomcat01 /bin/bash
4.5.2.5 发现问题
  • 1、linux,命令少了
  • 2.、没有webapps,阿里云镜像的原因,默认是最小的镜像。所有不必要的镜像都剔除。保证最小可运行环境。
tomcat# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat# cd webapps
root@9235c24f455e:/usr/local/tomcat/webapps# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat/webapps# ls
root@9235c24f455e:/usr/local/tomcat/webapps# ls -al
total 12
drwxr-xr-x 2 root root 4096 Dec 22  2021 .
drwxr-xr-x 1 root root 4096 Dec 22  2021 ..

4.5.2.6 解决问题

4.5.2.6.1 查看tomcat目录结构,发现有个webapps.dist文件夹,进入其中查看,发现有tomcat所需支持

cd tomcat/
root@9235c24f455e:/usr/local/tomcat# ll
bash: ll: command not found
root@9235c24f455e:/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
root@9235c24f455e:/usr/local/tomcat# cd webapps.dist/
root@9235c24f455e:/usr/local/tomcat/webapps.dist# ll
bash: ll: command not found
root@9235c24f455e:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager

4.5.2.6.2 两个解决方法,一个是更改此文件夹名,另一个是把此文件夹底下所有文件复制至webapps,此处演示后一种

cp -r webapps.dist/* webapps
root@9235c24f455e:/usr/local/tomcat# cp webapps.dist/* webapps
cp: -r not specified; omitting directory 'webapps.dist/ROOT'
cp: -r not specified; omitting directory 'webapps.dist/docs'
cp: -r not specified; omitting directory 'webapps.dist/examples'
cp: -r not specified; omitting directory 'webapps.dist/host-manager'
cp: -r not specified; omitting directory 'webapps.dist/manager'
root@9235c24f455e:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@9235c24f455e:/usr/local/tomcat# cd webapps
root@9235c24f455e:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@9235c24f455e:/usr/local/tomcat/webapps# 

4.5.2.7 解决成功

在这里插入图片描述

4.5.3官方的使用

官方查阅地址

4.5.2.1.1 启动容器,用完删掉

  • -it:交互模式直接启动
  • –rm:我们一般启动都是后台启动,停止了容器后,容器还是可以查到,–rm停止容器即删除。
docker run -it --rm tomcat:9.0 

4.5.3 docker部署Elasticsearch(es)和Kibana

es 暴露的端口很多
es 十分的耗内存
es的数据一般需要放置安全目录!挂载!
–net somenetwork: 网络配置
tag :版本号

docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
4.5.3.1此处使用如下测试命令,启动elasticsearch
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

4.5.3.1.1 启动之后虚拟机卡顿

es是十分消耗内存

4.5.3.2 启动es,虚拟机卡住,docker stats 查看CPU状态
4.5.3.3 测试es是否启动成功
curl 127.0.0.1:9200
{
  "name" : "35347deae329",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "aaKLwgTqTo2qlgchhi2Ezg",
  "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"
}

4.5.3.4 查看es占用内存情况

太大了,赶紧关闭。
docker ps 和 docker stop 命令
在这里插入图片描述

4.5.3.5 关闭es,增加内存限制

关闭es,增加内存限制,修改配置文件 -e环境生效

  • -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” 运行内存介于64~512间
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

在这里插入图片描述
启动成功

[root@VM-8-16-centos ~]# curl 127.0.0.1:9200
{
  "name" : "4582320e5efd",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "bpDMHPS4TMGIIW5gg-TLmw",
  "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"
}
[root@VM-8-16-centos ~]# 

4.5.4 思考:使用kibana连接es,网络如何连接过去

在这里插入图片描述

5 docker可视化面板、docker镜像加载原理(UnionFS)

  • portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

  • Rancher(CI/CD再用)

5.1 什么是portainer

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

5.1.1 拉取运行portainer

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

5.1.2 访问portainer

ip:8088 访问
在这里插入图片描述

5.2 UnionFS(联合文件系统)

它支持对文件系统的修改作为一次提交来一层层的叠加,我们docker拉取镜像的时候看到的一层层的就是这个。

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file svstem)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。(好比计算机都要依赖内核,装机先开始都是黑窗口,都需要boot引导安装)

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

为啥这么小?在这里插入图片描述

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

虚拟机是分钟级别,容器是秒级 !

5.3 镜像原理之分层理解

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
在这里插入图片描述
在这里插入图片描述

5.4 如何提交一个自己的镜像,docker commit镜像

命令和git原理类似

docker commit #提交容器成为一个新的副本
  • -[TAG]:版本
docker commit -m="提交的描述信息" -a="作者"  容器id 目标镜像名:[TAG]

5.4.1 实战案例

5.4.1.1启动一个默认的tomcat
5.4.1.2 发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认 webapps下面是没有文件的!
5.4.1.3 我自己拷贝进去了基本的文件
5.4.1.4 将我们操作过的容器通过commit提交为一个镜像! 我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像

提交命令如下:

docker commit -a="jiaoxin" -m="add webapps" 8bff2ed945ef tomcat02:1.0

在这里插入图片描述

如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像就好比我们以前学习VM时候,快照!

Docker入门结束

6 容器数据卷

6.1 什么是容器数据卷

docker的理念回顾

将应用环境打包成一个镜像!

数据?如果数据在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

mysql,容器删了,删库跑路!需求:MySQL数据可以存储在本地

容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!
这就是卷技术! 目录的挂载,将我们容器内的目录,挂载到Linux上面!
在这里插入图片描述
总结:容器的持久化和同步操作!容器间也是可以数据共享的!

6.2 使用数据卷

6.2.1 方式一:直接使用命令来挂载 -v

  • -it:以后台交互的模式启动
docker run -it -v -p 主机目录:容器内目录

6.2.1.1 测试命令

docker run -it -v /home/ceshi:/home centos /bin/bash

6.2.2 通过docker inspect查看容器详细信息

在这里插入图片描述

6.2.3 测试数据的同步1

在这里插入图片描述

6.2.4 测试数据的同步2

6.2.4.1 停止容器
6.2.4.2 宿主机上修改文件
6.2.4.3 启动容器
6.2.4.4 容器内数据依旧是同步的

docker attach #进入容器正在执行的终端,不会启动新的进程

在这里插入图片描述

好处:我们以后修改只需要在本地修改即可,容器内会自动同步

6.3 实战:安装MySQL

思考:MySQL的数据持久化问题

6.3.1 获取镜像

docker pull mysql:5.7

6.3.2 运行容器,需要做数据挂载!安装MySQL必须配置密码!!

参考官方文档:
在这里插入图片描述

测试命令如下:

  • -d:后台启动
  • -p:端口映射
  • -v:卷挂载
  • -e:环境配置
  • –name 容器名字
 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

6.3.3 连接容器内的MySQL

6.3.3.1 使用Navicat测试连接
6.3.3.2 Navicat连接到服务器的3310(3310和容器内的3306端口映射),这个时候我们可以连接上了

在这里插入图片描述

6.4 具名和匿名挂载

匿名挂载

-v 容器内路径

6.4.1 运行镜像

  • -P:随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx

6.4.2 查看所有卷的情况

docker volume ls

这里出现的VOLUME NAME下方的一长串值就是匿名挂载

DRIVER    VOLUME NAME
local     1a7e6a2b96be2eb559b0b8d44f9710b956018c41f28a9c0b9d768ff53cda22f8
local     1cca7344a65e07142f5843286338ec040b9472dffd37d09ec5aa1aaae697e08d
local     3f2f77237a72d086ffd30da2dccedd7d0d57e82db8859de2393492614e96e26d
local     6ca161cde838e52140c85a73f611079ac9ba1968393c348eea2fd3f77910dd4f
local     9c3eee999290404743acd46454d6d642567069a8c0d0472cb3e1a16d5a36afed

具名挂载

通过 -v 卷名:容器内位置

[root@VM-8-16-centos data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
38fbdb289b96ceaf9a0077fe1c373a563a1e3ec95f9a47778ffa8e27f489d0ee
[root@VM-8-16-centos data]# docker volume ls
DRIVER    VOLUME NAME
local     cea8cd95fe08cccf91e09e94b8786d72efe8b7c9977bb0895c43986ba619c2fb
local     d968c060e5562767e526fd61df73a214cc9ca9cc3841a66a6f2cc37ba4f8e79c
local     juming-nginx

查看下这卷的详细信息docker volume inspect juming-nginx
在这里插入图片描述

  • 所有的docker容器内的卷,若没有指定目录的情况下都是在/var/lib/docker/volumes/
  • 我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的
    具名挂载
    在这里插入图片描述

如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
根据语法格式确定

  • -v :容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载
  • -v:卷名:容器内路径 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 具名挂载
  • -v /宿主机路径::容器内路径 #指定路径挂载

拓展

通过 -v 容器内路径:ro rw 改变读写权限
ro : readonly # 只读ro
rw :readwrite #可读可写
ro :只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx #一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx #一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!

6.5 初始Dockerfile

Dockerfile

  • Dockerfile 就是用来构建 docker镜像的构建文件!
  • 通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

6.5.1 编写dockerfile文件

  • 生成一个dockerfile文件,名字可以随机,建议dockerfile,只要是指令必须大写
  • CMD /bin/bash 默认命令行启动
  • 这里的每个命令,就是镜像的一层
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---end---"
CMD /bin/bash

6.5.2 构建自己的docker镜像

  • -f:指定dockerfile文件路径
  • -t: 为构建的镜像设置 一个名字和版本号
docker build -f /home/docker-test-volume/dockerfile1 -t jiaoxin/centos:1.0 .

6.5.3 启动自己的docker镜像

  • -it:后台交互模式启动
docker run -it fbad0447e3f1 /bin/bash

在这里插入图片描述
这个卷和外部一定有一个同步的目录

只写了容器内目录在这里插入图片描述

查看下卷的挂载路径

docker inspect 292a905f68c3
在这里插入图片描述

测试下刚才的文件是否同步出去
这种方式后边常用,因为我们经常要构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载-v卷名:容器内路径!
在这里插入图片描述

6.6 数据卷容器

6.6.1 多个mysql同步数据

在这里插入图片描述

6.6.2 案例测试

6.6.2.1 启动3个容器,通过我们刚才自己写的镜像启动
6.6.2.2 启动第一个centos:容器
docker run  -it --name docker01 jiaoxin/centos:1.0

在这里插入图片描述

6.6.2.3 退出容器,快捷键citl+p+q
6.6.2.4 启动第二个centos容器docker02,让其继承自docker01容器
docker run -it --name docker02 --volumes-from docker01 jiaoxin/centos:1.0

volumes可以理解为继承
目的:验证docker02容器是否继承docker01容器成功,主要是通过docker01中新建文件,观察docker02中同位置变化
在这里插入图片描述

6.6.2.5 启动第三个centos容器docker03,让其继承自docker02容器
docker run -it --name docker03 --volumes-from docker02  jiaoxin/centos:1.0 

可以发现,docker03下的volume01目录中也有docker01文件。因此证明通过--volumes-from关键字可以实现容器间数据共享。
在这里插入图片描述

6.6.2.6 删除docker01观察其他容器中共享的文件是否存在

查看docker02发现已经删除的docker01容器共享的docker01文件依旧存在。
在这里插入图片描述

测试依旧还存在,因而证明只要容器间进行了数据共享,删除其中某些容器,共享的数据依然存在。(拷贝的概念
其他容器的删除,不影响其他已拷贝共享资源数据的容器。在这里插入图片描述

6.6.3 多个mysql实现数据共享

6.6.3.1 挂载的首个MySQL镜像
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
6.6.3.2 使用volumes挂载一个新mysql镜像,并共享mysql01的数据
docker run -d -p 3311:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
6.6.3.2 总结
  • 容器间配置信息的传递,其中数据卷容器生命周期一直持续到没有容器使用为止。
  • 一旦将容器持久化本地,如:mysql01挂载到本地,此时,本地的数据不会删除

6.6.4 删除未使用的所有数据卷!!! 慎用!

将未被使用的所有数据卷清理掉
确定删除所有数据卷?
确定删除所有数据卷?
确定删除所有数据卷?

`确定删除所有数据卷?`
**真确定?**
docker volu(防手快,确认使用时,删掉此处)me prune 
**真确定?**
`确定删除所有数据卷?`

6.6.5 Docker-compose升级(以v2为例)

sudo curl -L "https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

6.6.6 docker ps只展示Docker容器名称

docker ps --format "{{.Names}}"

6.6.7 通过docker stats命令看看目标容器的cpu占比和mem内存占比

docker stats --no-stream |grep [服务名/服务名关键字]

6.6.7 获取最近1000条日志

docker logs -tf --tail 1000 gis-equipment-service
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值