资讯详情

Docker笔记

文章目录

  • Docker入门
    • Docker官网
    • Docker镜像仓库
    • 比较虚拟机技术和容器化技术
    • Docker的基本组成
    • 如何卸载docker
    • 阿里云镜像加速
    • Docker执行流程
    • 底层原理
    • Docker常用命令
      • 1 基础命令
      • 2 镜像命令
      • 3 容器命令
      • 4 其它重要的常用命令
        • 1 日志的查看
        • 2 在容器中查看过程信息
        • 3 查看容器元数据
        • 4 进入当前正在运行的容器
        • 5 拷贝操作
    • 作业
      • 部署nginx
      • 部署tomcat
      • 部署ES kibana
    • 可视化
    • Docker镜像详解
      • 1 什么是镜像
      • 2 Docker镜像加载原理
      • 3 分层理解
      • 4 提交镜像
  • Docker精髓
    • 容器数据卷
      • 1. 数据卷介绍
      • 2. 使用
      • 3. MySQL建立数据卷同步数据容器
    • 具名挂载和匿名挂载
      • 1 匿名挂载
      • 2 具名挂载
    • DockerFile
      • 1. 初识DockerFile
      • 2. 容器数据卷
      • 3. Dockerfile介绍
      • DockerFile的构建过程
      • 4. Dockerfile指令说明
      • 制作镜像
        • 制作centos镜像
        • RUN和CMD和ENTRYPOINT的区别
        • 制作tomcat镜像并发布
      • 1 制作Tomcat镜像
      • 2 发布镜像到DockerHub
      • 3 发布镜像到阿里云容器服务
    • Docker网络
      • Docker默认网络模式
        • 1 host模式
        • 2 container模式
        • 3 none模式
        • 4 bridge模式
      • --link
      • 自定义网络
      • Docker互联网
    • Docker网络实战练习
      • 1 Redis集群部署
      • 2 SpringBoot项目包装镜像
    • 注意

Docker入门

Docker官网

https://www.docker.com/

Docker镜像仓库

https://hub.docker.com/

你可以在上面发布己的镜像,也可以拉别人发布的镜像

比较虚拟机技术和容器化技术

虚拟化技术特点:1.资源占用量大 2.冗余步骤多 3.启动很慢

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

比较Docker与虚拟机不同: 1.传统的虚拟机,虚拟硬件,运行一个完整的操作系统,然后安装和软件。

2.Docker宿主机内核中直接运行容器中的应用,容器没有自己的内核,也没有虚拟硬件。

3.每个容器相互隔离,每个容器都有自己的文件系统,不相互影响。

容器化的好处

img

Docker的基本组成

相关名词

如何卸载docker

(安装docker过程在这里—>http://hyxjackson.gitee.io/myblog/2022/04/22/Java部分环境配置/##more)

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

阿里云镜像加速

Docker执行流程

底层原理

docker怎样工作?

Docker是一个Client-Server结构系统,Docker主机上运行的守护过程Socket访问客户端!Docker Server接收到Docker-Client该指令将执行!

Docker为什么比(虚拟机)VM Ware快?

1、Docker抽象层比虚拟机少

2、Docker使用宿主机的内核,VM需要的是Guest OS

Docker新建容器时,不需要像虚拟机一样重新加载操作系统核心,直接使用宿主机的操作系统,需要加载虚拟机Guest OS。

Docker和VM对比如下:

Docker常用命令

1 基础命令

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

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

2 镜像命令

1. 查看当地主机的所有镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

#解释:
1.REPOSITORY  镜像的仓库源

2.TAG  镜像的标签

3.IMAGE ID 镜像的id

4.CREATED 镜像的创建时间

5.SIZE 镜像的大小


# 可选参数

-a/--all 列出所有镜像

-q/--quiet 只显示镜像的id

2. 搜索镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10308     [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3819      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   754                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   517       [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   86
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79
centurylink/mysql                 Image containing mysql. Optimized to be link…   60                   [OK]


#可选参数

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的镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10308     [OK]
mariadb   MariaDB is a community-developed fordockerk of MyS…   3819      [OK]
123456789101112131415161718192021222324252627

3. 下载镜像 ,tag就是版本号

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest            #如果不写tag,默认版本就是latest(最新版)
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete          #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #下载来源的真实地址 #docker pull mysql等价于docker pull 
docker.io/library/mysql:latest
123456789101112131415161718

指定版本下载

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7 (得看docker仓库(docker hub)有什么版本)
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
529dc8dbeaf3: Pull complete
bc9d021dc13f: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

4. 删除镜像

rmi是remove image的缩写

#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)

3 容器命令

如拉取一个centos镜像

docker pull centos

运行容器的命令说明:

docker run [可选参数] image

#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容(是-i和-t两个命令合在一起的)
-p                     指定容器的端口(小写的p)
(
-p ip:主机端口:容器端口  配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P                     随机指定端口(大写的P)

运行并进入容器centos

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash 
[root@bd1b8900c547 /]# ls #(bd1b8900c547是容器id)
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

退出容器命令:

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

列出运行过的容器命令:

#docker ps 
     # 列出当前正在运行的容器
-a   # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q   # 只显示容器的编号


[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin

删除容器命令:

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           #强制停止当前容器

4 其他重要的常用命令

1 日志的查看

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数


#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   13 seconds ago   Up 10 seconds             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f #10表示显示10条日志
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi

2 查看容器中进程信息

# docker top 容器id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11156               11135               0                   11:31               ?                   00:00:00            /bin/sh -c while true;do echo hi;sleep 5;done
root                11886               11156               0                   11:43               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5

3 查看容器的元数据

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker inspect 容器id

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

因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置

方式一:(比较常用)

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it 容器id /bin/bash 
[root@c703b5b1911f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c703b5b1911f /]# ps -ef 
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:31 ?        00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root       279     0  0 03:54 pts/0    00:00:00 /bin/bash
root       315     1  0 03:56 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root       316   279  0 03:56 pts/0    00:00:00 ps -ef

方式二:

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach 容器id

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

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

5 拷贝操作

拷贝操作的命令如下:

#拷贝容器的文件到主机中
docker cp 容器id:容器内路径  目的主机路径

#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径

#进入容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it 容器id /bin/bash
[root@c703b5b1911f /]# cd home
[root@c703b5b1911f home]# ls
#touch 新建文件
[root@c703b5b1911f home]# touch test.java
[root@c703b5b1911f home]# ls
test.java
[root@c703b5b1911f home]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   35 minutes ago   Up 35 minutes             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp 容器id:/home/test.java /home
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai  pan  test.java

命令小节的图解如下:

1.前台交互式启动docker容器:docker run -it image:tag /bin/bash

2.后台守护式启动docker容器:docker run -d image:tag /bin/bash

3.前台交互式启动与后台守护式启动适应场景:

前台交互式启动适合ubuntu,nginx 。,因为ubuntu,nginx没有前台进程,如果使用后台守护式启动会导致容器立即自杀,它觉得没事可做了。这是docker机制的问题,所以最佳解决方案是以前台交互式启动,表示我还要交互操作。

后台守护式启动适合redis这些有前台进程的镜像,因为容器不会自动挂掉,并且若redis使用前台交互式启动,被操作人员不小心关掉终端(如exit,ctrl+c),会导致穿透、雪崩等一系列问题。所以redis适合后台守护式启动。

docker机制:docker容器后台运行,就必须有一个前台进程

作业

部署nginx

docker pull nginx  #拉取镜像
# -d 后台启动
# --name 名字 表示给容器起名
# -p 宿主机端口:容器端口 
docker run -d --name nginx01 -p 3344:80 nginx   #后台启动 3344是服务器对外端口,80是docker内部端口,通过服务器的3344端口就可以访问docker的80端口 (个人认为这里是docker做了映射)

curl localhost:3344   #查看本机3344


docker exex -it nginx01 /bin/bash   #进入容器

ip:3344   #公网访问,(这里ip要填你的服务器的ip)
#可以看到结果访问到的就是nginx的默认首页

docker stop 容器id   #停止容器

部署tomcat

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

# 我们之前启动都是后台启动,退出容器之后,容器嗨是可以查到,而docker run -it --rm tomcat:9.0一般用来测试,用完即删(前期学习不建议这么用)


docker pull tomca:9.0  #拉取镜像

docker run -d -p 3355:8080 --name tomcat01 tomcat #启动
#通过外部ip访问,如果报404,说明官网的这个tomcat镜像是阉割版的tomcat,并不是完全版的
docker exec -it tomcat01 /bin/bash

#发现问题 
# 1、Linux命令少了
# 2、tomcat中没有webapps
#阿里云镜像的原因。默认是最小的镜像,所有不必要的都删掉,保证最小的可运行的环境

#发现webapps.dist目录
# 可以把webapps.dist目录下的文件拷贝到webapps下,然后再重新访问
cp  -r webapps.dist webapps

部署ES+ kibana

ES就是 ElasticSearch。没学过的小伙伴可以自行查阅一下

问题
# 1、es暴露的端口很多
# 2、es十分消耗内存
# 3、es的数据一般需要放置到安全目录! 挂载
# --net somenetwork 网络配置
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag  #(tag换成版本号)


docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# docker十分耗内存,启动会卡
docker stats (容器id) #查看cpu的状态 (可以加上容器id)
curl localhost:9200  #本地测试

# 启动的时候修改配置 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" 配置ElasticSearch的虚拟机占用的内存大小
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

思考:kibana如何才能连接es?如何通过网络才能连接过去

可视化

管理镜像的工具

  • portainer (平时不怎么用,知道一下就好)portainer是docker的图形化界面管理工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试 : 服务器ip:8088

这里第一次进来需要设置密码: 我这里是admin123+

选择local连接即可

进入面板

  • Rancher (CI/CD 再用,即持续集成和部署的时候再用)

Docker镜像详解

1 什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。

2 Docker镜像加载原理

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

3 分层理解

[root@iZwz9b8v7o84uw1vut700pZ ~]# docker image inspect nginx:latest
[
    { 
        
        "Id": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-29T19:28:29.892199479Z",
        "Container": "ca3e48389f7160bc9d9a892d316fcbba459344ee3679998739b1c3cd8e56f7da",
        "ContainerConfig": { 
        
            "Hostname": "ca3e48389f71",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": { 
        
                "80/tcp": { 
        }
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": { 
        
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": { 
        
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": { 
        
                "80/tcp": { 
        }
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": { 
        
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 141479488,
        "VirtualSize": 141479488,
        "GraphDriver": { 
        
            "Data": { 
        
                "LowerDir": "/var/lib/docker/overlay2/4c79c395f5276d6c16a5bb333597bd738c7fa91b2416db4e794feef3da840fd7/diff:/var/lib/docker/overlay2/d470f08d952b1012089ae05d2805014103385170fdfa4ae501190faef6abf68e/diff:/var/lib/docker/overlay2/aaed06144bf25b92f0a78704427cf79b9a9b4b7f4812173b3443d2d09ce59b09/diff:/var/lib/docker/overlay2/8f7e3a46f2c363ebb060a3695efc59fbec3202b01a9a6f17af4b607a93e84133/diff:/var/lib/docker/overlay2/8693e5bafb4e5803078339692b1733d67ce51cfdd37109e0a8cbec45103827cc/diff",
                "MergedDir": "/var/lib/docker/overlay2/3781000955df3873afe2989265b4576804fc9cf710696d18db89c11a502e2446/merged",
                "UpperDir": "/var/lib/docker/overlay2/3781000955df3873afe2989265b4576804fc9cf710696d18db89c11a502e2446/diff",
                "WorkDir": "/var/lib/docker/overlay2/3781000955df3873afe2989265b4576804fc9cf710696d18db89c11a502e2446/work"
            },
            "Name": "overlay2"
        },
        "RootFS": { 
        
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8",
                "sha256:b8d6e692a25e11b0d32c5c3dd544b71b1085ddc1fddad08e68cbd7fda7f70221",
                "sha256:f1db227348d0a5e0b99b15a096d930d1a69db7474a1847acbc31f05e4ef8df8c",
                "sha256:32ce5f6a5106cc637d09a98289782edf47c32cb082dc475dd47cbf19a4f866da",
                "sha256:d874fd2bc83bb3322b566df739681fbd2248c58d3369cb25908d68e7ed6040a6"
            ]
        },
        "Metadata": { 
        
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

这里指示了分层信息:

"RootFS": { 
        
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8",
                "sha256:b8d6e692a25e11b0d32c5c3dd544b71b1085ddc1fddad08e68cbd7fda7f70221",
                "sha256:f1db227348d0a5e0b99b15a096d930d1a69db7474a1847acbc31f05e4ef8df8c",
                "sha256:32ce5f6a5106cc637d09a98289782edf47c32cb082dc475dd47cbf19a4f866da",
                "sha256:d874fd2bc83bb3322b566df739681fbd2248c58d3369cb25908d68e7ed6040a6"
            ]
        },

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzqNLUsd-1651031629498)(https://gitee.com/hyxJackson/picturesave/raw/master/20210718123636415.png)]

4 提交镜像

使用docker commit 命令提交容器成为一个新的版本

docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 
123

由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体命令如下:

# 启动默认tomcat,发现webapps目录下没有东西
[root@iZwz9b8v7o84uw1vut700pZ ~]# docker run -it --rm tomcat:9.0
[root@iZwz9b8v7o84uw1vut700pZ ~]# docker exec -it 34a4760d9b87 /bin/bash

root@34a4760d9b87:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@34a4760d9b87:/usr/local/tomcat# cd webapps
root@34a4760d9b87:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager


ip:8080访问,可以看到tomcat的默认首页

如果无法访问,记得查看Linux防火墙的8080端口以及阿里云的安全组有没有开放8080端口

# 提交自己的镜像 docker commit -m="add webapps" -a="Kay" 34a4760d9b87 mytomcat:1.0
[root@iZwz9b8v7o84uw1vut700pZ ~]# docker commit -m="add webapps" -a="Kay" 34a4760d9b87 mytomcat:1.0
sha256:17cb58cc1f500837eb2bb56ba1802cf2011d7a53b1e9d3f92928b5d7458c1e97

# 可以看到我们自己的镜像 mytomcat 已经提交好了,版本号也是我们自己设定的版本号 1.0
[root@iZwz9b8v7o84uw1vut700pZ ~]# docker images
REPOSITORY            TAG          IMAGE ID       CREATED         SIZE
mytomcat              1.0          17cb58cc1f50   8 seconds ago   685MB
rabbitmq              management   32d80c948e6c   11 days ago     257MB
mongo                 latest       b21ad2afe409   13 days ago     700MB
nginx                 latest       605c77e624dd   3 months ago    141MB
tomcat                9.0          b8e65a4d736d   4 months ago    680MB
hello-world           latest       feb5d9fea6a5   7 months ago    13.3kB
centos                latest       5d0da3dc9764   7 months ago    231MB
portainer/portainer   latest       580c0e4e98b0   13 months ago   79.1MB

一个小技巧

如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像
就好比虚拟机中的快照,可以保存当前的状态

Docker精髓

容器数据卷

1. 数据卷介绍

Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷技术。

容器之间可以有一个数据共享的技术(卷技术)!Docker容器中产生的数据,同步到本地。

卷技术可以将我们容器内的目录,挂载到Linux主机上

卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。

数据卷的特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

卷技术小结:容器的持久化和同步操作,容器之间也可以进行数据的共享

2. 使用

方式一:运行容器,指定挂载数据卷命令:

docker run -it -v 主机目录:容器目录

将主机目录/home/test和容器/home建立数据卷

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

可以发现,home目录下多了test这个文件夹,接下来,容器里面的home目录下的内容都会自动同步到宿主机下的 /home/test目录,在宿主机的内容也会自动同步到容器内

查看是否挂载成功

[root@VM-20-17-centos home]# docker inspect df7f51983d11(这个是容器id)

①在容器内部创建一个文件

[root@df7f51983d11 home]# touch test.java
[root@df7f51983d11 home]# ls
test.java

在宿主机的test下查看

[root@VM-20-17-centos home]# cd test
[root@VM-20-17-centos test]# ls
test.java

②在宿主机添加文件

[root@VM-20-17-centos test]# touch test02.java

在容器内部查看

[root@df7f51983d11 home]# ls
test.java  test02.java

退出容器 (退出容器后,宿主机的操作依旧会同步到容器)

[root@df7f51983d11 home]# exit
exit

小技巧:通过同步之后,以后只需要在宿主机修改配置文件,容器内的配置就会自动同步,而不需要每次都进入容器去修改配置

3. MySQL容器建立数据卷同步数据

(这里宿主机如果已经有安装过mysql的话,很可能发生冲突,很大可能是本机挂载的配置文件中已有文件,将容器中的配置给覆盖了,我们将相应的本机文件中的文件配置删除即可)

[root@VM-20-17-centos ~]# docker pull mysql:5.7 #拉取镜像
# 运行容器,需要做数据挂载
# 安装启动mysql,需要配置mysql的密码,不然启动不了
# 官方 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# -v 数据卷挂载,下面的命令是挂载mysql的配置文件 conf.d和mysql的数据文件 data,并且给mysql设置密码
# -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


        标签: bf3v系列圆柱形光电传感器贴片二极管丝印f17

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台