• 2022-09-18 Docker 基础命令


    Docker 基础命令

    镜像操作

    通常以 docker image 开头 有时image可以省略 有时image可以和其他参数一起简写
    Docker 镜像仓库

    搜索镜像

    命令: 
    	docker  search  镜像名称 
    
    参数(很多)
    	--filter "is-official=true" 表示官方镜像 
    	--filter "is-automated=true" 表示非官方镜像 
    	--limit 1 默认搜索结果是25个 可以指定搜索的个数 但是这个个数不超过100 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    拉去镜像

    ## 命令 
     ## 根据标签拉取 
    	docker (image) pull 镜像名:tag  
    ## 根据散列值拉取
    	docker (image) pull 镜像名@散列值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看本地镜像

    ##命令 
    	docker image ls  
    	docker images 
    ## 参数 
    		-- format 格式化输出(不重要)  
    				--format "{{.Size}}"
    					docker images --format "{{.Size}}"
    				--format "{{.Tag}}":"{{.Size}}"
    					docker images --format "{{.Tag}}":"{{.Size}}"
    					
    	    --digests  查看散列值(不重要)
    	    	docker images --digests
                
             -q: 查看镜像id (稍微重要)
             	 docker images -q
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    删除镜像

    ## 命令 
    	docker image rm 镜像id或者镜像名称:tag  (可以多个镜像id)
    	docker rmi 镜像id 或者镜像名称:tag    (可以多个镜像id)
    ## 参数 
    	-f: 表示强制删除
    	
    ## 删除所有镜像 
    	docker  rmi $(docker images -q)
    	
    注意: 默认删除镜像 如果镜像启动的有容器 不管容器是启动状态 还是停止状态 则镜像默认情况下 不能删除 
    	  删除镜像 如果有其他镜像公用了镜像层 则共享的镜像层则不会删除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    镜像备份以及加载

    ## 备份镜像 
    	docker save 镜像名:tag -o  要备份的位置/备份名.tar  
    	 
    ## 加载备份的镜像 
    	docker load -i 备份的镜像 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看镜像内部信息

    ## 命令 
    	docker (image)  inspect 镜像名称:tag 
    
    • 1
    • 2

    容器操作

    容器相关指令 都是以 docker container 开头 一般情况下 container可以省略

    运行容器

    ##  基础命令 
    	docker (container)  run  镜像名称   
    	  例如: docker container run nginx:1.14.2
    	  说明: 这种方式启动之后 能够启动成功  但是命令行无法操作  当强制退出时 容器停止  
    ## 前台启动 
    	  docker (container) run  -it 镜像名称 /bin/bash 
    ## 后台启动
    	 docker (container) run -d  镜像名称	 
    ##  参数: 
    	  -i : 表示启动容器和容器交互
    	     例如:
    	       docker container run -i nginx:1.14.2
    	     说明:
    	     	启动容器和容器交互 但是交互是需要命令行的 此时单独使用-i和不使用效果一样      	
    	     	
    	  -t : 表示开启终端连接    
    	  	 例如: 
    			docker run -t nginx:1.14.2
    		 说明: 确实有了终端 终端有了就可以输入了 但是输入并没有和容器交互 去操作容器 
    		 
    	  -d: 表示后台启动 
    			docker run -d nginx:1.14.2
    			
    			
    	   /bin/bash  表示进入容器时 给一个命令行 这个指令有阻塞作用 所以启动web容器时 不要加
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    注意 如果提示错误 ‘write /proc/self/attr/keycreate: permission denied’,则需要设置selinux:

    setenforce 0 
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
    • 1
    • 2

    启动容器的设置

    ## 设置名字 
    	-- name 容器名称 
    	-p 系统外部端口:映射容器内部端口
    	
    ## 注意点:当前台启动web应用时  如果使用/bin/bash 则会阻塞 无法访问
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看容器

    ##  查看运行中的容器 
    	 docker container ls 或者 docker  ps  
    	 
    ## 查看所有容器 (不管运行还是不运行)
    	docker container ls -a 
    	
    ## 只查看运行容器id 
    	docker ps -q  
        
    ## 查看所有容器id  
    	docker container ls  -qa 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    容器的常规操作

    ## 启动容器 
    	docker (container)  start 容器名称或者容器id 
    ## 停止容器 
    	docker (container) stop 容器名称或者容器id
    ## 重启容器
    	docker (container) restart 容器名称或者容器id   
    ## 杀死容器 
    	docker (container) kill 容器名称或者容器id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进入和退出容器

    ## 进入容器方式一 (过时了) 
    	# 命令
    		docker (container)  attach 容器id   
    	# 现象
    		这种方式经过测试 只有在-it的方式启动容器时 才可以进入 -d启动容器的方式 好像进不去  
    	# 退出容器 
        	ctrl+PQ键  
        	
    ## 进入容器的方式二
    	# 命令 
    	 docker(container) exec -it 容器id bash 
    	# 退出容器
    	  ctrl+PQ 或者 exit  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    删除容器

    ## 命令 
       docker (container) rm 容器id  (id可以为多个)
    ## 现象
    	如果容器正在运行中 默认情况下 无法删除 可以添加-f参数 强制删除 
    	docker rm 容器id -f 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除所有容器

    ## 命令 
    	docker (container)  rm $(docker ps -aq) -f 
    
    • 1
    • 2

    查看容器中运行的进程

    ## 命令 
    	docker (container) top 容器id 
    
    • 1
    • 2

    查看容器内部细节

    ## 命令  
    	docker (container) inspect  容器id 
    
    • 1
    • 2

    查看容器启动日志

    ## 命令 
    	docker  logs  容器名或者容器id  
    	
    ## 参数 
    	-t  日志中 显示时间 
    	-f  动态日志 有日志 直接打印出来(实时日志) 窗口将无法编辑
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    宿主机文件互通

    ## 宿主机复制到容器内部
        # 命令 
    	docker cp 宿主机文件路径  容器id:容器内部路径 
    	# 例如
        docker cp ./meizi.txt 103caae5a0af:/opt
        
    ## 容器内部复制到宿主机
    	# 命令 
    	docker cp 容器id:容器内部路径  宿主机文件路径
    	# 例如
    	 docker cp 103caae5a0af:/opt/meizi.txt  /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    容器重启策略

    ## 命令 
    	--restart  启动容器时携带 
    	
    ## 取值 
    	no: 默认值 不重启
    	always:表示容器退出时自动重启 (除非显示暂停)
    	unless-stopped :表示总是重启
    	on-failure:max 表示只在容器启动失败时重启  max表示尝试重启的次数  
        
    ## 区别: 
    	always和unless-stopped  这2个当容器手动stop时 都不会自动重启  当手动暂停时 unless-stopped会记住容器停止前的状态  直接进入到停止前的状态 , 而always表示总是重启 另外重启docker时 always将会自动重启
    而手动停止过的unless-stopped 则不会自动停止
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    把容器构建成镜像

    当我们部署前端和java项目后 此时我们的项目代码在容器内部,当把容器删除了,此时项目代码也就丢了 如果再想发布项目 需要流程再走一遍 比较麻烦 此时我们可以把项目弄好的容器打成一个自己的镜像 什么时候想要运行项目 只需要使用这个镜像运行一个容器实例就可以了

    ## 命令 
    	docker commit -m "描述" -a "作者" 要打包的容器id 新镜像的名称:标签  
    
    • 1
    • 2

    在这里插入图片描述

    仓库操作

    我们把我们的项目,变成一个镜像,这个之后我们如何共享我们的镜像,
    第一种方式: 就是把镜像执行 save 操作 打成tar包 给别人 
    第二种方式: 就是把我们的镜像推送到仓库 此时别人就能从仓库上拉取了 
    
    • 1
    • 2
    • 3

    推送到Docker hub

    1. 创建一个Docker hub账号,并且创建一个与commit同名的仓库
    2. 执行push命令
    docker push zsl0/zsl0_nginx:0.0.1
    
    • 1

    在这里插入图片描述

    推送到阿里云仓库

    1. 阿里云官网 -> 容器镜像服务 -> 创建个人实例
    2. 个人实例 -> 创建命名空间
    3. 个人实例 -> 镜像仓库 ->本地仓库
    4. 根据阿里云提示推送到仓库
    # 1. 登录阿里云Docker Registry
    $ docker login --username=2492*****@qq.com registry.cn-beijing.aliyuncs.com
    # 2. 从Registry中拉取镜像
    $ docker pull registry.cn-beijing.aliyuncs.com/zsl0/zsl0_nginx:[镜像版本号]
    # 3. 将镜像推送到Registry
    $ docker login --username=2492*****@qq.com registry.cn-beijing.aliyuncs.com
    $ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/zsl0/zsl0_nginx:[镜像版本号]
    $ docker push registry.cn-beijing.aliyuncs.com/zsl0/zsl0_nginx:[镜像版本号]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    搭建自己的仓库

    1. 拉去仓库镜像
    docker pull registry:2
    
    • 1
    1. 启动容器
    docker run -d -p 5000:5000 registry:2
    
    • 1
    1. 浏览器访问
    http://192.168.2.11:5000/v2/_catalog
    
    • 1
    1. localhost的方式上传
    docker push localhost:5000/zsl0_nginx
    
    • 1
    1. ip地址的方式上传
    # 1. 覆盖安全连接配置
    /etc/docker/daemon.json 添加如下内容
    "insecure-registries":["192.168.127.142:5000"]
      
    # 2. 重启
    systemctl daemon-reload
    systemctl restart docker
     # 重启仓库容器
    docker start 182a3267d598
    
    # 3. 上传
    docker push 192.168.2.11:5000/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    持久化卷操作

    数据分为持久化数据和非持久化数据 我们每个容器都会自动分配一个存储位置 这个位置就是本地存储 默认情况下在/var/lib/docker下 容器中的文件和文件系统都会在这个本地存储中,而这些文件会随着容器的删除而丢失,也就是说容器中的数据和容器享有同样的声明周期 伴随着容器的存在而存在

    卷的操作

    1. 卷的基础命令
    ## 	 创建巻
    	docker volume create 卷名
    	
    ##  查看所有的巻
    	docker  volume ls  
    	
    ##  查看巻的详情 
    	docker volume inspect 卷名 
    
    ##  删除巻
    	 1: 删除所有没有挂载的巻 
    	 		docker  volume prune  
    	 2: 删除具体的巻 
    	 		docker volume rm 卷名	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 巻挂载容器方式一
    ## 语法一
    	docker  run -d --mount (type=volume,)source=卷名,target=容器路径 镜像名称:tag 	 
    	例如	
    	docker run -d --name nginx6 -p 8084:80 --mount type=bind,source=vol,target=/opt 
    ## 语法二
    	docker run -d  -v 卷名:容器路径 镜像名称:tag
    	例如 
    	docker  run -d  -v vol:容器路径 镜像名称:tag
    ## 特点: 
    	不管是--mount的方式 还是-v的方式 如果巻不存在 则会自动创建巻  
        巻中的数据会和容器中对应的位置中的数据实时同步
    	
    ## 注意点: 
    	1:不管是--mount的方式还是-v的方式 如果挂载的容器中的路径中有文件 则自动会把文件同步到卷中  
    	2:不管是--mount的方式还是-v的方式  如果挂载的卷中有数据 则挂载到容器中时 容器中也会同步巻中数据 
    	3:不管是--mount的方式还是-v的方式  卷中本身有数据,挂载的容器中也有数据 则会把容器中的数据清空之后 把巻中的数据同步到容器中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 巻挂载容器方式二
    ## 第一种语法 
    	docker run -d -v 宿主机文件路径:容器路径 镜像名称:tag  
    	例如: 
    	docker run -d --name nginx5 -p 8083:80 -v /opt/yyyyy:/opt nginx:1.14.2
    	
    ## 第二种语法 
    	docker run -d --mount type=bind,source=宿主机文件路径,target=容器中路径 镜像名称:tag  
    	例如: 
    	docker run -d --mount type=bind,source=/opt/yyyyy,target=/opt 镜像名称:tag  
    
    ## 特点: 
    	-v的方式指定的路径 如果不存在则会自动创建
        --mount的方式 挂载路径 如果路径不存在 则会报错  必须存在才能绑定成功
    
    ## 注意点 
    	 1:不管是-v还是--mount 如果宿主机中文件夹中有没有文件 都会清空容器中对应的目录,如果有文件的话 
    	 宿主机文件夹中的文件会同步到容器中 
         
        2:容器中对应位置中的文件 这种方式不会同步到宿主机中 但是数据卷会
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    项目容器化

    1: 准备项目
    2: 创建Dockerfile
    3: 使用Dockerfile中的描述信息 把项目构建成一个镜像 (docker image built)
    4: 把镜像推送到仓库 (push)
    5: 拉取镜像启动容器 (pull)

    Dockerfile 操作

    ## 1:什么是Dockerfile  
    	Dockerfile 就是一个文本文件,名字就叫Dockerfile  没有任何后缀名  并且名字是固定的 必须这样写 
    	
    ## 2:Dockerfile的作用
    	1: 使用命令来描述当前项目信息 
    	2: 指导docker创建一个包含当前应用的镜像(就是指导docker完成项目容器化)
    	3: 在实际工作中可以快速让新手熟悉项目 
    ## 3: 构建镜像命令 
    	1:docker commit Dockerfile所在目录 
    	 	例如 docker commit ./ 表示使用当前目录中的Dockerfile文件镜像构建 
    	2:docker  tag 镜像id  镜像名称:tag 
    		例如: docker tag 8hg69gg88 huige:1.0        
        3: 简写 
        	docker build -t 新镜像名称:标签 Dockerfile所在文件夹路径 	
    ## 3: 构建镜像过程
    	1: 执行docker (image) build -t 新镜像名称:标签 Dockerfile所在文件夹路径   就会构建镜像
    	2: docker客户端会把Dockerfile和Dockerfile所在的目录(上下文环境)都发送给docker服务器(引擎) 
    	3: docker引擎 会从上往下分析Dockerfile中的命令 根据命令构建镜像层和镜像的元信息 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    dockerfile语法:

    ## 注释语法: #  
    ## 命令语法: 命令  命令的值(value)  
      	其中命令就是Dockerfile的命令 默认对大小写不敏感  但是一般都是大写 value就是这个命令要执行的内容  
     	其中 FROM命令 永远在命令的第一行 表示使用某个基础镜像层
    
    • 1
    • 2
    • 3
    • 4
    1. FROM命令
    ## 语法: 
    	1:FROM 镜像名字
    	2:FROM 镜像:tag 
    	3:FROM 镜像:散列值
    ##作用:
    	指定基础镜像层 在Dockerfile的第一行(如果本地没有镜像则拉取镜像)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. RUN命令
    ##语法: 
    	语法一: RUN shell命令
    	语法二: RUN ["","",""] 有点类似json数组
    ##作用: 
    	在基础的镜像层做一些增强的操作 比如在基础的镜像层中 创建目录 安装一些软件等等
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. ADD和COPY命令
    ## 语法: 
    	ADD source target 
    	ADD ["source","target"]
    	COPY source target
    	COPY ["source","target"]
    	
    ## 含义: 
    	表示从上下文环境中(Dockerfile所在的目录中) 把文件添加/复制到镜像的文件系统中
    	
    ## 区别: 
    	ADD的source取值 可以是下载URL路径  可以是压缩包(压缩包时可以解压) 也可以是普通文件
    	COPY的source取值 只能是普通文件 不能是url 可以是压缩包 但是不能自动解压	
    	ADD 会创建多级目录  COPY在复制时 如果镜像中的目录不存在 最后一级目录后需要加/
    		例如  
    			ADD  aaa.txt /opt/aaa
    			COPY aaa.txt /opt/aaa/
    	可以直接重命名
    		例如
    			ADD aaa.jpg /opt/ddd/eee.jpg
    			COPY aaa.jpg /opt/eee/fff.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. EXPOSE命令
    ## 语法: 
    	EXPOSE 端口
    ## 意义: 
    	启动容器暴露的端口 比如redis 容器启动后 默认暴露的端口是6379   
    ## 注意 
    	这个指令不会构建镜像层  只是添加镜像元信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. WORKDIR命令
    ## 语法: 
    	WORKDIR 绝对路径  
    		比如:WORKDIR /opt/aaaa
    		
    	WORKDIR 相对路径   
    		比如
    			WORKDIR /a
    			WORKDIR b
    			WORKDIR c	
                 实际路径/a/b/c           
     ## 含义: 
     	`指定工作目录  效果就是 进入容器的默认是哪个目录 
     ##注意: 
     `	这个命令 也不会添加镜像层  只是添加镜像元信息##
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. LABEL命令
    ## 语法
    	LABEL key=value  
    ## 含义:描述作者信息
    ## 注意:
    	这个命令不会创建镜像层 只是添加镜像元信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. CMD和ENTRYPOINT命令
    ## 语法: 
    	CMD 命令 
    	CMD ["",""]
    	ENTRYPOINT 命令
    	ENTRYPOINT ["",""]
    	
    ## 作用: 
    	根据镜像启动容器的时候 要执行的命令  也就是说这2个命令是在容器启动之后需要执行的内容 在实际当中 比如	 说我们启动项目可以用到  
    	
    ## 区别: 
    	CMD 可以有多个 但是只有最后一个生效 上面的将会覆盖掉  ENTRYPOINT 只能有一个 不能有多个
    	CMD中的命令可以覆盖  ENTRYPOINT中的命令也能覆盖 但是覆盖的方式不同  
    	
    ##实际中: 
    CMD和ENTRYPOINT搭配使用  CMD给ENTRYPOINT传参数 如果是这种方式使用时 我们要使用json数组的方式		执行命令##
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    CMD:ls / 会覆盖命令

    docker run 镜像id ls /
    
    • 1

    ENTRYPOINT:可以使用–entrypoint 参数覆盖命令

    docker run --entrypoint ls 镜像id /usr
    
    • 1

    混合使用注意点:
    1:如果CMD和ENTRYPOINT中是完整指令,只执行ENTRYPOINT中的命令和写的先后顺序无关
    2:如果CMD和ENTRYPOINT中非完整指令,此时指令会拼接执行,但是ENTRYPOINT必须写在CMD前面,也就是说ENTRYPOINT中拼接上CMD命令之后执行

    FROM centos:7
    ENTRYPOINT ["echo"]
    CMD ["hello"]
    
    • 1
    • 2
    • 3
    1. ARG和ENV命令
    ## 语法
    	ARG key=value 
    	ENV key=value  
    ## 含义: 
    	2个命令都是设置一些环境变量  都可以在执行命令的时候 动态修改value的值 
    ## 作用: 
    	指定好环境变量 我们执行其他命令时 比如 RUN 和 WORKDIR ADD CMD等命令时 可以使用此变量 
    ## 区别: 
    	ARG的方式设置的变量 只能构建镜像时修改 镜像一旦构建成功 则无法修改 --build-arg key=value
    	ENV的方式设置的变量 只能在运行容器修改 每次创建新容器都可以修改不同的值 -e  key=value 但是有些命令 
    	不生效 因为在执行容器时 有些镜像层已经创建好了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    构建时修改arg参数:

    docker build --build-arg basedir=/mnt ./
    
    • 1
    1. VOLUME命令
    ## 语法:
    	VOLUME 容器中的路径 
    	VOLUME ["器中的路径1","容器中的路径2"]
    
    ## 作用: 
    	如果Dockerfile中没有VOLUME命令启动容器时 则不会有数据卷持久化数据  除非启动时指定某个目录挂载数据卷,如果挂载数据巻则数据是临时数据  
    	
    	如果Dockerfile中指定了VOLUME命令  就算启动命令时没有指定数据卷 也会自动生成一个数据卷 保证了VOLUME指定的文件夹中的数据 当然可以启动的时候使用-v 指定当前目录 覆盖自动生成的数据巻了 此时就用你指定的巻 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. ONBUILD命令
    ## 命令
    	ONBUILD dockerfile其他命令
    	
    ## 作用: 
    	构建此镜像时不会执行ONBUILD中指定的命令  但是如果其他Dockerfile使用此镜像做基础镜像时 
    	会自动执行ONBUILD中的命令 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    网络相关

    docker的网络架构主要有三部分组成 
    	1:CNM(container newwork model) 是一套标准 主要提供沙盒,终端和网络。 
    			1:沙盒就是一个网络栈 包含以太网接口端口路由表等 
    			2:终端就是虚拟网络接口,主要负责网络连接 负责沙盒连接到网络
    			3:网络:就是网桥 其实就是交换机 网络就是需要交互的终端集合 
    			
       2:libnetwork: 是一个开源的库 使用go语言编写 是CNM的具体实现 并且在CNM具体实现的基础上添加了服务
       					发现和负载均衡功能 并且还增添了网络控制层和管理层的功能
    、  
    	3: 驱动:驱动实现了数据层的功能 既然是数据层的管理 其中docker内置很多驱动 比如bridge overlay等,
    				其中  Bridge驱动是默认驱动 可以存在多个网络 
    		      null驱动  默认只允许存在一个网络 
    		      host驱动  默认只允许存在一个网络
    		      overlay驱动 一般搭配swarm集群使用
    		      remote驱动 需要加载remote插件
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    网络操作

    1. 查看所有网络
    ## 命令 
    	docker network ls 
    	docker会默认携带这三个网络 这三个网络无法删除
    
    • 1
    • 2
    • 3
    1. 新建网络
    ## 命令
    	docker network create 网络名词  (默认的驱动是bridge驱动)
    	docker network create -d 驱动名词 网络名词 (指定驱动创建网络)
    
    • 1
    • 2
    • 3
    1. 查看网络详情
    ## 命令
    	docker network inspect 网络名称(id)
    
    • 1
    • 2
    1. 删除网络
    ## 命令 
    	docker network rm 网络名称(id)
        	表示根据网络名称 或者id 删除网络 但是自带的三个网络无法删除 只能删除自己手动建立的  
        	
    	docker  network prune 
    		表示删除所有没有使用的网络  也不会删除三个自带的 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 和容器搭配命令
    ## 1: 启动容器时 指定网络
    	命令:	--network 网络名词
    	例如 docker  run  -d --network huige nginx:1.14.2 
        
    ## 2:让容器连接某个网络 
    	 命令 
    		docker  network connect 网络名称 容器名称  
    	 例如: 
    		docker  network connect huige xxxxx 表示把名字为xxxxx的容器连接到huige网络中
    		
    ## 3: 让容器断开某个网络
    	 命令 
    		docker  network disconnect 网络名称 容器名称  
    	 例如: 
    		docker  network disconnect huige xxxxx 表示把名字为xxxxx的容器断开huige网络
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结论:

     # 结论一: 
    	 同在一个网络中的容器 可以相互通讯 不在一个网络中的容器无法通讯
        
     # 结论二: 
     	 容器可以连接外网或者被外网连接 证明容器也是有ip的 但是我们可以使用容器名ping通 证明容器名称
     	 和容器ip是有映射的
     
     # 结论三: 
     	一个容器可以连接多个网络 此时可以与所在不同网络的容器进行通讯
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Bridge网络模型概述:

    1: 当docker容器启动时 会自动创建一个docker0的网卡  可以使用ip addr看到  这个docker0是虚拟出来的
    	不是真正物理上的网络设备 虽然说有ip地址 但是外部无法访问 如果外部想要访问到docker0所在的ip网段
    	需要从宿主机内部转发 
    
    2: 有了这个docker0网卡只有 宿主机会在内核路由表上添加一个静态路由 
    	可以使用route -n查看 需要安装(yum install net-tools)
    	Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    	172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
    	表示 目的地如果是172.17.0.0 所在的网段都会使用docker0进行转发
    	
    3: 启动容器时 如果不指定网络 默认使用bridge网络 这个容器将会在bridge所在的网络段中分配一个ip地址
        此时容器就在docker0网卡的ip段中 所以我们访问宿主机 宿主机根据请求路径 经过静态路由把请求转发给
        docker0 又因为容器在docker0网段中 所以可以直接访问到容器  
        
    4:  启动容器时 可以进入容器使用ifconfig看一下ip地址 需要安装(yum install net-tools)  此时会发现
    	有2个网卡  一个是lo(回环网卡) 一个是eth0 ip地址和docker0在同一个网段上    并且此时宿主机上
    	也会出现一个vethxxxx虚拟网络设备(虚拟网络) 并且这个网卡是附加在docker0身上的   
    	也就是说 容器中的eth0网卡和vethxxxx是成对出现的 这就是veth pair 技术  一旦一方接收到了网络数据
    	会立即发送给另一方   
    	
    5: 其实我们每次创建一个网络时 就会创建一个虚拟的网卡 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    Docker-Compose相关操作

    我们使用Dockerfile 确实可以把我们的项目 构建成一个镜像,并且启动成一个容器,完成项目的容器化 但是实际开发中,我们的项目可能需要依赖 mysql redis mq等 微服务项目甚至一个完整的应用可能包含多个模块,并且每个模块可能也会连接redis mysql mq等 此时我们面临的问题 就是如何统一编排把项目真正做到容器化部署

    ## 1:Docker Compose的历史
    	Docker Compose的前身是Fig ,Fig是由Orchard公司开发基于Python的工具,2014年 Docker公司收购了	Orchard公司 并将Fig更名为Docker Compose 
    	
    ## 2:Docker Compose的作用 
    	Docker Compose 允许开发者通过一个声明式配置文件(yml)描述整个应用,其实就是使用这个配置描述运行我们项目都需要使用那些容器,然后使用Docker-Compose 命令行工具进行应用的部署和管理 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下载安装:

    ## 从github下载 
    curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
    ## 如果下载慢 或者下载不动 可以使用daocloud提供的下载方式 
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    ## 修改权限
    chmod +x /usr/local/bin/docker-compose
    
    ## 测试 
      docker-compose --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    配置文件编排

    
    ## 编排说明
    	docker-compose的 声明式配置文件是yaml文件 文件后缀名可以是yml或者yaml,文件名字可以随便叫,但是默认是docker-compose  如果是其他名字 当执行命令时 需要使用-f指定配置文件
    	
    ## 准备工作 
      1: 新建文件夹
      	mkdir /opt/compose
      	
      2: 切换到这个文件夹
      	cd /opt/compose  
      	
      3:创建docker-compose.yml文件  
      	 touch docker-compose.yml
      	 
      4:idea远程连接linux 编辑这个文件(有提示) 并且使用idea连接linux命令行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    compose模板:

    #版本 取值字符串,版本不是docker版本 也不是docker-compose版本 而是
    #解析docker-compose.yml文件使用的API的版本 默认使用最新的即可
    version: "3.8"
    services: # 表示服务 是个复数 可以指定多个服务
      mynginx: # 这个表示服务名词 随便写
        image: nginx:1.14.2 #表示启动这个服务用的镜像
        container_name: mynginx # 表示启动容器时的容器名称
        ports:
        - "80:80"
        volumes: ## 挂载数据卷 这个数据巻必须在下面指定卷名
        - nginxconfig:/etc/nginx/
        - nginxhtml:/usr/share/nginx/html
        networks: ## 指定这个服务加入的网络 可以配置多个 需要在下面的标签中指定
          - mynet
          - mynet1
    
      myredis:
          image: redis:6.0.10
          container_name: myredis
          ports:
          - "6379:6379"
          # 使用文件夹的形式挂载
          volumes:
          - /opt/redis:/usr/local/etc/redis
          - /opt/redis/datas:/data
          restart: always # 设置重启策略
          #command 用户覆盖Dockerfile中的CMD命令
          command: redis-server /usr/local/etc/redis/redis.conf
    
      dbsql:
          image: mysql:8.0.23
          container_name: mymysql
          ports:
          - "3306:3306"
          volumes:
          - mysqlconfig:/etc/mysql
          - mysqldata:/var/lib/mysql
          ##environment  专门修改环境变量 等价于docker run  -e指定的变量
          ##environment:
          ##  - MYSQL_ROOT_PASSWORD=rootroot
          env_file: ## env_file 和environment 功能一样 只是把配置文件维护在一个.env文件中
            - ./my.env
          command: --default-authentication-plugin=mysql_native_password
          restart: always
    
      javaproject:
        build:
          dockerfile: ./Dockerfile
          context: .
        container_name: myproject
        ports:
        - "10000:10000"
        restart: always
        networks:
          - project
    networks:
      project:
      mynet: ## 如果没有指定任何配置 则默认生成 项目名_网络名称
      mynet1:
        external: true # 如果指定参数 这个网络名词必须存下 不会自动创建
    
    
    volumes: # 如果数据巻只声明 不加任何设置 默认生成的是项目名_数据卷名
      mysqlconfig:
      mysqldata:
      nginxconfig:
      nginxhtml:
        external: true # 这个属性表示生成的数据巻就是指定的数据巻
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    1. up命令
    ## 命令 
    	docker-compose up 服务名称 启动某个服务 
    	docker-compose up 启动所有服务  
    	
    ## 含义:表示根据docker-compose.yml文件 创建镜像启动容器创建网络创建数据卷  默认前台启动
    
    ## 参数
    	-f 指定docker-compose.yml  不指定默认在当前执行命令所在文件夹中找docker-compose.yml
    	-d 表示后台启动  
    	&  前台启动返回命令行  支持nohup  &  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. stop命令
    # 命令
     docker-compose stop 服务名称  正常停止某个服务 
     docker-compose stop   正常停止所有服务 
    
    ## 含义:停止项目中所有的服务  但是不会删除任何内容 不会删除服务 不会删除容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. down命令
    ## 命令 
    	docker-compose down 服务名称  直接撸死某个应用  	
    	特点: 撸死应用 并且删除容器 删除网络(排除external指定的)  不会删除镜像和数据巻
    	
    	docker-compose down  撸死所有应用   
    	特点: 撸死整个应用 删除所有容器 删除网络(排除external指定的) 不会删除镜像和数据巻
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. restart命令
    ## 命令 
    	docker-compose restart 服务名称  重启某个服务  
    	docker-compose restart  重启所有服务  
    	
    ## 特点: 
    	针对于stop停止的服务或者正在运行的服务有效  直接使用restart或者down之后使用将会报错   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. rm命令
    ## 命令 
    	docker-compose rm 服务名称   表示删除某个服务 这个服务必须得stop 不停止无法删除 
    	docker-compose rm           表示删除整个服务 服务必须得stop 不停止无法删除  
        
    ## 特点
    	 停止服务 删除容器 不删除网络镜像和数据巻
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. start命令
    ## 命令 
    	docker-compose start 服务名称  启动某个服务 
    	docker-compose start  启动所有服务 
    	
    ##特点 
    	不会创建容器等  必须容器存在 并且停止的状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. kill命令
    ## 命令 
    	docker-compose kill 容器名称  杀死某个服务
    	docker-compose kill   杀死所有服务   
    	
    ## 特点 
    	只是杀死服务  容器网络数据巻镜像 都不会删除 (和stop差不多)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 其他命令
    ##1: 命令一 
    	docker-compose images  查看项目中使用的所有镜像  
    	
    ##2:命令二 
    	docker-compose logs 查看日志  
    ##3: 命令三 
    	docker-compose top  查看进程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    PTA题目 两个数的简单计算器
    前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)
    C++模拟OpenGL库——图形光栅化理论及实现(三):三角形绘制
    k8s教程(13)-pod定向调度
    手机如何开启开发者选项? (小米为例)
    SQL注入漏洞及五大手法
    Git使用【中】
    事件的发送和分发器
    IPv6 to IPv4 隧道【下一代互联网02】
    <蓝桥杯软件赛>零基础备赛20周--第6周--数组和队列
  • 原文地址:https://blog.csdn.net/qq_19152901/article/details/126919174