Docker(二)

目录

5.数据卷

1.什么是数据卷

2.使用数据卷

1.实战:mysql

2.删除容器

3.匿名和具名挂载

3.DockerFile

4.容器数据卷

6.DockerFile

1.DockerFile介绍

2.DockerFile的构建过程

3.DockerFile指令

1.创建一个自己的centos

2.CMD和ENTRYPOINT区别

4.Dockerfile制作tomcat镜像

5.发布到docker hub 

6.发布到阿里云镜像服务上

7.总结

8.Docker网络

1.理解Docker0

3.自定义网络

4.网络连通

5.实战:部署redis集群

9.SpringBoot微服务打包Docker镜像


5.数据卷

1.什么是数据卷

docker理念回顾

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

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

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

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

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

 总结:容器的持久化和同步操作!容器间数据也是可以共享的!

2.使用数据卷

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

docker run -it -v 主机目录:容器目录
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

启动之后新开一个窗口,通过 docker inspect 容器id 查看具体挂载的内容

测试文件的同步(在主机上改动,观察容器变化)

再来测试

  • 1.停止容器,然后在主机上修改文件

  • 2.启动并进入容器,查看容器内数据,容器内的数据依旧是同步的!

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

1.实战:mysql

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

# 获取镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7
 
# 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意)
# 官方测试, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
 
# 启动我们的
-d      # 后台运行
-p      # 端口隐射
-v      # 卷挂载
-e      # 环境配置
--name  # 容器的名字
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# 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=000000 --name mysql01 mysql:5.7
4e380de478d6ce69e23c4253e03c2beb9482ac2c300be9a9bc6f499b94882c7e
  • 1.启动成功之后,将阿里云服务器打开安全组3310端口

  • 2.我们在本地使用navicat链接测试一下

  • 3.查看本地目录和myql目录
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf  data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
  • 4.在本地测试创建一个数据库,查看下我们的路径是否ok!

 

2.删除容器

问题:那我们将mysql容器删除,卷还在嘛?

[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps    #查看正在运行的容器
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
4e380de478d6   mysql:5.7   "docker-entrypoint.s…"   40 minutes ago   Up 40 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker stop 4e380de478d6     #停止容器
4e380de478d6
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker rm -f mysql01        #删除容器
mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps -a        #查看容器
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                      PORTS     NAMES
e6836cef1437   centos    "/bin/bash"   About an hour ago   Exited (0) 56 minutes ago             friendly_hugle

删除之后,去主机的data目录查看

[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf  data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  performance_schema  public_key.pem   server-key.pem  test
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  mysql        private_key.pem     server-cert.pem  sys

发现,我们加载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

3.匿名和具名挂载

匿名挂载

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
 
# 查看所有volume(卷)的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
 
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!

具名挂载

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx
 
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+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/xxxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

拓展

默认的权限是rw

# 通过 -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就说明这个路径只能通过宿主机来操作,容器内容无法操作

3.DockerFile

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

[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir docker-test-colume
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  docker-test-colume  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd docker-test-colume/
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# clear
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# pwd
/home/docker-test-colume

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

# 创建一个dockerfile文件
vim dockerfile1
# 文件的内容 指定(大写) 参数
 
#按i进入编辑模式,输入
FROM centos

VOLUME ["volume01", "volume02"]
 
CMD echo "----end----"
CMD /bin/bash
#按esc,退出编辑模式
:wq
# 这里的每一个命令都是镜像的一层!

构建并查看镜像

[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# cat dockerfile1         #查看文件
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"
CMD /bin/bash
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker build -f dockerfile1 -t shuangma/contos:1.0 .   #构建
[+] Building 0.1s (5/5) FINISHED                                                                                                                 
 => [internal] load build definition from dockerfile1                                                                                       0.0s
 => => transferring dockerfile: 121B                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                           0.0s
 => => transferring context: 2B                                                                                                             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/shuangma/contos:1.0                                                                                              0.0s
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
mysql             5.7       c20987f18b13   14 months ago   448MB
shuangma/contos   1.0       0282d836c4f5   17 months ago   231MB
centos            latest    5d0da3dc9764   17 months ago   231MB

这个卷和外部一定有一个同步的目录!

  • 在volume01里创建一个文件
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker run -it 0282d836c4f5 /bin/bash
[root@d5ffb179942a /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@d5ffb179942a /]# cd volume01
[root@d5ffb179942a volume01]# ls
[root@d5ffb179942a volume01]# touch container.txt
[root@d5ffb179942a volume01]# ls
container.txt
  • 查看容器信息,寻找卷挂载的路径
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
d5ffb179942a   0282d836c4f5   "/bin/bash"   2 minutes ago   Up 2 minutes             infallible_villani
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker inspect d5ffb179942a

 进入到匿名挂载卷里的文件是否同步

[root@iZ8vbgi1zpv4do6camhur3Z ~]# cd /var/lib/docker/volumes/f49d8938103d318672f59bf34cf7c840bb920cb20ceffc0ce263c971d0973e4f/_data
[root@iZ8vbgi1zpv4do6camhur3Z _data]# ls
container.txt

4.容器数据卷

多个mysql同步数据!

启动3个容器,通过我们刚才自己写的镜像启动 

  • 1.启动docker01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
mysql             5.7       c20987f18b13   14 months ago   448MB
centos            latest    5d0da3dc9764   17 months ago   231MB
shuangma/contos   1.0       0282d836c4f5   17 months ago   231MB
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker run -it --name docker01 0282d836c4f5
[root@2ce5e311bb81 /]# ls -l

  • 2.ctrl+p+q退出并不关闭容器docker01,然后启动docker02(这里继承并挂载docker01)
[root@40980c48f0f4 /]# [root@iZ8vbgi1zpv4do6camhur3Z ~]# clear
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker run -it --name docker02 --volumes-from docker01 0282d836c4f5

  • 3.新开一个会话进入docker01容器,在volume01里创建一个文件夹,然后查看docker02容器的colume01里有没有,发现有的
  • <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值