11.高级网络配置

11.1 说明

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

11.2 查看网络信息(可以查看现在docker里有哪些网桥)
# docker network ls
11.3 创建一个网桥
# docker network create -d bridge 网桥名称例: docker network create -d bridge ems
11.4 查看网桥细节(可以查看网桥网段)
# docker network inspect 网桥名例: docker network inspect ems
11.5 删除一个网桥
# docker network rm 网桥名称                                              删除指定网桥例: docker network rm ems# docker  network   prune                            删除所有未被用到的网络
11.6 容器之间使用网络通信(运行多个容器在指定网络中)
# 1.查询当前网络配置
- docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8e424e5936b7        bridge              bridge              local
17d974db02da        docker_gwbridge     bridge              local
d6c326e433f7        host                host                local
# 2.创建桥接网络
- docker network create -d bridge 网桥名称例:docker network create -d bridge info
[root@centos ~]# docker network create -d bridge info
6e4aaebff79b1df43a064e0e8fdab08f52d64ce34db78dd5184ce7aaaf550a2f
[root@centos ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8e424e5936b7        bridge              bridge              local
17d974db02da        docker_gwbridge     bridge              local
d6c326e433f7        host                host                local
6e4aaebff79b        info                bridge              local
# 3.启动容器指定使用网桥1. 启动容器时指定容器使用哪个网络
docker run -d -p 8890:80 --name 容器名称 --network 网络名称 镜像名:版本号 例:docker run -d -p 8080:8080 --name tomcat01 --network ems tomcat:8.0
- docker run -d -p 8890:80 --name nginx001 --network info nginx
- docker run -d -p 8891:80 --name nginx002 --network info nginx `注意:一旦指定网桥后--name指定名字就是主机名,多个容器指定在同一个网桥时,可以在任意一个容器中使用主机名与容器进行互通`(在同一网桥的不同容器之间可以使用)2. 容器启动之后加入某个网络
docker network connect 加入网络名称 容器名称或id
[root@centos ~]# docker run -d -p 8890:80 --name nginx001 --network info nginx
c315bcc94e9ddaa36eb6c6f16ca51592b1ac8bf1ecfe9d8f01d892f3f10825fe
[root@centos ~]# docker run -d -p 8891:80 --name nginx002 --network info nginx
f8682db35dd7fb4395f90edb38df7cad71bbfaba71b6a4c6e2a3a525cb73c2a5
[root@centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f8682db35dd7        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:8891->80/tcp   nginx002
c315bcc94e9d        nginx               "/docker-entrypoint.…"   7 minutes ago       Up 7 minutes        0.0.0.0:8890->80/tcp   nginx001
b63169d43792        mysql:5.7.19        "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        3306/tcp               mysql_mysql.1.s75qe5kkpwwttyf0wrjvd2cda
[root@centos ~]# docker exec -it f8682db35dd7 /bin/bash
root@f8682db35dd7:/# curl http://nginx001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.....

12.高级数据卷配置

12.1 说明

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

# 1. 查看docker维护的所有数据卷
docker volume ls 注意:使用绝对路径创建的数据卷是自己管理的,和docker没关系使用别名方式创建的数据卷才是docker管理的# 2. 提前创建一个别名数据卷
docker volume create 数据卷别名# 3. 查看数据卷详细
docker volume inspect 数据卷别名这个可以查看别名对应的目录位置# 4. 删除指定数据卷
docker volume rm 数据卷别名
12.2 提前创建数据卷
[root@centos ~]# docker volume create my-vol
my-vol
12.3 查看数据卷
[root@centos ~]# docker volume inspect my-vol
[{"CreatedAt": "2020-11-25T11:43:56+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}
]
12.4 挂载数据卷
[root@centos ~]# docker run -d -P --name web  -v my-vol:/usr/share/nginx/html  nginx
[root@centos ~]# docker inspect web"Mounts": [{"Type": "volume","Name": "my-vol","Source": "/var/lib/docker/volumes/my-vol/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],
12.5 删除数据卷
docker volume rm my-vol

13.Dockerfile

13.1 什么是Dockerfile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件

  • 通过架构图可以看出通过DockerFile可以直接构建镜像
13.2 Dockerfile解析过程

# Dockerfile基础知识
1.每行的开头都必须是保留字,且每行只能有一个保留字,每个保留字指令都必须为大写,且后面都要跟至少一个参数。
2.指令按照从上到下,顺序执行。
3 #表示注释、
4.每条指令都会创建一个新的镜像层,并对镜像进行提交。
5.FROM必须是第一行第一个指令,代表当前镜像是基于哪个镜像构建运行Dockerfiledocker build -t 镜像名字:版本 Dockerfile所在目录    ---- 会将目录内所有文件都打包发送给Docker Server,所以建议Dockerfile单独找一个目录一般创建一个Docker目录,然后在里面
例:docker build -t mycentos:01 . . 代表当前目录 ,当前目录必须含有Dockerfile在编写命令时先创建Dockerfile
vim Dockerfile

例(Dockerfile中如何写,#后面的是注释):

FROM centos:latest
# RUN yum install -y vim
RUN ["yum", "install", "-y", "vim"]
# 这个命令仅仅是声明当前容器中服务端口是谁
EXPOSE 8081
EXPOSE 5672
WORKDIR /apps
ADD aa.txt .
WORKDIR data
ADD https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.23/bin/apache-tomcat-10.0.23-deployer.tar.gz .
RUN tar -zxvf apache-tomcat-10.0.23-deployer.tar.gz
RUN rm -rf apache-tomcat-10.0.23-deployer.tar.gz
RUN mv apache-tomcat-10.0.23-deployer tomcat-10.0.23
WORKDIR tomcat-10.0.23
COPY bb.txt .
ENV BASE_PATH=/apps/data
WORKDIR $BASE_PATH
# 这里也仅仅是一个声明,告诉使用者可以挂在这个目录到宿主机中
VOLUME $BASE_PATH
VOLUME /apps/data
# CMD ["ls", "/apps/data"]
# ENTRYPOINT ["ls", "/apps/data"]
CMD ["ls]
ENTRYPOINT ["/apps/data"]
解释上面的Dockerfile例子# 关于WORKDIR命令,
WORKDIR 是用来指定进入容器后的默认落脚点
如果写多个相对路径的话,会不断叠加
例如:WORKDIR /apps
ADD aa.txt .
WORKDIR data
ADD bb.txt .关于上面的:
将宿主机的Dockerfile所在目录的aa.txt拷贝到镜像的 /apps 目录
将宿主机的Dockerfile所在目录的bb.txt拷贝到镜像的 /apps/data 目录# 关于 ENV 设置环境变量
ENV BASE_PATH=/apps/data日后在使用环境变量时 $BASE_PATH 就表示 /apps/data 路径
环境变量的名字可以随便写,BASE_PATH可以换成自己想改的名字# 关于 ADD 和 COPY
ADD不仅会将宿主机的文件拷贝到镜像,也可以写url然后在线下载指定url的文件
COPY只能将宿主机的文件拷贝到镜像# 关于 ENTRYPOINT 和 CMD指令
ENTRYPOINT指令,往往用于设置容器启动后的 第一个命令,这对一个容器来说往往是固定的。
CMD指令,往往用于设置容器启动的第一个命令的 默认参数,这对一个容器来说可以是变化的。ENTRYPOINT通常和CMD一起组合使用,例如:ENTRYPOINT ["java","-jar"]
CMD ["ems.jar"]之后在运行docker时可以在后面加上参数用于覆盖CMD的参数,即"ems.jar"
docker run -p 8989:8989 aa.jar# 运行 Dockerfile
docker build -t 镜像名字:版本 Dockerfile所在目录例:docker build -t mycentos:01 . . 代表当前目录 ,当前目录必须含有Dockerfile
13.3 Dockerfile的保留命令

官方说明:https://docs.docker.com/engine/reference/builder/

保留字 作用
FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 构建镜像时需要运行的指令
EXPOSE 这个命令仅仅是声明当前容器中服务端口是谁,运行成容器后容器的服务端口
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和tar包,可以下载网络上的url路径的文件
COPY 类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,仅仅用于声明,数据卷用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数
13.3.1 FROM 命令
  • 基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

  • 语法:

    FROM  <image>
    FROM  <image>[:<tag>]     使用版本不写为latest
    FROM  <image>[@<digest>]  使用摘要
    
13.3.2 MAINTAINER 命令
  • 镜像维护者的姓名和邮箱地址[废弃]

  • 语法:

    MAINTAINER <name>
    
13.3.3 RUN 命令
  • RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

  • 语法:

    RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    RUN echo helloRUN ["executable", "param1", "param2"] (exec form)
    RUN ["/bin/bash", "-c", "echo hello"]
    
13.3.4 EXPOSE 命令
  • 仅仅用来声明容器服务端口是谁

  • 语法:

    EXPOSE 8081
    EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
    EXPOSE 80/udp如果容器只有一个服务端口,只写一行
    如果容器有多个服务端口,写多行
    
13.3.5 CMD 命令
  • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 语法:

    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)
    
13.3.6 WORKDIR 命令
  • 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

  • 语法:

    WORKDIR /apps
    WORKDIR data`注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`
    注意:设置工作路径时为绝对路径的话绝对路径不存在也会被自动创建出来例如:上面例子运行后进入容器会进入 /apps/data 目录
    
13.3.7 ENV 命令
  • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

  • 语法:

    ENV <key> <value>
    ENV <key>=<value> ...
    
13.3.8 ADD 命令
  • 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

  • 语法:

    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/   通配符添加
    ADD test.txt relativeDir/  可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD https://github.com/lubing2001/community/archive/refs/heads/main.zip .注:写url的话可以直接从网上下载文件到容器,下载的文件默认就是放在当前目录
    
13.3.9 COPY 命令
  • 用来将context目录中指定文件复制到镜像的指定目录中

  • 语法:

    COPY src dest
    COPY ["<src>",... "<dest>"]例:
    WORKDIR /apps
    COPY bb.txt .
    
13.3.10 VOLUME 命令
  • 用来定义容器运行时可以挂在到宿主机的目录

  • 语法:

    VOLUME ["/data"]
    
13.3.11 ENTRYPOINT命令
  • 用来指定容器启动时执行命令和CMD类似

  • 语法:

    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2
    

    ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

    ENTRYPOINT通常和CMD一起组合使用,例如:ENTRYPOINT ["java","-jar"]
    CMD ["ems.jar"]之后在运行docker时可以在后面加上参数用于覆盖CMD的参数,即"ems.jar"
    docker run -p 8989:8989 aa.jar
    

13.4 Dockerfile构建springboot项目部署
1.准备springboot可运行项目

2.将可运行项目放入linux虚拟机中

3.编写Dockerfile
FROM openjdk:8
WORKDIR /ems
ADD ems.jar /ems
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["ems.jar"]
4.构建镜像
[root@localhost ems]# docker build -t ems .
5.运行镜像
[root@localhost ems]# docker run -p 8989:8989 ems运行mysql镜像等
6.访问项目
http://10.15.0.8:8989/ems/login.html

7.接口docker容器之间网络互通问题

建立网桥,将相关容器服务加入网桥

docker高级网络配置、高级数据卷机制和Dockerfile说明相关推荐

  1. 05-docker高级网络配置和数据卷配置

    1. docker高级网络配置 1.1 说明 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂 ...

  2. Docker容器-------网络模式,数据卷和数据卷容器

    目录 Docker网络实现原理 Docker的网络模式 Host模式 Container模式 none模式 bridge模式 自定义网络 查看网络模式列表 查看容器信息(包含配置.环境.网关.挂载.c ...

  3. Docker之网络模式和数据卷

    目录 引言 一.Docker的网络模式 1.Docker的四种网络模式 2.Docker的自定义网络

  4. 【Docker学习笔记 五】深入理解Docker容器数据卷机制

    前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷 ...

  5. smtp邮件服务 ipv6 高级网络配置

    ###################邮件服务######################## 1.相关概念及准备工作 SMTP:(Simple Mail Transfer Protocol)即简单邮 ...

  6. Linux学习 高级网络配置

    高级网络配置 一.team team:也是链路聚合的一种方式,最多可支持8块网卡: 支持模式:broadcast广播.roundrobin轮询.主备activebackup.负载均衡loadbalan ...

  7. 【docker教程】docker视频教程(ubuntu)数据卷挂载、数据卷容器volume、端口映射(镜像叠加,分层复用)rootfs、bootfs(没看完)

    黑马程序员Docker容器化技术,从零学会Docker教程 可以先看1-13课.以及 docker概述 文章目录 docker概述 ubuntu安装docker docker架构 配置docker镜像 ...

  8. Docker容器学习梳理 - Volume数据卷使用

    Docker volume使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Docker中的数据可以存储在类似于虚拟机 ...

  9. Docker的网络配置 4 内嵌的DNS server

    本文版本Docker version 1.12.6 相关文章: <Linux 虚拟网络设备 veth-pair> linux基础 <Linux虚拟网络设备之veth(arp inco ...

最新文章

  1. 数据库数据用Excel导出的3种方法
  2. 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.69. Vim-7.4...
  3. php 年的第几天,收藏-php中某年第几天计算出日期年月日的代码
  4. 不使用杀毒软件就上网也不会感染计算机病毒,【判断题】不使用杀毒软件就上网也不会感染计算机病毒。 A. 正确 B. 错误...
  5. CSS: div高度自动适应背景图片的高度 How to get div height to auto-adjust to background size?...
  6. BERT微调效果不佳?不如试试这种大规模预训练模型新范式
  7. “心脏出血”后,OpenSSL 起死回生靠什么?
  8. ScrollView-图片的放大缩小
  9. 使用ajaxfileupload.js上传文件成功之后,没有执行success方法
  10. Spring源码下载并导入Idea
  11. USB协议(1)USB基础知识
  12. 五人合伙最佳股份分配_五人合伙股份分配协议书范本
  13. 详解oracle多种表连接方式,详解Oracle多种表连接方式
  14. 六一儿童节,悼念天堂的小朋友
  15. openstack 无法创建实例之消息队列问题
  16. 校园人脸识别门禁的实施方案有效隔离闲杂人员
  17. 黑苹果html5视频卡顿,W7系统如何设置开机自动连接宽带
  18. css选择器 选择器的优先级
  19. Real-Time Rendering 4th Edition 实时渲染第四版 第三章 图形处理单元(The Graphics Processing Unit)
  20. 叙述两个计算机应用,计算机应用基础模拟试卷2

热门文章

  1. 进制转换方法总结(详细图解)
  2. Handsontable - getSourceData 和 getData 区别
  3. RecyclerView的Inconsistency detected报错解决办法
  4. Python之神经网络预测股票
  5. 全面启动“Say hi市南”中山路餐厅变身网红打卡店
  6. 12306网站、抢票插件以及偶写的自动订票小程序
  7. Web 应用程序 – 概述
  8. Supervisor安装、配置、开启启动
  9. 无线传感器网络通信标准
  10. 【Python】实用小脚本