Docker 基础命令
当我们部署前端和java项目后此时我们的项目代码在容器内部,当把容器删除了,此时项目代码也就丢了 如果再想发布项目 需要流程再走一遍 比较麻烦 此时我们可以把项目弄好的容器打成一个自己的镜像 什么时候想要运行项目 只需要使用这个镜像运行一个容器实例就可以了。通常以 docker image 开头有时image可以省略 有时image可以和其他参数一起简写。容器相关指令都是以 docker cont
Docker 基础命令
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
- 创建一个Docker hub账号,并且创建一个与commit同名的仓库
- 执行push命令
docker push zsl0/zsl0_nginx:0.0.1

推送到阿里云仓库
- 阿里云官网 -> 容器镜像服务 -> 创建个人实例
- 个人实例 -> 创建命名空间
- 个人实例 -> 镜像仓库 ->本地仓库
- 根据阿里云提示推送到仓库
# 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:[镜像版本号]

搭建自己的仓库
- 拉去仓库镜像
docker pull registry:2
- 启动容器
docker run -d -p 5000:5000 registry:2
- 浏览器访问
http://192.168.2.11:5000/v2/_catalog
- localhost的方式上传
docker push localhost:5000/zsl0_nginx
- 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下 容器中的文件和文件系统都会在这个本地存储中,而这些文件会随着容器的删除而丢失,也就是说容器中的数据和容器享有同样的声明周期 伴随着容器的存在而存在
卷的操作
- 卷的基础命令
## 创建巻
docker volume create 卷名
## 查看所有的巻
docker volume ls
## 查看巻的详情
docker volume inspect 卷名
## 删除巻
1: 删除所有没有挂载的巻
docker volume prune
2: 删除具体的巻
docker volume rm 卷名
- 巻挂载容器方式一
## 语法一
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的方式 卷中本身有数据,挂载的容器中也有数据 则会把容器中的数据清空之后 把巻中的数据同步到容器中
- 巻挂载容器方式二
## 第一种语法
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命令 永远在命令的第一行 表示使用某个基础镜像层
- FROM命令
## 语法:
1:FROM 镜像名字
2:FROM 镜像:tag
3:FROM 镜像:散列值
##作用:
指定基础镜像层 在Dockerfile的第一行(如果本地没有镜像则拉取镜像)
- RUN命令
##语法:
语法一: RUN shell命令
语法二: RUN ["","",""] 有点类似json数组
##作用:
在基础的镜像层做一些增强的操作 比如在基础的镜像层中 创建目录 安装一些软件等等
- 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
- EXPOSE命令
## 语法:
EXPOSE 端口
## 意义:
启动容器暴露的端口 比如redis 容器启动后 默认暴露的端口是6379
## 注意
这个指令不会构建镜像层 只是添加镜像元信息
- WORKDIR命令
## 语法:
WORKDIR 绝对路径
比如:WORKDIR /opt/aaaa
WORKDIR 相对路径
比如
WORKDIR /a
WORKDIR b
WORKDIR c
实际路径/a/b/c
## 含义:
`指定工作目录 效果就是 进入容器的默认是哪个目录
##注意:
` 这个命令 也不会添加镜像层 只是添加镜像元信息##
- LABEL命令
## 语法
LABEL key=value
## 含义:描述作者信息
## 注意:
这个命令不会创建镜像层 只是添加镜像元信息
- 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"]
- 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 ./
- VOLUME命令
## 语法:
VOLUME 容器中的路径
VOLUME ["器中的路径1","容器中的路径2"]
## 作用:
如果Dockerfile中没有VOLUME命令启动容器时 则不会有数据卷持久化数据 除非启动时指定某个目录挂载数据卷,如果挂载数据巻则数据是临时数据
如果Dockerfile中指定了VOLUME命令 就算启动命令时没有指定数据卷 也会自动生成一个数据卷 保证了VOLUME指定的文件夹中的数据 当然可以启动的时候使用-v 指定当前目录 覆盖自动生成的数据巻了 此时就用你指定的巻
- 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插件
网络操作
- 查看所有网络
## 命令
docker network ls
docker会默认携带这三个网络 这三个网络无法删除
- 新建网络
## 命令
docker network create 网络名词 (默认的驱动是bridge驱动)
docker network create -d 驱动名词 网络名词 (指定驱动创建网络)
- 查看网络详情
## 命令
docker network inspect 网络名称(id)
- 删除网络
## 命令
docker network rm 网络名称(id)
表示根据网络名称 或者id 删除网络 但是自带的三个网络无法删除 只能删除自己手动建立的
docker network prune
表示删除所有没有使用的网络 也不会删除三个自带的
- 和容器搭配命令
## 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 # 这个属性表示生成的数据巻就是指定的数据巻
- up命令
## 命令
docker-compose up 服务名称 启动某个服务
docker-compose up 启动所有服务
## 含义:表示根据docker-compose.yml文件 创建镜像启动容器创建网络创建数据卷 默认前台启动
## 参数
-f 指定docker-compose.yml 不指定默认在当前执行命令所在文件夹中找docker-compose.yml
-d 表示后台启动
& 前台启动返回命令行 支持nohup &
- stop命令
# 命令
docker-compose stop 服务名称 正常停止某个服务
docker-compose stop 正常停止所有服务
## 含义:停止项目中所有的服务 但是不会删除任何内容 不会删除服务 不会删除容器
- down命令
## 命令
docker-compose down 服务名称 直接撸死某个应用
特点: 撸死应用 并且删除容器 删除网络(排除external指定的) 不会删除镜像和数据巻
docker-compose down 撸死所有应用
特点: 撸死整个应用 删除所有容器 删除网络(排除external指定的) 不会删除镜像和数据巻
- restart命令
## 命令
docker-compose restart 服务名称 重启某个服务
docker-compose restart 重启所有服务
## 特点:
针对于stop停止的服务或者正在运行的服务有效 直接使用restart或者down之后使用将会报错
- rm命令
## 命令
docker-compose rm 服务名称 表示删除某个服务 这个服务必须得stop 不停止无法删除
docker-compose rm 表示删除整个服务 服务必须得stop 不停止无法删除
## 特点
停止服务 删除容器 不删除网络镜像和数据巻
- start命令
## 命令
docker-compose start 服务名称 启动某个服务
docker-compose start 启动所有服务
##特点
不会创建容器等 必须容器存在 并且停止的状态
- kill命令
## 命令
docker-compose kill 容器名称 杀死某个服务
docker-compose kill 杀死所有服务
## 特点
只是杀死服务 容器网络数据巻镜像 都不会删除 (和stop差不多)
- 其他命令
##1: 命令一
docker-compose images 查看项目中使用的所有镜像
##2:命令二
docker-compose logs 查看日志
##3: 命令三
docker-compose top 查看进程
更多推荐



所有评论(0)