dockercompose语法使用

dockercompose语法

https://docs.docker.com.zh.xy2401.com/compose/compose-file/

curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod 755 docker-compose
root@ubuntu:~/test# cat docker-compose.yml
version: '3'
services:
  mariadb:
    image: mariadb/server:latest
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - /path/to/mariadb-persistence:/bitnami/mariadb
docker pull mariadb/server:latest

up

docker-compose -f xxx.yaml up [ -d ]   #bu-f指定,默认文件名为docker-compose.yml,-d后台运行。
[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx
[root@vm ]# docker-compose up -d
Creating network "root_default" with the default driver
Creating root_nginx_1 ... done    #创建容器名
Attaching to root_nginx_1
[root@vm ~]# docker inspect root_nginx_1
...
                    "IPAddress": "172.18.0.2",
[root@vm ~]# curl 172.18.0.2
...
<h1>Welcome to nginx!</h1>

docker-compose up -d   可以更新镜像,如果不想重启容器,加参数--no-recreate

down

[root@vm ~]# docker-compose down		#停止并删除容器、网络、卷、镜像。
Stopping root_nginx_1 ... done
Removing root_nginx_run_1 ... done
Removing root_nginx_1     ... done
Removing network root_default
[root@vm ~]# docker ps -a  #没有退出的容器

run

启动一个服务,并在一个服务上执行一个命令

[root@vm ~]# docker-compose run nginx   ls			#nginx 为yml里的services名
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var

start、stop、restart、pause、rm

启动/停止/重启/暂停 /删除

docker-compose rm [options] [SERVICE...]
–f, –force,强制直接删除,包括非停止状态的容器   -v,删除容器所挂载的数据卷

ps logs pull

查看容器、查看日志、拉取镜像

[root@vm ~]# docker-compose ps			#列出所有容器
    Name                  Command               State   Ports
--------------------------------------------------------------
root_nginx_1   /docker-entrypoint.sh ngin ...   Up      80/tcp
[root@vm ~]# docker-compose logs nginx		#查看日志
Attaching to root_nginx_1
nginx_1  | 2022/12/29 10:02:30 [notice] 1#1: start worker processes
[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  busybox:
    image: busybox
[root@vm ~]# docker-compose pull
Pulling busybox ... done
[root@vm ~]# docker images  busybox
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              827365c7baf1        6 days ago          4.86MB 

build、context、 Dockerfile

基于dockerfile,在使用up启动的时候会自动执行构建任务,可以指定dockerfile所在的文件夹的路径,compose会将他自动构建这个镜像,让后使用这个镜像启动服务容器

[root@vm ~]# ls
docker-compose.yml  index.html  my-dockerfile
[root@vm ~]# cat index.html
test...
[root@vm ~]# cat my-dockerfile
FROM nginx
ADD  ./index.html  /usr/share/nginx/html
[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  nginx:
    build:			# 使用Dockerfile构建镜像
      context: /root/		#上下文路径,相对路径则是相对于compose文件路径
      dockerfile:  my-dockerfile	# 指定Dockerfile文件名,可以不指定

[root@vm ~]# docker ps
CONTAINER ID        IMAGE ...
3c293bb4d135        root_nginx   ...
[root@vm ~]# docker inspect 3c293bb4d135
[root@vm ~]# curl 172.22.0.2
test...

command &entry point

entry point可以覆盖dockerfile中定义的entry point命令

version: '3'
services:
    httpd:
        build: ./
        entrypoint: 
            - echo
            - hello world

scale 扩容

[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  nginx:
    #container_name: my-nginx     #扩容的容器不能指定名字,  不能映射端口
    image: nginx
[root@vm ~]# docker-compose up -d
Creating network "root_default" with the default driver
Creating root_nginx_1 ... done
[root@vm ~]# docker ps
CONTAINER ID        IMAGE ...PORTS               NAMES
621edd2cf27c        nginx    80/tcp              root_nginx_1
[root@vm ~]# docker-compose scale  nginx=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting root_nginx_1 ... done
Creating root_nginx_2 ... done
[root@vm ~]# docker ps
CONTAINER ID        IMAGE  ... PORTS               NAMES
fe25cfa8162a        nginx  ... 80/tcp              root_nginx_2
3790c1d0b530        nginx  ... 80/tcp              root_nginx_1

environment env_file

[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  nginx:
    environment:
      myname: mynginx
    build:
      context: /root/
      dockerfile:  my-dockerfile
[root@vm ~]# docker-compose up  -d
[root@vm ~]# docker-compose run nginx env | grep myname
myname=mynginx
env_file:
  - db.env

logging 定义服务日志

logging:
  driver: syslog # or "json-file" or "none"
  options:
    syslog-address: "tcp://127.0.0.1"
    max-size: "200k"
    max-file: "10"

ports

将容器端口映射到宿主机上

ports:
    - "8080:80"
    - "127.0.0.1:8080:80"

expose

与dockerfile中的expose一样,是用来暴露指定的端口号

[root@vm ~]# cat docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx
    ports:
      - "80:80"
depends_on  #用于表述服务之间的依赖关系
container_name		#相当于docker run --name
env_file   #添加环境变量文件
environment		#添加环境变量
replicas


deploy

replicas 指定副本数;
version: 3
services:
  worker:
    image: nginx:latest
    deploy:
      replicas: 2
restart_policy
services:
  redis:
    image: redis:latest
    deploy:
      restart_policy:
        condition: on-failure   	#重启条件:on-failure, none, any
        delay: 5s   	# 等待多长时间尝试重启
        max_attempts: 3 	#尝试的次数
        window: 120s    	# 在决定重启是否成功之前等待多长时间
update_config

定义更新服务的方式,常用于滚动更新;

version: '3.4'
services:
  vote:
    image: docker-compose-demo
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2  # 一次更新2个容器
        delay: 10s  # 开始下一组更新之前,等待的时间
        failure_action:pause  # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause
        max_failure_ratio: 20 # 在更新过程中容忍的失败率
        order: stop-first   # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项
resources
version: '3.4'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        #限制CPU的使用率为50%内存50M
        limits:
          cpus: '0.50'
          memory: 50M
        #始终保持25%的使用率内存20M
        reservations:
          cpus: '0.25'
          memory: 20M
healthcheck 健康检查
healthcheck:
  test: ["java", "-jar", "healthcheck.jar"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

样例模板解释

version: "3"  		# 指定docker-compose语法版本
services:    		# 从以下定义服务配置列表
  server_name:   	# 可将server_name替换为自定义的名字
    container_name: container_name  	# 指定实例化后的容器名
    image: nginx:latest # 指定使用的镜像名及标签
    build:  # 如果没有现成的镜像,需要自己构建使用这个选项
      context: /opt/Dockerfile  # 指定构建镜像文件的路径
      dockerfile: ....     # 指定Dockerfile文件名,上一条指定,这一条就不要了
    ports:
      - "00:00"  # 容器内的映射端口,本地端口:容器内端口,可指定多个
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock   #直接映射
      - test1:/xx/xx  # 这里使用managed volume的方法,将容器内的目录映射到物理机,方便管理
      - test2:/xx/xx  # 前者是volumes目录下的名字,后者是容器内目录
      - test3:/xx/xx  # 在文件的最后还要使用volumes指定这几个tests
    volumes_from:  # 指定卷容器
       - volume_container_name  # 卷容器名
    restarts: always  # 设置无论遇到什么错,重启容器
    depends_on:       # 用来解决依赖关系,如这个服务的启动,必须在哪个服务启动之后
      - server_name   # 这个是名字其他服务在这个文件中的server_name
      - server_name1  # 按照先后顺序启动
    links:  # 与depend_on相对应,上面控制容器启动,这个控制容器连接
      - mysql  # 值可以是- 服务名,比较复杂,可以在该服务中使用links中mysql代替这个mysql的ip
    networks: # 加入指定的网络,与之前的添加网卡名类似
      - my_net  # bridge类型的网卡名
      - myapp_net # 如果没有网卡会被创建,建议使用时先创建号,在指定
    environment: # 定义变量,类似dockerfile中的ENV
      - TZ=Asia/Shanghai  # 这里设置容器的时区为亚洲上海
      变量值: 变量名   # 这些变量将会被直接写到镜像中的/etc/profile
    command: [                        #使用 command 可以覆盖容器启动后默认执行的命令
            '--character-set-server=utf8mb4',            #设置数据库表的数据集
            '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
            '--default-time-zone=+8:00'                    #设置mysql数据库的 
    ]
    
  server_name2:  # 开始第二个容器
    server_name:
      stdin_open: true # 类似于docker run -d
      tty: true  # 类似于docker run -t
      
volumes:   # 以上每个服务中挂载映射的目录都在这里写入一次,也叫作声明volume
  test1:
  test2:
  test3:
networks:  # 如果要指定ip网段,还是创建好在使用即可,声明networks
  my_net:
    driver: bridge  # 指定网卡类型
  myapp_net:
    driver: bridge 

dockercompose配置zk集群

version: '3'
services:
  zoo1:
    image: zookeeper
    hostname: zoo1
    container_name: zoo1
    privileged: true
    ports:		# 配置docker container和宿主机的端口映射
      - "2181:2181"
      - "8081:8080"
    environment:		 # 配置docker container的环境变量
      TZ: Asia/Shanghai
      ZOO_MY_ID: 1		# 当前zk实例的id
      # 整个zk集群的机器、端口列表
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ZOO_TICK_TIME: 20000	#超时时间
      4lw.commands.whitelist: *
    volumes:
      - ./zk1/data:/data			#数据挂载
      - ./zk1/datalog:/datalog

  zoo2:
    image: zookeeper
    hostname: zoo2
    container_name: zoo2
    privileged: true
    ports:
      - "2182:2181"
      - "8082:8080"
    environment:
      TZ: Asia/Shanghai
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ZOO_TICK_TIME: 20000
      4lw.commands.whitelist: *
    volumes:
      - ./zk2/data:/data
      - ./zk2/datalog:/datalog

  zoo3:
    image: zookeeper
    hostname: zoo3
    container_name: zoo3
    privileged: true
    ports:
      - "2183:2181"
      - "8083:8080"
    environment:
      TZ: Asia/Shanghai
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
      ZOO_TICK_TIME: 20000
      4lw.commands.whitelist: *
    volumes:
      - ./zk3/data:/data
      - ./zk3/datalog:/datalog
[root@vm zk]# docker exec -it zoo1 bash
root@zoo1:/apache-zookeeper-3.8.0-bin# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

Apollo配置中心了解

https://github.com/apolloconfig/apollo-quick-start 体验安装

[root@vm ~]# cat apollo-quick-start-master/docker-compose.yml
version: '3'

services:
  apollo-quick-start:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-quick-start
    depends_on:
      - apollo-db
        #condition: service_healthy
    ports:
      - "8080:8080"
      - "8070:8070"
      - "8090:8090"
    links:
      - apollo-db
    #environment:
      #JAVA_OPTS: '-Xms100m -Xmx1000m -Xmn100m -Xss256k -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=250m'
      #APOLLO_CONFIG_DB_USERNAME: 'root'
      #APOLLO_CONFIG_DB_PASSWORD: 'apollo'
      #APOLLO_PORTAL_DB_USERNAME: 'root'
      #APOLLO_PORTAL_DB_PASSWORD: 'apollo'

  apollo-db:
    image: "mysql:8.0"
    container_name: apollo-db
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      #MYSQL_ROOT_PASSWORD: 'apollo'
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 5s
      timeout: 1s
      retries: 10
    depends_on:
      - apollo-dbdata
    ports:
      - "13306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    #volumes_from:

      - apollo-dbdata

  apollo-dbdata:
    image: alpine:latest
    container_name: apollo-dbdata
    volumes:
      - /var/lib/mysql
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值