docker 数据卷、File、网络

一、容器数据券

docker是将应用+环境打包成镜像,直接可以运行。但是如果一些配置文件、数据放在容器中,那么这些东西都会丢失。所以在使用镜像的时候,会有一些东西需要持久化,并且容器之间可以共享,也就是容器数据券的技术。

Docker产生的数据、配置文件都同步到本地,将容器内部的目录挂载到宿主机上。

使用数据卷

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

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

使用 docker inspect 容器ID 可以看到如下信息,就是挂载成功了。

同比效果:

Mysql数据的挂载:

 docker run -d -p 3306:3306 -v 宿主机目录:/etc/mysql/conf.d -v 宿主机目录/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
  • -d 后台运行
  • -p 端口映射
  • -v 挂载
  • -e 环境变量配置
  • --name 容器名字

配置完之后可以看到,mysql的配置文件路径和数据路径都映射到了宿主机,这样就保证了即使容器删除了,容器所产生的数据都不会丢失。

具名挂载和匿名挂载

  • 具名挂载:-v 不指定地址,指定的是名字
    • docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx nginx
    • 使用 docker volume ls 查看所有 volume 情况
  • 匿名挂载:-v 不指定宿主机地址
    • docker run -d -P --name nginx01 -v /etc/nginx nginx
    • 使用 docker volume ls 查看所有 volume 情况
    • docker inspect ,可以看到卷相关的挂载地址

建议使用具名挂载,方便查找。

docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx:ro nginx

docker run -d -P --name nginx01 -v jumingnginx:/etc/nginx:rw nginx

规定卷的读写权限,只读、读写是针对容器的。如果是只读,那么容器无法修改挂载的文件。

数据卷容器

容器和容器之间进行同步

docker run -it --name docker02 --volumes-from dokcer01 镜像名字

docker run --name mysql02 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 -d mysql/mysql-server

docker01 就是数据卷容器。docker02挂载到docker01上。删除父容器,子容器还是可以访问挂载的文件的。其实可以理解成备份的机制。

二、DockerFile

DockerFile就是用来构建docker镜像的命令脚本。因为镜像是一层一层,所以脚本命令也是一句一句(废话),每个命令就是一层。

这样简单的DockerFile就写完了。使用命令

docker build -f  DockerFile命令 -t 镜像名字 .  可以生成自己的镜像,运行截图如下:

在官方的每个镜像,在Git上都有DockerFile。

DockerFile构建过程

基础知识:

  • 关键字都是大写
  • 从上到下执行
  • # 代表注释
  • 每个命令创建一个镜像层

可能之前都是jar、war是交付物,现在DockerFile逐渐成为企业的交付标准。

DockerFile的指令

  • FROM:基础镜像,一切从这里构建
  • MAINTAINER:镜像的作者,维护人
  • RUN:镜像构建的时候需要运行的命令
  • ADD:添加一些使用的组件,JDK、TOMCAT等等
  • WOKRDIR:镜像的工作目录
  • VLOLIME:容器卷挂载的位置
  • EXPOSE:指定暴露端口(很常用的)
  • CMD:指定这个容器启动的时候需要运行的LINUX命令
  • ENTRYPINT:跟CMD一样,但是会追加命令
  • ONBUILD:当构建一个被继承DockerFile 这个时候就会运行该命令。
  • COPY:拷贝命令,类似ADD,将文件拷贝到镜像中
  • ENV:构建的时候设置环境变量

编写DockerFile

DockerFile中99%,都是从scratch这个镜像开始的。

在官方提供的centos基础上添加一些命令 vim和net-tools。

 使用命令进行镜像构建:

docker bulid -f dockerfile -t 镜像名:版本号 .

构建出来的镜像启动后,就会比官方的镜像多了vim、pwd、ifconfig等命令。

通过docker history 镜像ID,查看镜像构建过程CMD命令:镜像启动的时候执行某个命令,CMD["ls", "-a"] ,只有最后一个CMD会执行。但是在run的时候想追加命令的时候,会用追加的命令替换CMD执行的命令。

ENTRYPOINT命令:正相反,在run的时候追加命令或参数的时候,会在ENTRYPOINT执行的命令后面追加。

制作tomcat镜像:

  • 准备镜像文件,需要tomcat压缩包、需要jdk压缩包
  • 编写dockerfile文件
    • 从centos开始
    • 加入tomcat、jdk
    • yum安装vim命令
    • 设置镜像工作目录(启动镜像后进入的地方)
    • 设置环境变量jdk+tomcat
    • 暴露端口 8080
    • 启动tomcat,日志输入到某个地方

发布到docker hub上,直接使用 docker push 即可。

发布到阿里云上:

  1. 创建命名空间(一个账号最多三个)
  2. 创建镜像仓库,私有即可,选择本地仓库
  3. 查看镜像仓库详情,里面就有推送和拉去进行的文档

三、Dokcer网络

Docker0

docker是怎么处理不同容器之间的访问,例如容器1中的tomcat怎么访问容器2中的mysql?

docker exec -it tomcat01 ip addrs 查看启动容器的网卡

发现容器启动的时候,docker都会分配一个eth0@if262的IP。并且宿主机能够ping同容器。

  • 没启动一个容器,启动一个容器就会分配一个ip,并且在宿主机上分配一个网卡
  • 安装docker之后,宿主机上就会多了一个docker0的网卡,桥接到宿主机的网卡上,使用的是evth-pari技术
    • evth-pari 就是一对虚拟设备接口,他们都是成对出现的,一段连接协议、一段彼此相连
    • 使用evth-pari这个技术充当一个桥梁,连接虚拟网络设备的
  • 容器之间也是可以通过evth-pari相互之间通信

--link 

由于容器的ip都是动态分配的,所以相互之间的访问就是成为了一个问题,docker提供了--link命令,来处理这个事情。

docker exec -it tomcat01 ping tomcat02,这样是无法ping通的,所以在启动的时候可以直接使用--link参数:docker run -P --name tomcat03 --link tomcat02。在使用容器名字进行ping就可以通了。 反向无法ping通,

可以看到,在tomcat03的hosts中配置了tomcat02的访问信息

--link本质就是hosts的映射,现在开发基本都不使用--link命令了。

自定义网络

容器互联的方式处理--link,还可以使用自定义网络。常用的网络模式:

  • bridge:桥接(默认)
  • none:不配置
  • host:和宿主机共享
  • container:容器网络连通(用的少),局限性大

docker0默认网络,但是无法使用容器名访问,--link太局限,所以一般都使用自定义网络。

命令:docker network create --deirver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

使用docker network ls 就可以看到创建的网络

使用docker network inspect mynet 查看详情,自定义网络是可以通过容器名字进行ping通的:

使用自定义网路罗,在启动容器的时候增加 --net 网络名即可。

docker run -d -P --name tomcat01 --net mynet tomcat 

不同的集群使用不同的网络,redis-、mysql- 等等,这样可以保证集群网络的健康。

网络连通

docker network conect 连接网络到一个容器

一个容器两个ip地址。

Docker搭建redis集群

docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /Users/liming/software/docker/redis/node-6/data:/data \
-v /Users/liming/software/docker/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

启动好后,搭建集群:

docker exec -it redis-1 /bin/sh

redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 
172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

创建完毕后,使用redis-cli -c 命令查看节点和集群信息:

发布一个应用到docker中:

  1. 编写Dockerfile
    FROM java:8
    
    COPY *.jar /app.jar
    
    CMD ["-- server port 8081 ---"]
    
    EXPOSE 8081
    
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
  2. docker build -f DockerFile -t sa_token_test .  执行docker命令,注意最后的.

  3. docker run -d -P --name sa_token_test sa_token_test,启动容器

  4. 测试访问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker 中实现数据持久化有多种方法,取决于你的具体需求和使用的技术栈。以下是几种常见的数据持久化方法: 1. **挂载主机目录**:可以通过在容器中挂载主机目录来实现数据持久化。这样,容器内部的文件将存储在主机上的持久性位置。可以使用 `-v` 或 `--mount` 参数来指定要挂载的主机目录。例如: ```shell docker run -v /host/path:/container/path image ``` 在这个示例中,容器中的 `/container/path` 目录将与主机上的 `/host/path` 目录进行挂载,容器内的数据将持久保存在主机上。 2. **使用命名**:Docker 提供了命名(named volumes)的功能,它是一种特殊类型的,可以用于容器之间共享和持久化数据。可以使用 `docker volume create` 命令创建一个命名,然后将其与容器一起使用。例如: ```shell docker volume create myvolume docker run -v myvolume:/container/path image ``` 在这个示例中,创建了一个名为 `myvolume` 的命名,并将其挂载到容器的 `/container/path` 目录。 3. **使用匿名**:匿名(anonymous volumes)是 Docker 自动生成的,用于临时存储容器中的数据。匿名容器删除时会一同被删除。可以使用 `-v` 或 `--mount` 参数来自动创建匿名。例如: ```shell docker run -v /container/path image ``` 在这个示例中,没有指定主机目录,Docker 会自动创建一个匿名,并将其挂载到容器的 `/container/path` 目录。 4. **使用网络存储**:如果需要跨多个容器共享数据,可以使用网络存储技术,如 NFS(Network File System)或 Ceph 等。这些技术允许多个容器访问和共享相同的数据存储。 根据你的需求和环境,选择适合的数据持久化方法。在使用这些方法时,请确保遵循最佳实践并保护你的数据安全。 希望以上信息对你有帮助!如果你有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值