当前位置: 首页 > news >正文

Docker核心教程

1. 概述

官网:https://docs.docker.com/

Docker Hub 网站:https://hub.docker.com/

容器较为官方的解释:

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间基础设施上运行不同软件时的冲突。

容器较为通俗的解释:

如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说得容器存放的东西可能更偏向于应用,比如网站、程序甚至是系统环境。

2. 虚拟化技术和容器化技术

2.1 虚拟化技术

首先,Docker 容器虚拟化技术为基础的软件,那么什么事虚拟化技术呢?

简单点来说,虚拟化技术可以这样定义:

虚拟化技术是一种资源管理技术,是将计算机的各种实体资源CPU内存磁盘空间网络适配器等),予以抽象、转换后呈现出来可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。

2.2 Docker 基于 LXC 虚拟容器技术

Docker 技术是基于 LXC(Linux container-Linux 容器)虚拟容器技术的。

LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system-level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易地创建和管理系统或应用容器。

LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。

cgroup 和 namespace 介绍:

  • namesapce 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

(以上关于 namespace 介绍内容来自 https://www.cnblogs.com/sparkdev/p/9365405.html,更多关于 namespace 的内容可以查看这篇文章)。

  • CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物力资源(如 cpu memory i/o 等等)的机制。

 (以上关于 CGroup 介绍内容来自https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html,更多关于 Cgroup 的内容可以查看这篇文章)

cgroup 和 namespace 两者对比:

两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。

3. Docker 基本组成

Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期

4. Docker 安装

4.1 查看系统内核和系统信息

命令:

uname -r     #查看系统内核版本
cat /etc/os-release  #查看系统版本
12

示例:

[root]# uname -r
4.18.0-348.7.1.el8_5.x86_64[root]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"

4.2 开始安装 Docker

卸载旧版本

命令:

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

示例:

[root@iZ1608aqb7ntn9Z /]# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
No match for argument: docker
No match for argument: docker-client
No match for argument: docker-client-latest
No match for argument: docker-common
No match for argument: docker-latest
No match for argument: docker-latest-logrotate
No match for argument: docker-logrotate
No match for argument: docker-engine
没有软件包需要移除。
依赖关系解决。
无需任何处理。
完毕!

下载依赖安装包:

yum install -y yum-utils
1

配置镜像仓库:

#国外的地址
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo  # 设置阿里云的Docker镜像仓库
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

示例:

[root]# yum-config-manager \
>     --add-repo \
>     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
添加仓库自:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更行yum软件包

yum makecache fast 
#更新索引的时候出错,即centos8没有该参数,解决办法为:去掉fast参数

下载 docker

yum install docker-ce docker-ce-cli containerd.io   # 安装社区版
yum install docker-ee docker-ee-cli containerd.io   # 安装企业版

一般情况下安装 社区版

4.3 启动 Docker

命令:

systemctl start docker   # 启动Docker
docker version           # 查看当前版本号,是否启动成功
systemctl enable docker  # 设置开机自启动

示例:

$ systemctl start docker$ docker version
Client: Docker Engine - CommunityVersion:           20.10.14API version:       1.41Go version:        go1.16.15Git commit:        a224086Built:             Thu Mar 24 01:47:44 2022OS/Arch:           linux/amd64Context:           defaultExperimental:      trueServer: Docker Engine - CommunityEngine:Version:          20.10.14API version:      1.41 (minimum version 1.12)Go version:       go1.16.15Git commit:       87a90dcBuilt:            Thu Mar 24 01:46:10 2022OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.5.11GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8runc:Version:          1.0.3GitCommit:        v1.0.3-0-gf46b6badocker-init:Version:          0.19.0GitCommit:        de40ad0

4.4 Docker 的 HelloWorld

命令:

docker run hello-world

示例:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally  # 本地没有
latest: Pulling from library/hello-world           # pull一个最新版
2db29710123e: Pull complete                        # pull成功
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latestHello from Docker!                                 # 运行结果
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/

5. Docker 卸载

yum remove docker-ce docker-ce-cli containerd.io  # 卸载依赖
rm -rf /var/lib/docker    # 删除资源  . /var/lib/docker是docker的默认工作路径

6. 配置阿里云镜像

进入阿里云官网,搜索容器镜像服务

执行命令:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

7. Docker 运行流程和原理

启动流程

运行原理

Docker 整体架构

 8. Docker 常用命令

命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/

管理镜像常用命令

创建容器

容器限制

8.1 基本命令

 命令:

docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker COMMAND --help

示例:

$ docker info
Client:Context:    defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Docker Buildx (Docker Inc., v0.8.1-docker)scan: Docker Scan (Docker Inc., v0.17.0)Server:Containers: 1Running: 0Paused: 0Stopped: 1Images: 1Server Version: 20.10.14
......

8.2 镜像命令

docker images 查看本地主机的所有镜像

示例:

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

列表参数介绍:

# 解释:
1.REPOSITORY  镜像的仓库源
2.TAG  镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id

docker search 搜索镜像

示例:

#可选参数
Search the Docker Hub for images
Options:-f, --filter filter   Filter output based on conditions provided--format string   Pretty-print search using a Go template--limit int       Max number of search results (default 25)--no-trunc        Don\'t truncate output#搜索收藏数大于3000的镜像$ docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12427     [OK]
mariadb   MariaDB Server is a high performing open sou…   4787      [OK]

docker pull 镜像名[:tag] 下载镜像

示例:

$ docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 删除镜像

#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id 镜像id 镜像id#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)

8.3 容器命令

docker run [可选参数] image 运行容器

docker run [可选参数] image#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
( -p ip:主机端口:容器端口  配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)
-P                     随机指定端口(大写的P)

示例:

$ docker run c20987f18b13
2022-04-18 07:07:31+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2022-04-18 07:07:31+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-04-18 07:07:31+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2022-04-18 07:07:31+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specifiedYou need to specify one of the following:- MYSQL_ROOT_PASSWORD- MYSQL_ALLOW_EMPTY_PASSWORD- MYSQL_RANDOM_ROOT_PASSWORD

进入容器

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it [容器ID] /bin/bash

exit 退出容器

#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q  不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#

docker ps 列出容器

#docker ps # 列出当前正在运行的容器
-a   # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器 (default -1)
-q   # 只显示容器的编号
-s   # 显示总文件大小$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
703fad61eccb   c20987f18b13   "docker-entrypoint.s…"   2 minutes ago    Exited (0) 2 minutes ago              inspiring_feistel
2e6f020d0299   c20987f18b13   "docker-entrypoint.s…"   3 minutes ago    Exited (1) 3 minutes ago              angry_stonebraker
a4889b27716f   hello-world    "/hello"                 14 minutes ago   Exited (0) 14 minutes ago             trusting_mcclintock

docker rm 删除容器

# 选项:
-f   # 移除正在运行的容器(使用SIGKILL)
-l   # 移除容器间的网络连接,而非容器本身
-v   # 删除与容器关联的卷docker rm 容器id                     # 删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)       # 删除所有的容器
docker ps -a -q | xargs docker rm   # 删除所有的容器

启动和重启容器命令

docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器

8.4 其他命令

后台启动容器

#命令 docker run -d 镜像名
$ docker run -d ubuntu                                                   
c21cd5dd2594ec109dfb7e8eeba6bd129291de1f1095389c9b31492e98360947#问题docker ps,发现ubuntu停止了#常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用了,就会自动停止
#nginx,容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

$ docker logs --helpUsage:  docker logs [OPTIONS] CONTAINERFetch the logs of a containerOptions:
-f       # 跟踪日志输出
--since  # 显示某个开始时间的所有日志
-t       # 显示时间戳
-n      # 仅列出最新N条容器日志(默认为“全部”)常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数
docker logs -n number 容器id     #num为要显示的日志条数#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
$ docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
f51f3cbb27511b49d85c98fa62691a1a19397d4a272a8cc7d4769d3d6ec41f2a$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS     NAMES
f51f3cbb2751   centos    "/bin/sh -c 'while t…"   10 seconds ago   Up 9 seconds             busy_ride$ docker logs -tf --tail 10 f51f3cbb2751
2022-04-18T07:24:27.364628955Z hi
2022-04-18T07:24:32.365938530Z hi
2022-04-18T07:24:37.367324268Z hi
2022-04-18T07:24:42.368615239Z hi
2022-04-18T07:24:47.369976390Z hi
2022-04-18T07:24:52.371426169Z hi
2022-04-18T07:24:57.372834380Z hi
2022-04-18T07:25:02.374156939Z hi
2022-04-18T07:25:07.375425598Z hi

查看容器中进程信息

# 命令 docker top 容器id
$ docker top f51f3cbb2751
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                17874               17853               0                   15:24               ?                   00:00:00            /bin/sh -c while true;do echo hi;sleep 5;done
root                18164               17874               0                   15:25               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
12345

查看镜像的元数据

$ docker inspect 容器id#docker inspect : 获取容器/镜像的元数据。#语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]#OPTIONS说明:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。

进入当前正在运行的容器

方式一:

# 我们通常容器使用后台方式运行的, 需要进入容器,修改一些配置# 命令
docker exec -it 容器id /bin/bash# 测试
$ docker exec -it df358bc06b17 /bin/bash
[root@df358bc06b17 /]# ls       
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@df358bc06b17 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug11 pts/0    00:00:00 /bin/bash
root        29     0  0 01:06 pts/1    00:00:00 /bin/bash
root        43    29  0 01:06 pts/1    00:00:00 ps -ef# 方式二
docker attach 容器id# docker exec       # 进入容器后开启一个新的终端,可以在里面操作
# docker attach     # 进入容器正在执行的终端,不会启动新的进程#语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]#OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

拷贝容器文件到主机

拷贝容器的文件到主机中

docker cp 容器id:容器内路径 目的主机路径#进入容器中$ docker cp 8b84603c410a:/home/test.java /home$ ls
alex  arod  hello.java  neos  test.java#拷贝只是一个手动功能,未来我们使用 -v 卷的技术,可以实现自动同步

常用命令小结

9. Docker 图形化管理工具 

9.1 Docker UI

命令:

docker search dockerui
docker pull abh1nav/dockerui
docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui  
#放开物理机的9000端口对应Docker容器的9000端口

示例:

$ docker search dockerui
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
abh1nav/dockerui               An updated version of crosbymichael/dockerui…   99                   [OK]
kevan/dockerui                 Deprecated: Use  uifd/ui-for-docker             15                   [OK]
......$ docker pull abh1nav/dockerui
Using default tag: latest
latest: Pulling from abh1nav/dockerui
Image docker.io/abh1nav/dockerui:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
5d3df020ecd3: Pull complete
bebf5a3b4dfb: Pull complete
e4452c0fe72b: Pull complete
6167d9726b07: Pull complete
53ebae19a314: Pull complete
Digest: sha256:a9c6c5393f561a0f42f41cfa80572b666e745d9b419569c42bac1e5cf9ceda32
Status: Downloaded newer image for abh1nav/dockerui:latest
docker.io/abh1nav/dockerui:latest$ docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui
959047ff6deba1e5d31017024a41b611e48f416a6f87f2cad4f528801a260c52

使用:

访问:http://ip地址:9000
1

会出现如下的界面:

 9.2 Shipyard

镜像下载

[docker@docker ~]$ docker pull alpine
[docker@docker ~]$ docker pull library/rethinkdb
[docker@docker ~]$ docker pull microbox/etcd
[docker@docker ~]$ docker pull shipyard/docker-proxy
[docker@docker ~]$ docker pull swarm
[docker@docker ~]$ docker pull shipyard/shipyard   (#英文版)

脚本安装 shipyard

#安装shipyard中文版curl http://dockerclub.net/deploy | bash -s

9.3 Portainer

命令:

docker search portainer
docker pull portainer/portainer
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

示例:

$ docker search portainer
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
portainer/portainer                    This Repo is now deprecated, use portainer/p…   2201
portainer/portainer-ce                 Portainer CE - a lightweight service deliver…   1100
......                  $ docker pull portainer/portainer
Using default tag: latest
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
docker.io/portainer/portainer:latest$ docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
abbf483bd3df0e30eaeb3a0dd708776a6fbbf055e2c87bcb84177df7e86c8ac2

使用:

访问:http://ip地址:90001

10. 常见容器部署:Nginx、Tomcat 、es + kibana

10.1 Nginx

命令:

# 1. 查找镜像, 建议去docker官网搜索,可以看到帮助文档 https://registry.hub.docker.com/
docker search nginx# 2. 下载镜像 pull
docker pull nginx# 3. 运行测试
docker images# 4.docker run -d --name nginx -p 3344:80 nginx   # 启动
curl localhost:3344  # 本机测试访问
# 备注
# -d 后台运行
# --name 给容器命名
# -p 3334:80 将宿主机的端口3334映射到该容器的80端口# 进入容器
$ docker exec -it nginx /bin/bash
root@c70636684cd8:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@c70636684cd8:/# cd /etc/nginx/
root@c70636684cd8:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params# 关闭容器
$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED             STATUS             PORTS                                       NAMES
c70636684cd8   nginx              "/docker-entrypoint.…"   11 minutes ago      Up 11 minutes      0.0.0.0:3344->80/tcp, :::3344->80/tcp       nginx
959047ff6deb   abh1nav/dockerui   "./dockerui"             About an hour ago   Up About an hour   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   dockerui
f51f3cbb2751   centos             "/bin/sh -c 'while t…"   About an hour ago   Up About an hour                                               busy_ride$ docker stop c70636684cd8
c70636684cd8
# 发现访问不了此网站

测试访问:

10.2 Tomcat

命令:

# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台的,停止了容器之后, 容器还是可以查到,docker run -it --rm 一般用来测试,用完就删# 下载再启动
docker pull tomcat# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat# 测试访问没有问题# 进入容器
docker exec -it tomcat01 /bin/bash# 发现问题:1.linux命令少了, 2. webapps下内容为空,阿里云默认是最小的镜像,所有不必要的都剔除了
# 保证最小可运行环境即可root@fd58d9c477e4:/usr/local/tomcat# cp -r webapps.dist/* webapps
## 网站恢复访问

测试访问:

10.3 es + kibana

添加 ‘-e ES_JAVA_OPTS = "-Xms128m -Xmx512m" ’,配置 ElasticSearch 的虚拟机占用的内存大小。

docker stats 查看资源占用情况

# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork ?  网络配置# 启动elasticsearch
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
a920894a940b354d3c867079efada13d96cf9138712c76c8dea58fabd9c7e96f# 启动了linux就卡住了,docker stats 查看cpu状态# 测试一下es成功了
$ curl localhost:9200
{"name" : "a920894a940b","cluster_name" : "docker-cluster","cluster_uuid" : "bxE1TJMEThKgwmk7Aa3fHQ","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"
}# 增加内存限制,修改配置文件 -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.6.2$ docker stats

10.4 端口暴露的原理

10.5 可视化

  • portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer# 测试
$ curl localhost:8088
<!DOCTYPE html
><html lang="en" ng-app="portainer">
......><!-- End Page Wrapper --><script type="text/javascript" src="vendor.50213a000e42f5c05bcc.js"></script><script type="text/javascript" src="main.50213a000e42f5c05bcc.js"></script></body></html
># 外网访问 http://ip:8088

  • Rancher(CI/CD 再用)

11. Docker 镜像讲解

11.1 镜像是什么

Docker 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。

所有的应用,直接打包成 Docker 镜像,然后通过镜像创建出容器,然后就可以直接跑起来。

如果得到镜像:

  • 从远程仓库下载,比如 docker hub、阿里云的镜像仓库等。
  • 朋友拷贝给你。
  • 自己制作一个镜像 DockerFile。

通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过 Commit 命令提交一个新的镜像。

UnionFS(联合文件系统)

  • 联合文件系统(UnionFS)是一个分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
  • 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker 镜像加载原理

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

  • bootfs(boot file system)主要包含 BootLoader 和 kernel,BootLoader 主要负责引导加载 kernel,Linux 刚启动时会加载 bootfs 文件系统来引导内核的加载,Docker 镜像的最底层就是 bootfs。这一层与我们典型的 unix 系统是一样的,包含 boot 引导器和内核,当 boot 加载完成后整个内核就在内存中了,此时内存的使用权已经由 bootfs 转交给内核,此时系统会卸载 bootfs。
  • rootfs(root file system),包含典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs 就是各种不同 Unix 操作系统发行版(Ubuntu,Centos等)。因为底层直接用 Host 的 Kernel,rootfs 只包含最基本的命令,工具和程序就可以了。

我们平时安装的虚拟机 centos 镜像好几个G,Docker 安装的才 200 多M,因为对于一个精简的OS,rootfs 可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供 tootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的 bootfs 基本是一致的,rootfs 有差别,因此不同的发行版可以公有 bootfs。虚拟机是分钟级别,容器是秒级。

第一图仅仅是 bootf + rootfs,然后如果要制作一个 emacs 环境的镜像,就在这个基础上新加一层 emacs 镜像,如图二。如果要在添加一个 Apache 环境,那就再图二基础上加一个 apache 镜像。如图三,图中的每一层镜像都能进行复用。

11.2 分层理解

分层的镜像

比如:上面的 redis 镜像。使用 docker inspect redis 镜像的ID 命令查看镜像的元信息,找到 layer 信息。

由上图可以看到下载的 redis 镜像是由 6 个镜像一层层组成的。

这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像已经存在本地了,就不用再下载,直接复用该镜像,节省空间。比如上面下载 redis 镜像时,提示某个镜像已经存在。

注意:

Docker 镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫做容器层,容器层之下的叫做镜像层。

如上图,使用 Tomcat 镜像创建容器后,会在 Tomcat 镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用 commit 命令把该容器创建一个新的镜像,实际上新的镜像是 tomcat镜像 + 可写层镜像,以 tomcat 镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。

11.3 commit 镜像

命令:

docker commit 提交容器成为一个新的副本
docker commit -m="描述信息,类似git提交的信息" -a="作者" 容器id  目标镜像名:[TAG]$ 编辑容器后提交容器成为一个新镜像a

实战测试

#1.启动一个默认的tomcat
docker run -it -p 8080:8080 tomcat
#2.发现这个默认的tomcat是没有webapps的应用,镜像的原因,官方的镜像默认webapps下面是没有文件的#3.自己拷贝进去基本的文件
cp -r webapps.dist/* webapps#4.将修改后的容器通过commit提交为新的镜像~我们以后就使用我们自己制作的镜像了
docker commit =a="lixingze" -m="add webapps app" 容器ID tomcat02:1.0

12. 容器数据卷

12.1 什么是容器数据卷

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。

docker 的理念回顾

将应用和环境打包成一个镜像。数据如果都在容器中,那么我们容器一旦删除,数据就会丢失 需求:数据可以持久化

相关文章:

Docker核心教程

1. 概述 官网&#xff1a;https://docs.docker.com/ Docker Hub 网站&#xff1a;https://hub.docker.com/ 容器较为官方的解释&#xff1a; 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…...

React通用后台模板

一. 项目初始化 1. 创建项目 环境 npm init vite 打开package.json,参考以下各模块版本: "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^7.2.8", …...

【Axure教程0基础入门】00Axure9汉化版下载、安装、汉化、注册+01制作线框图

写在前面&#xff1a;在哔哩哔哩上面找到的Axure自学教程0基础入门课程&#xff0c;播放量最高&#xff0c;5个多小时。课程主要分为4个部分&#xff0c;快速入门、动态面板、常用动效、项目设计。UP主账号【Song老师产品经理课堂】。做个有素质的白嫖er&#xff0c;一键三连必…...

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…...

element ui组件 el-date-picker设置default-time的默认时间

default-time &#xff1a;选择日期后的默认时间值。 如未指定则默认时间值为 00:00:00 默认值修改 <el-form-item label"计划开始时间" style"width: 100%;" prop"planStartTime"><el-date-picker v-model"formData.planStart…...

###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 今天&#xff0c;我们主要分享三个问题如何用C语言去求解&#xff0c;1.斐波…...

蓝桥杯 第 1 场 小白入门赛

目录 1.蘑菇炸弹 2.构造数字 3.小蓝的金牌梦 4.合并石子加强版 5.简单的LIS问题 6.期望次数 1.蘑菇炸弹 我们直接依照题目 在中间位置的数进行模拟即可 void solve(){cin>>n;vector<int> a(n1);for(int i1;i<n;i) cin>>a[i];int ans0;for(int i2;i…...

飞天使-linux操作的一些技巧与知识点5-expect与docker便捷命令

expect 主要使用场景不输入账户密码的多 yum install -y expect 则可以安装上 #!/usr/bin/expect -f set username “root” set password “123456” spawn /bin/bash send “cd /data/container/\r” expect "$ " # 等待命令提示符 send “git pull\r” expect…...

编曲学习:和声音程 调式体系 唱名法 调式调性

34届和声音程 调式体系 唱名法 调式调性https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65af994be4b064a8cb1c3a5f?course_idcourse_2XLKtQnQx9GrQHac7OPmHD9tqbv 34届独立音乐人编曲训练营https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_p…...

【大数据】Flink 架构(四):状态管理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…...

执行rpm安装命令的时候抛出异常:rpmdb BDB0113 Thread/process

问题现象 错误&#xff1a;rpmdb: BDB0113 Thread/process 66126/140498505373504 failed: BDB1507 Thread died in Berkeley DB library 错误&#xff1a;db5 错误(-30973) 来自 dbenv->failchk&#xff1a;BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery 错…...

Android 在WebView中加载H5传递图片

最近h5开发一个编译器&#xff0c;要在手机上显示&#xff0c;需要获取手机上的图片&#xff0c;使用webview不能直接到文件管理拿取&#xff0c;还需要对webview做处理&#xff0c;做个记录&#xff0c;方便以后使用&#xff1b; public ValueCallback<Uri[]> mUploadMe…...

图的学习

图的基本概念和术语 图的定义&#xff1a;图是由顶点的有穷非空集合和顶点之间的边的集合组成的&#xff0c;G表示&#xff0c;V是图G中顶点的集合&#xff0c;E是图G中边的集合 无向图&#xff1a;任意两点的边都是无向边组成的图&#xff08;无向边&#xff1a;&#xff08…...

空间数据分析入门POI与莫兰指数基础知识笔记

1. 空间分析与POI 1.1. 什么是POI POI是“Polnt of Information”的缩写&#xff0c;中文可以翻译为“信息点”。POI是地图上任何非地理意义的有意义的点&#xff0c;如商店、酒吧、加油站、医院、车站等。这些点通常包括名称、类别、经纬度和地址等基本信息。此外&#xff0…...

TortoiseSVN各版本汉化包下载

首先进入下载版本列表 1.下载地址&#xff1a;https://sourceforge.net/projects/tortoisesvn/files ​ 2.选择自己版本进入​ 3.选择Language Packs进入&#xff0c;选择对应语言包下载。 ​ 4.在TortoiseSVN根目录下点击安装即可。 ​...

STM32连接阿里云物联网平台

文章目录 引言一、STM32连接阿里云物联网平台思路二、ESP8266烧录固件三、使用AT指令连接阿里云物联网平台四、STM32环形串口缓冲区驱动程序五、STM32连接阿里云驱动程序 引言 连续写了两篇关于阿里云连接的文章&#xff0c;都是使用Arduino ESP8266 & Arduino ESP32的方式…...

力扣hot100 组合总和 回溯 剪枝 组合

Problem: 39. 组合总和 文章目录 思路复杂度&#x1f496; Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code class Solution{List<List<Integer>> res new ArrayList<>();int x;// 全局targetin…...

代码随想录 Leetcode669. 修剪二叉搜索树

题目&#xff1a; 代码(首刷看解析 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return root;if (root->val < low) {TreeNode* node trimBST(root->right,low,high);return…...

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…...

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...