docker-compose常用命令及yml文件编写

一、docker-compose安装

docker常用命令、Dockerfile、docker仓库 该篇文章最后有docker-compose的安装教程。
docker-compose是一款单机多容器编排工具,在正常使用docker的时候会使用很多命令,在输入这些命令的时候容易出错,而且不便记录执行了哪些命令,如果需要在其他的服务器上也部署同样的一份容器的话又要将这些命令执行一遍,服务器过多工作量也不小;这时使用docker-compose单机部署多容器就非常适用了。

二、docker-compose常用命令

docker-compose up 创建并启动容器
docker-compose up -d 以后台形式创建并启动容器
docker-compose -f yml文件 up 指定创建并启动容器使用的yml文件
docker-compose常用命令及yml文件编写_第1张图片
docker-compose ps:查看通过docker-compose创建的容器,如果是docker run启动的容器不会显示,通过docker ps可以查看通过docker run和docker-compose启动的容器
docker-compose images:查看通过docker-compose得到的image,通过其他方式得到的image不会显示,通过docker images可以查看docker pull、docker run、docker-compose、docker build、docker commit得到的image
docker-compose stop/start 停止/启动docker-compose.yml文件中定义的容器
docker-compose常用命令及yml文件编写_第2张图片
docker-compose down 停止并删除docker-compose.yml文件中定义的容器及删除docker-compose.yml文件中定义的network,但是定义的volume不会删除。
docker-compose常用命令及yml文件编写_第3张图片
docker-compose logs docker-compose.yml文件中定义的容器名称 查看某个容器的日志
docker-compose常用命令及yml文件编写_第4张图片
其他命令及参数可以通过docker-compose help查看
docker-compose常用命令及yml文件编写_第5张图片
注意:
1、docker-compose的命令需要在有docker-compose.yml文件的目录才可以执行,否则使用docker-compose的命令会报错;并且只有该yml文件执行了up操作即创建了该docker-compose.yml定义的容器之后才可以看到对应的容器。
比如执行docker-compose ps查看通过docker-compose运行了哪些容器:
docker-compose常用命令及yml文件编写_第6张图片
在没有docker-compose.yml文件的目录执行docker-compose的命令会报错,只有切换到有docker-compose.yml文件的目录方能正常执行docker-compose命令。
2、docker-compose命令,在哪个目录下执行,那么就是对于该目录下的docker-compose.yml文件的操作,比如docker-compose up就是使用当前目录的docker-compose.yml文件创建启动容器,docker-compose ps那么就是查看当前目录docker-compose.yml文件定义的容器(前提是执行了up操作才能看到定义的这些容器)。
docker-compose常用命令及yml文件编写_第7张图片
分别在docker1和docker两个目录执行相同的命令,查看到的结果不相同。

三、docker-compose yml文件编写

version:指定版本
services:该指令下面写该yml文件中需要定义的container信息,其中services的下面第一级指令就是指定的该容器的名称
如:

services:  #定义container
  mysql: #container名称为mysql
    image: "mysql:5.7" #image来源

image:指定该容器使用的image,和build二选一
build:指定该容器使用的image通过哪个目录下的Dockerfile文件进行构建,. 表示当前目录的Dockerfile文件,和image二选一
ports:指定宿主机和容器的端口映射关系,可指定多个
networks:指定使用的网络信息,可指定多个
ipv4_address:和networks配合使用,指定容器在该网络中的ip信息
volumes:指定数据挂载信息,可以指定目录或文件的映射,也可以指定数据挂载记录和容器中目录的映射(这种一般指定的容器中目录是该容器Dockerfile文件中VOLUME指令指定的目录),如果指定数据挂载记录的映射需要通过volumes定义数据挂载记录,可指定多个
environment:指定容器可选参数的值信息
networks:定义网络信息,相当于docker network create 命令,其中networks的下面第一级指令就是指定网络的名称,可以配合subnet指定网段信息
volumes:定义数据挂载记录,相当于docker volume create 命令
如:

volumes:  #定义volume-相当于 docker volume create mysql
  mysql: {}
或
volumes:  #定义volume-相当于 docker volume create mysql
  mysql:     

例如:

version: "3" #docker-compose版本
services:  #定义container
  mysql: #container名称
    image: "mysql:5.7" #image来源
    ports:
      - "3306:3306"
    networks:
      springboot:
        ipv4_address: 172.20.0.2
    volumes:
      - mysql:/var/lib/mysql  #设置持久化映射关系,其中mysql是下面volumes中定义的名称为mysql的数据挂载记录名称
    environment:
      MYSQL_ROOT_PASSWORD: root@123456Y #设置root账号密码
  sb01:   #container名称-相当于--name web
    build: . #image来源,build . 表示使用当前目录的Dockerfile文件进行构建image
    ports:   #指定端口映射
      - "9001:9989"   #端口映射关系 和ports一起相当于-p 9001:9989
    networks:  #指定network-相当于--network springboot
      springboot:
        ipv4_address: 172.20.0.6  #指定容器ip地址-相当于--ip 172.20.0.6
  sb02:   #container名称-相当于--name web
    build: . #image来源,build . 表示使用当前目录的Dockerfile文件进行构建image
    ports:   #指定端口映射
      - "9002:9989"   #端口映射关系 和ports一起相当于-p 9002:9989
    networks:  #指定network-相当于--network springboot
      springboot:
        ipv4_address: 172.20.0.7
  sb03:   #container名称-相当于--name web
    build: . #image来源,build . 表示使用当前目录的Dockerfile文件进行构建image
    ports:   #指定端口映射
      - "9003:9989"   #端口映射关系 和ports一起相当于-p 9003:9989
    networks:  #指定network-相当于--network springboot
      springboot:
        ipv4_address: 172.20.0.8
  nginx:   #container名称-相当于--name web
    image: nginx #image来源,build . 表示使用当前目录的Dockerfile文件进行构建image
    ports:   #指定端口映射
      - "80:80"   #端口映射关系 和ports一起相当于-p 80:80
    networks:  #指定network-相当于--network springboot
      springboot:
        ipv4_address: 172.20.0.3
    volumes:
      - "/usr/nginx/nginx.conf:/etc/nginx/nginx.conf" #指定nginx使用的配置文件

networks:  #定义network-相当于 docker network create --subnet=172.20.0.0/24 springboot 该命令创建的network默认也是桥接模式
  springboot: #network名称
    driver: bridge #定义network类型为桥接模式
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24 #指定网段信息
volumes:  #定义volume-相当于 docker volume create mysql
  mysql: {}

上面的docker-compose.yaml文件内容就是启动了三个springboot项目分别是sb01、sb02、sb03,以及一个mysql和nginx,并且指定了mysql的数据持久化映射,nginx使用的配置文件,以及这五个容器都使用名称为springboot的网络。
我这里通过docker-compose启动项目之后,访问接口效果如下:
在这里插入图片描述
注意:
1、yml文件的格式层级关系是缩进两个英文状态的空格,不能用缩进符等替代空格
2、如果指令后面需要写值必须是英文冒号+英文空格方可写值,如:image: “mysql:5.7”
3、如果是可以写多个值的指令(一般这样的指令都是这个单词的复数格式,如volumes、networks、ports等),对于这些指令的值需要冒号换行后使用 - 指定一个值,如果有多个值,使用多个 - 指定;如:

ports:   #指定端口映射
  - "9003:9989"   #端口映射关系 和ports一起相当于-p 9003:9989
  - "8080:8080"

4、docker-compose文件的名称只能是以下四个之一:docker-compose.yml、docker-compose.yaml、 compose.yml、compose.yaml
5、services下面定义的container的名称只能docker-compose的命令使用,docker命令无法使用该名称;docker要操作的话只能使用docker ps查看的container的名称,而这个名称的规则一般是docker-compose.yml文件所在目录的名称_docker-compose.yml文件中定义的容器名称_序号,如docker_sb01_1,其中docker是docker-compose.yml文件所在目录名称,sb01是docker-compose.yml文件中services指令下定义的container的名称,1是序号;而对应的image的名称如果该image是build得到的那么就是docker-compose.yml文件所在目录的名称_yml文件中定义的容器名称,如:docker_sb01,其中docker是docker-compose.yml文件所在目录名称,sb01是docker-compose.yml文件中services指令下定义的container的名称,如果这个image不是build而是通过image指定的话那么就是本身的image名称。
docker-compose常用命令及yml文件编写_第8张图片

你可能感兴趣的:(docker,docker-compose)