容器数据卷的背景

在docker中容器中包含着应用的数据,当我们删除容器时,数据也会被删除,故有容器数据卷来帮助,将数据存储在本地。

本质上就是挂载,将容器中的目录挂载到Linux上。

容器持久化和同步操作,容器间数据共享

容器卷使用

  1. # 方式一:使用命令来挂载
  2. docker run -it -v /home/dockertest:/home centos /bin/bash
  3. -v destination(主机):source(容器)

image.png

具名和匿名挂载

三种挂载方式:

  1. -v 容器内路径 # 匿名挂载
  2. -v 卷名:容器内路径 #具名挂载
  3. -v /宿主路径:容器内路径 #指定路径挂载
  4. docker build -v /home/lu/log:/log/ -p 8085:8085 -t lu_blog:1.1

给容器内的路径增加读写权限:

  1. ro readonly 只读
  2. rw readwrite 读和写
  3. docker run -d -P -name contName -v juming-ngxin:/etc/nginx:ro nginx
  4. docker run -d -P -name contName -v juming-ngxin:/etc/nginx:rw nginx

初试dockerfile

dockerfile是用来创建docker镜像的文件(本质是命令脚本

在脚本中可以使用匿名卷挂载(之后常用

  1. docker build [-f dockerfile位置] [-t 镜像名以及tag]

数据卷容器

多个容器的同步

  1. 关键命令:--volums-from dockername
  2. 创建一个容器,将该容器作为dockername的子容器,因此他们的挂载文件夹是共享的
  3. 注意:当有两个容器挂载到该文件夹时,只要有一个容器存在,则该挂载文件夹不会失效,持续到没有容器为止

dockerfile构建过程

基础知识:

  1. 每个关键字指令都为大写字母
  2. 执行从上到下
  3. 表示注释

  4. 没一个指令都为一个镜像层

docker 的指令

  1. FROM ## 基础镜像
  2. MAINTAINER ## 姓名加联系方式
  3. RUN ## 镜像构建时需要的命令
  4. ADD ## 步骤:例如,Tomcat镜像,添加的内容
  5. WORKDIR ## 镜像的工作目录
  6. VOLUME ## 挂载的目录
  7. EXPORT ## 暴露的端口
  8. CMD ## 指定容器启动时要运行的命令,会替代
  9. ENTRYPOINT ## 指定容器启动时要运行的命令,会追加
  10. COPY ## 类似于ADD,帮我们的文件拷贝到镜像中
  11. ENV ## 构建时设置环境变量

学习dockerfile的技巧:使用docker history 镜像名

发布镜像到dockerHub

  1. 注册登录dockerhub
  2. 命令行登录
  3. 登录成功,docker push

tips:可以使用阿里云 提供的镜像服务,详细的操作流程在阿里云有

docker 网络

image.png
当添加了一个容器之后,再次使用ip addr会发现多了一个地址。且不同的容器间可以ping通
image.png
image.png
注意,当删除一个容器时,其对应的容器IP也会被删除

使用link连接容器

  1. docker run -d -P --link containName imageName

这样可以使:子容器ping通父容器

缺点:父容器不能ping通子容器,需要额外配置

自定义网络

查看所有docker网络

  1. docker network ls

image.png
网络模式:

  1. bridge:桥接模式(默认模式
  2. none:不配置网络
  3. host:和宿主机共享网络
  4. container:容器网络连接(不常用

自定义命令:

  1. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

image.png

将容器与自定义网络绑定

命令:

  1. docker run -d -P --name ContainName --net netName imagesName

绑定完后的结果

  1. [
  2. {
  3. "Name": "mynet",
  4. "Id": "c0be35552aa29c0f73ee8c804ed302310369978f8a2189239cf3429e23e4d57a",
  5. "Created": "2020-06-12T09:41:45.273231074+08:00",
  6. "Scope": "local",
  7. "Driver": "bridge",
  8. "EnableIPv6": false,
  9. "IPAM": {
  10. "Driver": "default",
  11. "Options": {},
  12. "Config": [
  13. {
  14. "Subnet": "192.168.0.0/16",
  15. "Gateway": "192.168.0.1"
  16. }
  17. ]
  18. },
  19. "Internal": false,
  20. "Attachable": false,
  21. "Ingress": false,
  22. "ConfigFrom": {
  23. "Network": ""
  24. },
  25. "ConfigOnly": false,
  26. "Containers": {
  27. "768e979ae0d1aeae1af15c60bb13dd38e2aacd1f3ef29b5f59eaf0e065821a1b": {
  28. "Name": "tomcat-net01",
  29. "EndpointID": "16b6b44d4ecc81571bf40efe34e867b25205a985b273d22e41939952a569ee13",
  30. "MacAddress": "02:42:c0:a8:00:02",
  31. "IPv4Address": "192.168.0.2/16",
  32. "IPv6Address": ""
  33. },
  34. "838f2c7c777ff7105acb2d0bf500b362c8f9d24941033611012e737bdfd902ac": {
  35. "Name": "tomcat-net02",
  36. "EndpointID": "35a35f477b3214fadc48a12e40614c19e0303109ee4c29ed06257130f5da7811",
  37. "MacAddress": "02:42:c0:a8:00:03",
  38. "IPv4Address": "192.168.0.3/16",
  39. "IPv6Address": ""
  40. }
  41. },
  42. "Options": {},
  43. "Labels": {}
  44. }
  45. ]

好处:

  1. 容器间可以通过服务名(即容器名)就可以互相ping通,而不需要IP地址(防止IP地址变化)

image.png

  1. 不同集群使用不同的网络,保持集群的网络安全

docker network connect

  1. docker network connect netName ContainerName

image.png
一个容器两个地址!