Docker 基础命令

镜像操作

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

搜索镜像

命令: 
	docker  search  镜像名称 

参数(很多)
	--filter "is-official=true" 表示官方镜像 
	--filter "is-automated=true" 表示非官方镜像 
	--limit 1 默认搜索结果是25个 可以指定搜索的个数 但是这个个数不超过100 

拉去镜像

## 命令 
 ## 根据标签拉取 
	docker (image) pull 镜像名:tag  
## 根据散列值拉取
	docker (image) pull 镜像名@散列值

查看本地镜像

##命令 
	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

删除镜像

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

镜像备份以及加载

## 备份镜像 
	docker save 镜像名:tag -o  要备份的位置/备份名.tar  
	 
## 加载备份的镜像 
	docker load -i 备份的镜像 

查看镜像内部信息

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

容器操作

容器相关指令 都是以 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容器时 不要加
	

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

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

启动容器的设置

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

查看容器

##  查看运行中的容器 
	 docker container ls 或者 docker  ps  
	 
## 查看所有容器 (不管运行还是不运行)
	docker container ls -a 
	
## 只查看运行容器id 
	docker ps -q  
    
## 查看所有容器id  
	docker container ls  -qa 

容器的常规操作

## 启动容器 
	docker (container)  start 容器名称或者容器id 
## 停止容器 
	docker (container) stop 容器名称或者容器id
## 重启容器
	docker (container) restart 容器名称或者容器id   
## 杀死容器 
	docker (container) kill 容器名称或者容器id

进入和退出容器

## 进入容器方式一 (过时了) 
	# 命令
		docker (container)  attach 容器id   
	# 现象
		这种方式经过测试 只有在-it的方式启动容器时 才可以进入 -d启动容器的方式 好像进不去  
	# 退出容器 
    	ctrl+PQ键  
    	
## 进入容器的方式二
	# 命令 
	 docker(container) exec -it 容器id bash 
	# 退出容器
	  ctrl+PQ 或者 exit  

删除容器

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

删除所有容器

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

查看容器中运行的进程

## 命令 
	docker (container) top 容器id 

查看容器内部细节

## 命令  
	docker (container) inspect  容器id 

查看容器启动日志

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

宿主机文件互通

## 宿主机复制到容器内部
    # 命令 
	docker cp 宿主机文件路径  容器id:容器内部路径 
	# 例如
    docker cp ./meizi.txt 103caae5a0af:/opt
    
## 容器内部复制到宿主机
	# 命令 
	docker cp 容器id:容器内部路径  宿主机文件路径
	# 例如
	 docker cp 103caae5a0af:/opt/meizi.txt  /

容器重启策略

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

把容器构建成镜像

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

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

在这里插入图片描述

仓库操作

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

推送到Docker hub

  1. 创建一个Docker hub账号,并且创建一个与commit同名的仓库
  2. 执行push命令
docker push zsl0/zsl0_nginx:0.0.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. 拉去仓库镜像
docker pull registry:2
  1. 启动容器
docker run -d -p 5000:5000 registry:2
  1. 浏览器访问
http://192.168.2.11:5000/v2/_catalog
  1. localhost的方式上传
docker push localhost:5000/zsl0_nginx
  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/

持久化卷操作

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

卷的操作

  1. 卷的基础命令
## 	 创建巻
	docker volume create 卷名
	
##  查看所有的巻
	docker  volume ls  
	
##  查看巻的详情 
	docker volume inspect 卷名 

##  删除巻
	 1: 删除所有没有挂载的巻 
	 		docker  volume prune  
	 2: 删除具体的巻 
	 		docker volume rm 卷名	
  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. 巻挂载容器方式二
## 第一种语法 
	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: 创建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中的命令 根据命令构建镜像层和镜像的元信息 

dockerfile语法:

## 注释语法: #  
## 命令语法: 命令  命令的值(value)  
  	其中命令就是Dockerfile的命令 默认对大小写不敏感  但是一般都是大写 value就是这个命令要执行的内容  
 	其中 FROM命令 永远在命令的第一行 表示使用某个基础镜像层
  1. FROM命令
## 语法: 
	1:FROM 镜像名字
	2:FROM 镜像:tag 
	3:FROM 镜像:散列值
##作用:
	指定基础镜像层 在Dockerfile的第一行(如果本地没有镜像则拉取镜像)
  1. RUN命令
##语法: 
	语法一: RUN shell命令
	语法二: RUN ["","",""] 有点类似json数组
##作用: 
	在基础的镜像层做一些增强的操作 比如在基础的镜像层中 创建目录 安装一些软件等等
  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. EXPOSE命令
## 语法: 
	EXPOSE 端口
## 意义: 
	启动容器暴露的端口 比如redis 容器启动后 默认暴露的端口是6379   
## 注意 
	这个指令不会构建镜像层  只是添加镜像元信息
  1. WORKDIR命令
## 语法: 
	WORKDIR 绝对路径  
		比如:WORKDIR /opt/aaaa
		
	WORKDIR 相对路径   
		比如
			WORKDIR /a
			WORKDIR b
			WORKDIR c	
             实际路径/a/b/c           
 ## 含义: 
 	`指定工作目录  效果就是 进入容器的默认是哪个目录 
 ##注意: 
 `	这个命令 也不会添加镜像层  只是添加镜像元信息##
  1. LABEL命令
## 语法
	LABEL key=value  
## 含义:描述作者信息
## 注意:
	这个命令不会创建镜像层 只是添加镜像元信息
  1. CMD和ENTRYPOINT命令
## 语法: 
	CMD 命令 
	CMD ["",""]
	ENTRYPOINT 命令
	ENTRYPOINT ["",""]
	
## 作用: 
	根据镜像启动容器的时候 要执行的命令  也就是说这2个命令是在容器启动之后需要执行的内容 在实际当中 比如	 说我们启动项目可以用到  
	
## 区别: 
	CMD 可以有多个 但是只有最后一个生效 上面的将会覆盖掉  ENTRYPOINT 只能有一个 不能有多个
	CMD中的命令可以覆盖  ENTRYPOINT中的命令也能覆盖 但是覆盖的方式不同  
	
##实际中: 
CMD和ENTRYPOINT搭配使用  CMD给ENTRYPOINT传参数 如果是这种方式使用时 我们要使用json数组的方式		执行命令##

CMD:ls / 会覆盖命令

docker run 镜像id ls /

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

docker run --entrypoint ls 镜像id /usr

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

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

构建时修改arg参数:

docker build --build-arg basedir=/mnt ./
  1. VOLUME命令
## 语法:
	VOLUME 容器中的路径 
	VOLUME ["器中的路径1","容器中的路径2"]

## 作用: 
	如果Dockerfile中没有VOLUME命令启动容器时 则不会有数据卷持久化数据  除非启动时指定某个目录挂载数据卷,如果挂载数据巻则数据是临时数据  
	
	如果Dockerfile中指定了VOLUME命令  就算启动命令时没有指定数据卷 也会自动生成一个数据卷 保证了VOLUME指定的文件夹中的数据 当然可以启动的时候使用-v 指定当前目录 覆盖自动生成的数据巻了 此时就用你指定的巻 
  1. ONBUILD命令
## 命令
	ONBUILD dockerfile其他命令
	
## 作用: 
	构建此镜像时不会执行ONBUILD中指定的命令  但是如果其他Dockerfile使用此镜像做基础镜像时 
	会自动执行ONBUILD中的命令 

网络相关

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. 查看所有网络
## 命令 
	docker network ls 
	docker会默认携带这三个网络 这三个网络无法删除
  1. 新建网络
## 命令
	docker network create 网络名词  (默认的驱动是bridge驱动)
	docker network create -d 驱动名词 网络名词 (指定驱动创建网络)
  1. 查看网络详情
## 命令
	docker network inspect 网络名称(id)
  1. 删除网络
## 命令 
	docker network rm 网络名称(id)
    	表示根据网络名称 或者id 删除网络 但是自带的三个网络无法删除 只能删除自己手动建立的  
    	
	docker  network prune 
		表示删除所有没有使用的网络  也不会删除三个自带的 
  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网络

结论:

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

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: 其实我们每次创建一个网络时 就会创建一个虚拟的网卡 

在这里插入图片描述

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 命令行工具进行应用的部署和管理 

下载安装:

## 从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

配置文件编排


## 编排说明
	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命令行

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. up命令
## 命令 
	docker-compose up 服务名称 启动某个服务 
	docker-compose up 启动所有服务  
	
## 含义:表示根据docker-compose.yml文件 创建镜像启动容器创建网络创建数据卷  默认前台启动

## 参数
	-f 指定docker-compose.yml  不指定默认在当前执行命令所在文件夹中找docker-compose.yml
	-d 表示后台启动  
	&  前台启动返回命令行  支持nohup  &  
  1. stop命令
# 命令
 docker-compose stop 服务名称  正常停止某个服务 
 docker-compose stop   正常停止所有服务 

## 含义:停止项目中所有的服务  但是不会删除任何内容 不会删除服务 不会删除容器
  1. down命令
## 命令 
	docker-compose down 服务名称  直接撸死某个应用  	
	特点: 撸死应用 并且删除容器 删除网络(排除external指定的)  不会删除镜像和数据巻
	
	docker-compose down  撸死所有应用   
	特点: 撸死整个应用 删除所有容器 删除网络(排除external指定的) 不会删除镜像和数据巻

  1. restart命令
## 命令 
	docker-compose restart 服务名称  重启某个服务  
	docker-compose restart  重启所有服务  
	
## 特点: 
	针对于stop停止的服务或者正在运行的服务有效  直接使用restart或者down之后使用将会报错   
  1. rm命令
## 命令 
	docker-compose rm 服务名称   表示删除某个服务 这个服务必须得stop 不停止无法删除 
	docker-compose rm           表示删除整个服务 服务必须得stop 不停止无法删除  
    
## 特点
	 停止服务 删除容器 不删除网络镜像和数据巻
  1. start命令
## 命令 
	docker-compose start 服务名称  启动某个服务 
	docker-compose start  启动所有服务 
	
##特点 
	不会创建容器等  必须容器存在 并且停止的状态
  1. kill命令
## 命令 
	docker-compose kill 容器名称  杀死某个服务
	docker-compose kill   杀死所有服务   
	
## 特点 
	只是杀死服务  容器网络数据巻镜像 都不会删除 (和stop差不多)
  1. 其他命令
##1: 命令一 
	docker-compose images  查看项目中使用的所有镜像  
	
##2:命令二 
	docker-compose logs 查看日志  
##3: 命令三 
	docker-compose top  查看进程
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐