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

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 就创建了在主机和所有容器之间一个虚拟共享网络。

image-20201125105847896

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>
.....

image-20220801210124162

image-20220801210156378

image-20220801213539069

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

image-20220801220454533

image-20220801220525393

13.Dockerfile

13.1 什么是Dockerfile

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

image-20200404111908085

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

image-20200603181253804

# Dockerfile基础知识
1.每行的开头都必须是保留字,且每行只能有一个保留字,每个保留字指令都必须为大写,且后面都要跟至少一个参数。
2.指令按照从上到下,顺序执行。
3 #表示注释、
4.每条指令都会创建一个新的镜像层,并对镜像进行提交。
5.FROM必须是第一行第一个指令,代表当前镜像是基于哪个镜像构建

运行Dockerfile

docker 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 hello
    
    RUN ["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
    

image-20220802205555996

image-20220803212313857

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

image-20200605172151266

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

image-20200605172340380

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

image-20200605173141636

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

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

image-20220805071239715

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...