简介:Compose是用于定义和运行多容器Docker应用程序的工具,通过Compose,使用yml文件来配置应用程序所需要的所有服务,对多服务应用进行统一部署。
0. 容器内问题排查命令
先进入容器:docker exec -it container-id sh/bash;
A. 测试网络是否互通:ping ip;
B. 测试容器端口是否开通:nc -zv ip port;
1、安装与卸载
A. 下载docker-compose工具;
x86_64: curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
aarch64:curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose,以下版本都不支持arm架构
B. 设置docker-compose可执行文件权限:chmod +x /usr/local/bin/docker-compose;
C. 测试是否安装成功:docker-compose --version;
D. 卸载:rm /usr/local/bin/docker-compose。
2、三个步骤
A. 使用Dockerfile定义应用程序的环境,为每个服务构建需要的镜像;
B. 使用docker-compose.yml定义构成应用程序的服务,他们在隔离环境中一起运行;
C. 执行docker-compose up命令来启动并运行整个应用程序,如:docker-compose -f file.yml up -d;
D. 停止或重启服务:docker-compose -f file.yml stop/restart。
3、docker-compose.yml配置文件
# 版本
version: '3'
# Network配置
networks:
# network名
my-net:
# 此网络是在compose之外建立的,docker-compose up不会创建它
external: true
my-host:
external: true
# 与主机共享host网路
name: host
# 全局挂载卷
volumes:
fdfs-data-1:
# 服务
services:
# 服务名
web:
# 镜像名:仓库/标签:版本
image: ruhuanxingyun.com:8701/fastdfs-nginx:latest
# 服务发布模式
deloy:
# global:每个集群每个服务实例启动一个容器,replicated:指定集群中实例的副本数量
mode: global
# 限制服务部署节点
placement:
constraints:
# docker node update --label-add role=标签名称 主机名
- node.labels.rabbitmq == true
restart_poicy:
# 容器启动后默认执行命令
command: tracker
# 端口信息(宿主机端口:容器内部端口)
ports:
# TCP端口映射
- "22122:22122"
# UDP端口映射
- "22123:22123/udp"
# 指定使用的虚拟网络
networks:
- my-net
cap_add:
- ALL
# 设置docker容器linux参数
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=1
# 设置最大打开文件数
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
# 挂载目录(宿主机目录:容器内部目录)
volumes:
- /etc/localtime:/etc/localtime
- /data/fastdfs:/etc/fdfs
# 环境变量
environment:
TRACKER_SERVER: fdfs-tracker:22122
GROUP_NAME: group
ports设置规则多样:
4. 重用配置
& <<:*的用法后续补充
B. 服务编排要想按照指定启动顺序的话,docker提供的depends_on或links,只能保证服务依赖也相应启动,但是无法保证启动成功后,再启动其他服务,目前比较好的就是wait-for-it.sh脚本实现;
5. 服务远程调试参数
-Xdebug -Xrunjdwp:transport=dt_socket,address=28080,suspend=n,server=y
6. 重启策略(restart_policy):restart_policy判断依据是进程退出(Container process exited)或内存溢出(killed by out of memory);
A. 参数condition的三种状态
none:要容器退出就重启容器;
on-failure:在容器非正常退出时(退出状态非0),才会重启容器;
any:默认策略,在容器退出时不重启容器;
B. docker容器的退出状态码
0:表示容器正常退出,例如 stop 容器;
非0:表示容器退出异常(退出状态码采用 chroot 标准),例如执行 docker run 失败后的容器退出;
125:Docker 守护进程本身有错误;
126:容器启动后,要执行的默认命令无法调用;
127:容器启动后,要执行的默认命令不存在;
其他状态码:容器启动后在容器内部执行命令,该命令退出时的返回状态码,就作为容器的退出状态码;
docker inspect container-id -f "{{.State.ExitCode}}";
7. docker多服务依赖关系
A. 比如Nacos服务启动依赖于MySQL正常启动,虽然version2中提供depends_on来解决依赖问题,但是容器启动后不代表容器里应用准备好了,所以需要通过额外的手段来判断,一种是写wait-for-it.sh脚本,另一种就是dockerize工具判断;
B. dockerize介绍如下图:
8. Portainer
htpasswd -nb -B admin "your-password" | cut -d ":" -f 2,另
B. 部署命令,注意$符号要转义,在每一个$前面再加一个$即可:
version: "3"
networks:
rhxy-network:
external: true
services:
portainer:
image: portainer/portainer
container_name: portainer
hostname: portainer
restart: always
command: --admin-password=$$1a$$05$$npdefc.1NzvQJL.gQ2whozusdf51TiaR0jk9fJa2YK2MS -H unix:///var/run/docker.sock
ports:
- 9000:9000
networks:
- rhxy-network
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /data/portainer/data:/data
environment:
TZ: Asia/Shanghai
9. 将docker容器里应用日志输出到控制台
A. Docker将容器日志存储在默认位置/var/lib/docker中,每个容器都有一个特定其ID的JSON日志,如:/var/lib/docker/containers/iu622030.../iu622030...-json.
log;
B. 一般应用程序都有自己的日志,比如nginx的access_log,如果想在portainer里查看其日志,需要将日志转到标准输出(STDOUT)或错误输出(STDERR)中,docker打镜像操作如下:
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
制作镜像时建立软连接,容器运行时,可将任何的自定义应用日志,转到标准输出和标准错误输出上,然后通过docker logs命令查看日志。