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