105.【Docker】(六)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 105.【Docker】

3.具名挂载 & 匿名挂载

(1).匿名挂载
# 匿名挂载,
注意这里使用-P表示的指定随机的端口号,没有指定主机的位置信息   -v 容器内路径
 [root@Jsxs home]#  docker run  -d -P --name nginx01 -v /etc/nginx nginx
 [root@Jsxs home]# docker volume ls    #匿名挂载信息查询
DRIVER    VOLUME NAME
local     0f4d71c052604b6e9e65800064b6e39c2b2d0b38f94b45beaa84792807c0c914
local     ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb
# 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径
------------------------------------------------------------------------
# 查看卷的具体信息
[root@Jsxs home]# docker inspect ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb
[
    {
        "CreatedAt": "2023-03-22T15:59:12+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb/_data",
        "Name": "ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb", 挂载的具体目录的地址
        "Options": null,
        "Scope": "local"
    }
]

(2).具名挂载
# 具名挂载
 docker run -d -P --name 名字 -v 具名名字:容器路径 镜像
 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx  nginx
---------------------------------------------------------------------
[root@Jsxs home]# docker run  -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
f026e984d67a6b522ca380cfa6eec6424e918a672e268388d93ac2b8d276a773
[root@Jsxs home]# docker volum ls
docker: 'volum' is not a docker command.
See 'docker --help'
[root@Jsxs home]# docker volume ls
DRIVER    VOLUME NAME
local     0f4d71c052604b6e9e65800064b6e39c2b2d0b38f94b45beaa84792807c0c914
local     ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb
local     juming-nginx
# 查看卷的具体信息
[root@Jsxs home]# docker inspect juming-nginx
[
    {
        "CreatedAt": "2023-03-22T16:12:01+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", 挂载的具体目录的地址
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有Docker内的卷,没有指定目录的情况下都是在: /var/lib/docker/volumes/

(3).判断匿名挂载和具名挂载
# 如何确定是匿名挂载还是具名挂载,还是指定路径挂载  
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载,卷名没有路径/
-v 宿主机路径:容器内路径 # 指定路径挂载,一般/开头
(4).扩展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了这个容器权限,容器对我们挂载出来的内容就有了限定了
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
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法进行操作的

4.数据卷之DockerFile 【自定义镜像+挂载】💥

DockerFile 就是用来构建docker镜像的构建文件! 命令脚本!

通过这个脚本可以生成镜像,镜像是一层层的,脚本一个个的命令,每个命令都是一层!

1. 创建一个drockerfile文件,名字可以自定义
2. 文件中的内容: 
FROM Centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
---------------------------------------------------------------编写
[root@Jsxs home]# cd docker-test-volume/
[root@Jsxs docker-test-volume]# ls
[root@Jsxs docker-test-volume]# clear
[root@Jsxs docker-test-volume]# vim dockerfile1
[root@Jsxs docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#创建自定义镜像->
# -f 文件 -t 名字
[root@Jsxs docker-test-volume]# docker build -f dockerfile1 -t centos-test:1.0 . 
[+] Building 0.0s (5/5) FINISHED
 => [internal] load .dockerignore                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                      0.0s
 => [internal] load build definition from dockerfile1                                                                                                                0.0s
 => => transferring dockerfile: 120B                                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                                                     0.0s
 => [1/1] FROM docker.io/library/centos                                                                                                                              0.0s
 => exporting to image                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                              0.0s
 => => writing image sha256:0282d836c4f5ab8268cf4ebcf33ca7109bd03217f82358c4fa764466139852f2                                                                         0.0s
 => => naming to docker.io/library/centos-test:1.0    
 ---------------------------------------------------------------查看
[root@Jsxs /]# docker images   #查看镜像
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
nginx                 latest    605c77e624dd   14 months ago   141MB
tomcat                9.0       b8e65a4d736d   15 months ago   680MB
mysql                 5.7       c20987f18b13   15 months ago   448MB
hello-world           latest    feb5d9fea6a5   18 months ago   13.3kB
centos-test           1.0       0282d836c4f5   18 months ago   231MB #获取成功
centos                latest    5d0da3dc9764   18 months ago   231MB
portainer/portainer   latest    580c0e4e98b0   2 years ago     79.1MB
 ---------------------------------------------------------------启动

启动我们生成的镜像并查看

[root@Jsxs /]# docker run -it --name myCentos 0282d836c4f5 /bin/bash
[root@96c226405ba9 /]# ls -l

这个卷和外部一定有一个同步的目录 -> 匿名挂载

[root@96c226405ba9 /]# cd volume01  #进入数据卷01
[root@96c226405ba9 volume01]# ls
[root@96c226405ba9 volume01]# touch container.txt  #创建一个文件
[root@96c226405ba9 volume01]# ls
container.txt
[root@96c226405ba9 volume01]# exit  #离开
exit
CONTAINER ID   IMAGE                 COMMAND        CREATED         STATUS                      PORTS                                       NAMES
96c226405ba9   0282d836c4f5          "/bin/bash"    7 minutes ago   Exited (0) 28 seconds ago                                               myCentos
4aba86a517af   portainer/portainer   "/portainer"   4 hours ago     Up 4 hours                  0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   eager_agnesi
[root@Jsxs /]# docker inspect 96c226405ba9  #查看容器的详细信息

查看文件是否同步出去了

[root@Jsxs /]# cd /var/lib/docker/volumes/

同步

这种方式未来的使用非常多,因为我们自己通常会构建自己的镜像

假设构建镜像的时候没有挂载,需要自己手动挂载镜像 -v 卷名:容器内路径

5.数据卷容器 【容器和容器挂载】

注意: 
1.bin/bash是规定镜像启动时执行这条命令,centos镜像启动时默认会执行/bin/bash.所以这里可以省略。
2.可以通过镜像ID和镜像名创建容器
[root@Jsxs docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
nginx                 latest    605c77e624dd   14 months ago   141MB
tomcat                9.0       b8e65a4d736d   15 months ago   680MB
mysql                 5.7       c20987f18b13   15 months ago   448MB
hello-world           latest    feb5d9fea6a5   18 months ago   13.3kB
centos-test           1.0       0282d836c4f5   18 months ago   231MB
centos                latest    5d0da3dc9764   18 months ago   231MB
portainer/portainer   latest    580c0e4e98b0   2 years ago     79.1MB
[root@Jsxs docker-test-volume]# docker run -it --name docker01  centos-test:1.0  #新建容器并启动
[root@d0680299dc2b /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 22 09:53 dev
drwxr-xr-x   1 root root 4096 Mar 22 09:53 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 211 root root    0 Mar 22 09:53 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Mar 22 09:53 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Mar 22 09:53 volume01  #数据卷
drwxr-xr-x   2 root root 4096 Mar 22 09:53 volume02 #数据卷
# 在docker01不停止的情况下,启动docker02并挂载01
docker run -it --name docker02 --volumes-from docker01 centos-test:1.0
[root@15849a421f0d /]# ls -l  #
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 22 10:10 dev
drwxr-xr-x   1 root root 4096 Mar 22 10:10 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 217 root root    0 Mar 22 10:10 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Mar 22 10:10 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Mar 22 09:53 volume01
drwxr-xr-x   2 root root 4096 Mar 22 09:53 volume02
root@Jsxs ~]#cd volume01
root@Jsxs volume01]# touch docker01Create.txt
[root@Jsxs ~]# docker attach d0680299dc2b  #进入到docker01
[root@d0680299dc2b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02
[root@d0680299dc2b /]# cd volume01
[root@d0680299dc2b volume01]# ls  #发现也存在
docker01Create.txt

容器和容器键相互挂载了

再此创建docker03

[root@Jsxs /]# docker run -it --name docker03 --volumes-from docker01 centos-test:1.0
[root@db1ab3bfc102 /]# docker ps
bash: docker: command not found
[root@db1ab3bfc102 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02
[root@db1ab3bfc102 /]# cd volume01
[root@db1ab3bfc102 volume01]# ls
docker01Create.txt
[root@db1ab3bfc102 volume01]# touch docker03
[root@db1ab3bfc102 volume01]# ls
docker01Create.txt  docker03
[root@db1ab3bfc102 volume01]# [root@Jsxs /]#
[root@Jsxs /]# docker attach docker01
[root@d0680299dc2b volume01]# ls
docker01Create.txt  docker03

删除docker01也就是我们的父容器

[root@Jsxs /]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                       NAMES
db1ab3bfc102   centos-test:1.0       "/bin/sh -c /bin/bash"   3 minutes ago    Up 3 minutes                                                docker03
15849a421f0d   centos-test:1.0       "/bin/sh -c /bin/bash"   31 minutes ago   Up 31 minutes                                               docker02
d0680299dc2b   centos-test:1.0       "/bin/sh -c /bin/bash"   48 minutes ago   Up 48 minutes                                               docker01
4aba86a517af   portainer/portainer   "/portainer"             6 hours ago      Up 5 hours      0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   eager_agnesi
[root@Jsxs /]# docker rm -f d0680299dc2b
d0680299dc2b
[root@Jsxs /]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                       NAMES
db1ab3bfc102   centos-test:1.0       "/bin/sh -c /bin/bash"   4 minutes ago    Up 4 minutes                                                docker03
15849a421f0d   centos-test:1.0       "/bin/sh -c /bin/bash"   32 minutes ago   Up 32 minutes                                               docker02
4aba86a517af   portainer/portainer   "/portainer"             6 hours ago      Up 5 hours      0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   eager_agnesi
[root@Jsxs /]# docker attach docker02
[root@15849a421f0d volume01]# ls
docker01Create.txt  docker03

6. 多个MySql数据共享

docker run -d -p 3310:3306 
-v /etc/mysql/conf.d 
-v /var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=338218 
--name mysql01 mysql:5.7
docker run -d -p 3311:3306 
-e MYSQL_ROOT_PASSWORD=338218 
--name mysql02 
--volumes-from mysql01 mysql:5.7
# 这个时候可以实现两个容器数据同步

结论:

  • 容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止。(复制)
  • 但是一旦持久化到了本地,这个时候,本地的数据不会被删除

(七)、DockerFile

dockerfile是用来构建docker镜像的文件,命令参数脚本

1.构建步骤:

- 编写一个dockerfile文件
 - docker build构建为一个镜像
 - docker run 运行镜像
 - docker push发布镜像(DockerHub、阿里云镜像仓库)

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
  • 很多官方的镜像都是基础包,很多功能都没有(只是基础包)。我们通常会自己搭建自己的镜像


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
存储 API 持续交付
Docker介绍(一)
Docker是开源的应用容器引擎,让开发者打包应用及依赖到可移植容器中,可在任何环境一致运行。它提供快速启动、高效资源利用、轻松迁移和维护,适用于开发、测试和生产。Docker由客户端、守护进程、REST API组成,支持镜像存储在仓库如Docker Hub。容器是隔离的执行环境,能在同一主机上互不影响地运行多个容器。
|
9月前
|
运维 Java 虚拟化
[Docker] Docker为什么出现
[Docker] Docker为什么出现
|
9月前
|
JavaScript Linux Docker
【Docker】什么是Docker?
【4月更文挑战第20天】【Docker】什么是Docker?
|
9月前
|
应用服务中间件 nginx Docker
Docker的世界
Docker的世界
60 0
|
9月前
|
关系型数据库 MySQL 应用服务中间件
docker
docker
127 2
|
关系型数据库 MySQL 虚拟化
docker介绍
docker介绍
113 0
|
Linux 应用服务中间件 虚拟化
初识Docker
初识Docker
|
关系型数据库 MySQL 应用服务中间件
Docker
Docker 是一个开源的应用容器引擎,基于 Go语言并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
252 0
|
Docker 容器
Docker 初识
Docker 初识
67 0
|
Docker 容器
docker 使用技巧
1.更换镜像源;2.修改容器时区;3.宿主机与容器之间文件拷贝;4.docker运行过程中常见问题解决;
docker 使用技巧