Featured image of post Docker入门

Docker入门

安装Docker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1. 卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
# 2. 需要的安装包
yum install -y yum-utils

# 3. 设置镜像的仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 更新yum软件包索引
yum makecache fast

# 5. 安装docker相关的依赖
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6. 启动docker
systemctl start docker

# 7. 使用docker version查看是否安装成功

# 8. Hello world
docker run hello-world

# 9. 查看一下下载的这个hello-world镜像
docker images

卸载Docker

1
2
3
4
5
6
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 2. 删除资源
rm -rf /var/lib/docker # docker的默认工作路径
rm -rf /var/lib/containerd

阿里云镜像加速

登录阿里云找到容器服务

找到镜像加速地址

Docker为什么比vm快

  • Docker有着比虚拟机更少的抽象层

  • docker利用的是宿主机的内核,vm需要的是Guest OS

Run流程

Docker – 帮助命令

1
2
3
docker version	    # 显示docker的版本信息
docker info         # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help   # 万能命令 帮助命令

docker命令文档

Docker – 镜像命令

查看镜像

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   15 months ago   13.3kB

# 解释
REPOSITORY   镜像的仓库源
TAG          镜像的标签
IMAGE ID     镜像的id
CREATED      镜像的创建时间
SIZE         镜像的大小

搜索镜像

docker search 镜像名称

1
2
3
4
5
6
7
[root@docker ~]# docker search mysql
NAME      DESCRIPTION               STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used    13681     [OK]       
mariadb   MariaDB Server is a high  5225      [OK]   

# 可选项 过滤条件
--filter=STARS=3000  # 搜索出来的镜像的STARS大于3000的

下载镜像

docker pull 镜像名称

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[root@docker ~]# docker pull mysql[:tag]  可选项 tag 指定版本   
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载,docker镜像的核心
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 镜像ID #删除指定镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[root@docker ~]# docker rmi -f c20987f18b13
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92

# 删除多个镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id

# 删除所有镜像
docker rmi -f $(docker images -aq)

Docker – 容器命令

说明: 有了镜像才可以创建容器,所以先下载一个centos镜像来测试学习

1
docker pull centos

创建容器

docker run [可选参数] image 启动容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 新建容器并启动

docker run [可选参数] image

# 可选参数说明
--name='Name'   容器名字 tomcat01/tomcat02 用来区分容器
-d              后台方式运行
-it             使用交互方式运行,进入容器查看内容
-p              指定容器的端口 -p
  -p ip:主机端口:容器端口
  -p 主机端口:容器端口
  -p 容器端口
-P              随机指定端口

# 测试,启动并进入容器
[root@docker ~]# docker run -it centos /bin/bash
[root@2913f3a8c3b9 /]# ls 查看容器内的centos
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

查看容器

docker ps # 查看当前正在运行中的容器

1
2
3
4
5
6
7
[root@docker /]# docker ps  
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 可选参数说明
-a   # 查看所有的容器,包括未运行的容器
-n=? # 显示最近创建的容器,?为显示个数
-q   # 只显示容器的编号

退出容器

1
2
3
4
5
# 直接停止容器并退出
[root@2913f3a8c3b9 /]# exit

# 容器不停止退出
Ctrl + P + Q

删除容器

docker rm 容器ID # 删除指定容器,不能删除正在运行的容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@docker /]# docker ps -aq
8f6cded1de29
2913f3a8c3b9
1e9519071c11
38e22de26669
[root@docker /]# docker rm 8f6cded1de29
8f6cded1de29
[root@docker /]# docker ps -aq         
2913f3a8c3b9
1e9519071c11
38e22de26669

# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm

启动容器

docker start 容器id

1
2
3
4
# 补充
docker restart 容器id  # 重启容器
docker stop 容器id     # 停止当前正在运行的容器
docker kill 容器id     # 强制停止当前容器

常用的其他命令

后台启动容器

docker run -d 镜像名

1
2
3
4
5
6
7
8
[root@docker /]# docker run -d centos
eddc149d6e24582c1d8fe356f2d9559215f683ee10108fbeb4e4db435f7a3355
[root@docker /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 问题 docker ps 发现 centos 停止了

# 常见的坑: docker 容器使用后台运行  就必须有一个前台进程,docker发现没有应用,就会自动停止

查看日志

docker logs

1
2
3
4
# 显示日志
-tf            # 显示日志
--tail number  # 要显示的日志条数
[root@docker /]# docker logs -tf --tail 10 容器id

查看容器中进程信息

docker top 容器id

1
2
3
[root@docker /]# docker top e4a8c1e80579
UID      PID     PPID   C     STIME   TTY      TIME        CMD
root     2942    2923   0     16:02  pts/0   00:00:00   /bin/bash

查看镜像的元数据

docker inspect 容器id

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@d6e2d66837c2 /]# [root@docker /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
d6e2d66837c2   centos    "/bin/bash"   12 seconds ago   Up 11 seconds             thirsty_rhodes
[root@docker /]# docker inspect d6e2d66837c2
[
    {
        "Id": "d6e2d66837c219ba3250c0f45ed984cdc6dd21c8cd23372f36dac3d65dd2e981",
        "Created": "2023-01-12T08:38:21.597122836Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3243,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-01-12T08:38:21.896883638Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
]

进入当前正在运行的容器

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

# 进入容器方式一
docker exec -it 容器id bashShell

# 进入容器方式二
docker attach 容器id

# docker exec     # 进入容器后开启一个新的终端,可以在里面操作
# docker attach   # 进入容器正在执行的终端

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 查看home目录下,此时home目录下只有admin
[root@docker ~]# cd /home
[root@docker home]# ls
admin

# 启动docker
[root@docker home]# systemctl start docker

# 当前的镜像
[root@docker home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   16 months ago   231MB

# 新建一个容器并启动
[root@docker home]# docker run -it centos /bin/bash

# 进入docker容器内部
[root@47b3a0402593 /]# [root@docker home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
47b3a0402593   centos    "/bin/bash"   48 seconds ago   Up 47 seconds             dreamy_cerf
[root@docker home]# docker attach 47b3a0402593
[root@47b3a0402593 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@47b3a0402593 /]# cd /home
[root@47b3a0402593 home]# ls

# 在容器的home目录内新建一个文件
[root@47b3a0402593 home]# touch test.java
[root@47b3a0402593 home]# ls
test.java
[root@47b3a0402593 home]# exit
exit
[root@docker home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@docker home]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED        STATUS                      PORTS     NAMES
47b3a0402593   centos         "/bin/bash"   2 hours ago    Exited (0) 32 seconds ago             dreamy_cerf

# 将文件拷贝到虚拟机上的home目录
[root@docker home]# docker cp 47b3a0402593:/home/test.java /home
[root@docker home]# ls
admin  test.java

部署Nginx

搜索镜像

docker search nginx 或者 在 docker Hub上搜索,可以看到帮助文档

下载镜像

docker pull nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

运行测试

docker run -d –name nginx -p 3344:80 nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   12 months ago   141MB
centos       latest    5d0da3dc9764   16 months ago   231MB

# 参数说明
# -d 后台运行
# --name 给容器命名
# -p 端口暴露 宿主机端口:容器内端口
[root@docker ~]# docker run -d --name nginx -p 3344:80 nginx 
e25907b771ccef91c5e34472a1865c007eba33606a0acb4d738efad0ca72dc61

[root@docker ~]# 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>

进入容器

1
2
3
4
5
6
[root@docker ~]# docker exec -it nginx /bin/bash
root@e25907b771cc:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@e25907b771cc:/# cd /etc/nginx
root@e25907b771cc:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

部署tomcat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 官方的使用
docker run -it --rm tomcat:9.0

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

# 1.下载镜像
# docker pull tomcat:9.0

# 2.启动运行
# docker run -d --name tomcat -p 3355:8080 tomcat:9.0

# 3.测试访问没有问题,但是报404错误,进入容器,一探究竟
# docker exec -it tomcat /bin/bash

# 4.发现问题
root@bc6aaf2c5773:/usr/local/tomcat# ll                 # linux命令缺失
bash: ll: command not found
root@bc6aaf2c5773:/usr/local/tomcat# cd webapps/
root@bc6aaf2c5773:/usr/local/tomcat/webapps# ls
root@bc6aaf2c5773:/usr/local/tomcat/webapps#            # webapps目录下为空

# 5.原因:阿里云镜像,默认是最小的镜像,所有不必要都剔除掉,保证最小可运行环境

# 6.解决方式 webapps目录下的文件可以从webapps.dist文件下拷贝
root@bc6aaf2c5773:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@bc6aaf2c5773:/usr/local/tomcat# cd webapps
root@bc6aaf2c5773:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

# 7.ip+端口访问,发现能正常看到页面了

部署ES+Kibana

1
2
# 启动 Elasticsearch,若没有这个镜像则会下载下来
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

问题,ES比较占内存,所以一核2G的配置很卡,CPU占用大,所以在测试通过后,尽快关闭,解决这个问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 说明ES安装成功
[root@docker ~]# curl localhost:9200
{
  "name" : "08145df3cc6e",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "td15eI9XTp-yIObP-XKP4w",
  "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 stats查看CPU的状态,此时占用较大
[root@docker ~]# docker stats
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O         PIDS
ab215f92c5d1   elasticsearch   173.32%   606.9MiB / 972.3MiB   62.42%    656B / 0B   2.56GB / 73.8MB   19

解决方式 增加内存的限制,修改配置文件 -e 环境配置修改

1
2
# 参数说明 设定最小是64M,最大是512M
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e  ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
1
2
3
4
# 查看CPU的状态 --- 发现占用率下降很多了
[root@docker ~]# docker stats
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O        PIDS
1ac5d28a7744   elasticsearch   0.15%     394.7MiB / 972.3MiB   40.59%    1.25kB / 996B   214MB / 1.66MB   43

可视化工具

Portainer

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

1
2
3
# 启动Portainer
docker run -d -p 8088:9000 --name portainer \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

浏览器访问http://ip+端口,获取如下页面,首次登录,需要创建用户名密码

下一步,选择本地

进入面板,即可看到详细信息,例如镜像数量,容器情况等

Docker镜像详解

镜像是什么

  • 是一种轻量化,可执行的独立软件包
  • 用来打包软件运行环境和基于运行环境开发的软件
  • 包括代码,运行时,库,环境变量和配置文件

所有的应用,直接打包docker镜像,就可以直接运行

Docker镜像加载原理

UnionFS(联合文件系统)

  • 是一种分层,轻量级并且高性能的文件系统
  • 一次同时加载多个文件系统,在外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

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

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

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

平时我们安装进虚拟机的CentOs通常要几个G,为什么Docker这里的才200M

1
2
3
[root@docker ~]# docker images centos
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   16 months ago   231MB

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

分层理解

分层的镜像

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@docker ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

思考!为什么 Docker镜像要采用这种分层的结构呢?

最大的好处,莫过于是资源共享了,比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享

使用 docker image inspect redis:latest 查看镜像的分层方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
"RootFS": {
    "Type": "layers",
    "Layers": [
        "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
        "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
        "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
        "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
        "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
        "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
    ]
},

特点

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

这一层就是我们通常说的容器层,容器之下都叫镜像层!

commit镜像

1
2
docker commit # 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 启动一个默认的tomcat
[root@docker ~]# docker run -it -p 8080:8080 tomcat:9.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.56

# 发现这个默认的tomcat 是没有webapps应用的 官方的镜像webapps目录下默认没有文件
[root@docker ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS          NAMES
0a2f11347ef5   tomcat:9.0   "catalina.sh run"   11 minutes ago   Up 10 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   loving_nightingale
[root@docker ~]# docker exec -it 0a2f11347ef5 /bin/bash
root@0a2f11347ef5:/usr/local/tomcat# cd webapps
root@0a2f11347ef5:/usr/local/tomcat/webapps# ls
root@0a2f11347ef5:/usr/local/tomcat/webapps#

# 将webapps.dist目录下的文件拷贝到webapps目录下
root@0a2f11347ef5:/usr/local/tomcat# cp -r webapps.dist/* webapps 
root@0a2f11347ef5:/usr/local/tomcat# cd webapps
root@0a2f11347ef5:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

# 将我们操作过的这个容器通过commit提交为一个新的镜像,我们以后就使用这个镜像即可
[root@docker ~]# docker commit -a="satan" -m="add webapps app" 0a2f11347ef5 tomcat2:2.0
sha256:6ae624cd277319840b93a7208edb4f32cfb56dc03fd3e40db8b11f2af1e414d4
[root@docker ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat2               2.0       6ae624cd2773   14 minutes ago   685MB
nginx                 latest    605c77e624dd   12 months ago    141MB
tomcat                9.0       b8e65a4d736d   13 months ago    680MB
redis                 latest    7614ae9453d1   13 months ago    113MB
centos                latest    5d0da3dc9764   16 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   22 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   2 years ago      791MB

容器数据卷

什么是容器数据卷

回顾之前的不足

  • 我们的数据都在容器中,如果我们容器删除,数据就会丢失
  • mysql数据库中的数据,如果容器删掉了,重要数据无备份

因此,有了新的需求

  • 数据可以持久化
  • mysql数据可以存储在本地

解决方案

  • 容器之间有一个数据共享的技术,Docker容器中产生的数据,同步到本地

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!