极客时间运维进阶训练营第三周作业----基于docker-compose实现对nginx+tomcat web服务的单机编排
docker-compose:
V1----python
V2----go
两个版本有些指令是不兼容的
docker-compose在逻辑上把容器分为三层
poject:工程,默认当前目录名
service:服务,通过服务名称管理容器
container:容器
docker-compose的github主页:https://github.com/docker/compose
下载好之后按个人习惯放到PATH里,加上x就可以使用了(用apt或者yum之类的方式安装也可以)
docker-compose相关文档:Compose file versions and upgrading | Docker Documentation
root@docker1:/home/z9999# docker-compose -h Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file \\指定compose file,不加该选项会自动读取当前目录的文件 (default: docker-compose.yml) \\docker-compose.yml docker-compose.yaml compose.yml compose.yaml -p, --project-name NAME Specify an alternate project name \\指定一个项目名称,不加该选项默认项目名称为ompose file所在目录名 (default: directory name) --profile NAME Specify a profile to enable \\ -c, --context NAME Specify a context name --verbose Show more output \\输出更详尽的信息 --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) \\指定记录日志级别 --ansi (never|always|auto) Control when to print ANSI control characters --no-ansi Do not print ANSI control characters (DEPRECATED) -v, --version Print version and exit \\显示compose版本 -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate --project-directory PATH Specify an alternate working directory \\指定project目录,默认为compose file所在目录 (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent (DEPRECATED) --env-file PATH Specify an alternate environment file Commands: build Build or rebuild services \\构建或重新构建服务 config Validate and view the Compose file \\检查compose file, -q 如果没有错误不会输出任何信息 create Create services down Stop and remove resources \\停止并删除资源(会把容器删除,慎用!) events Receive real time events from containers exec Execute a command in a running container \\类似于docker的exec,但不加-it help Get help on a command images List images \\列出docker-compose下载的镜像,和docker exec里现实的不一样 kill Kill containers \\杀死容器 logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers \\删除一个停止的容器 run Run a one-off command \\运行一个容器一次 scale Set number of containers for a service \\为一个服务器的容器设置容器数量,设置这个值后compose里不能写container name和port start Start services \\启动一个服务 stop Stop services \\停止一个服务 top Display the running processes unpause Unpause services up Create and start containers \\创建并启动一个容器 docker-compose up -d version Show version information and quit \\显示docker-compose版本
compose file:
root@docker1:/home/z9999/docker-compose-cases/case1-commands_options# cat docker-compose.yml version: '3.8' \\定义compose file版本 services: \\定义服务 nginx-server: \\定义服务名 image: nginx:1.22.0-alpine \\定义要使用的镜像 container_name: nginx-web1 \\定义荣启名称 expose: \\声明端口 - 80 - 443 ports: \\端口映射 - "80:80" - "443:443" #profiles: #基于配置文件指定要操作的目的容器 \\大概意思就是把容器打个标签,docker-compose的指令加profiles名的话会只对一部分容器操作 # - frontend env_file: \\传递环境变量到容器 - test.env deploy: \\ resources: #资源限制 limits: cpus: '0.50' memory: 1024M reservations: cpus: '0.5' memory: 512M restart: always healthcheck: #添加服务健康状态检查 test: ["CMD", "curl", "-f", "http://127.0.0.1:80/index.html"] \\在容器里会执行这个命令用于检测health状态 interval: 5s #健康状态检查的间隔时间,默认为30s timeout: 5s #单次检查的失败超时时间,默认为30s retries: 3 #连续失败次数默认3次,当连续失败retries次数后将容器置为unhealthy状态 start_period: 60s #60s后每间隔interval的时间检查一次,连续retries次后才将容器置为unhealthy状态, 但是start_period时间内检查成功就认为是检查成功并装容器置于healthy状态 redis-server: image: redis:6.2.7-alpine3.16 container_name: redis1 expose: - 6379 ports: - "6379:6379" #profiles: # - backend
让服务使用docker0
root@docker1:/home/z9999/docker-compose-cases/case1-commands_options# cat ../case2-use-default-network/docker-compose.yml version: '3.8' services: nginx-server: image: nginx:1.22.0-alpine container_name: nginx-web1 network_mode: bridge #网络1,使用docker安装后的默认网桥 expose: - 80 - 443 ports: - "80:80" - "443:443" networks: default: #使用docker的默认网络 external: #docker-compose 之外的网络,不需要docker-compsoe创建网络 name: bridge #自定义一个网络名称,用于被容器引用
自定义网络和磁盘挂载以及依赖关系
root@docker1:/home/z9999/docker-compose-cases/case1-commands_options# cat ../case3-custom-network/docker-compose.yml version: '3.8' services: nginx-server: image: nginx:1.22.0-alpine container_name: nginx-web1 # network_mode: bridge #网络1,使用docker安装后的默认网桥 expose: - 80 - 443 ports: - "80:80" - "443:443" networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡 - front - backend links: #依赖关系,容器运行起来后会自动在容器内把tomcat-server解析为tomcat-server的地址 - tomcat-server tomcat-server: #image: tomcat:7.0.93-alpine image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-myapp:v1 container_name: tomcat-app1 ##network_mode: bridge #网络1,使用docker安装后的默认网桥 #expose: # - 8080 #ports: # - "8080:8080" networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有一块网卡 - backend links: - mysql-server mysql-server: image: mysql:5.6.48 container_name: mysql-container # network_mode: bridge #网络1,使用docker安装后的默认网桥 volumes: - /data/mysql:/var/lib/mysql #- /etc/mysql/conf/my.cnf:/etc/my.cnf:ro environment: - "MYSQL_ROOT_PASSWORD=12345678" - "TZ=Asia/Shanghai" expose: - 3306 ports: - "3306:3306" networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有一块网卡 - backend networks: front: #自定义前端服务网络,需要docker-compose创建 driver: bridge backend: #自定义后端服务的网络,要docker-compose创建 driver: bridge default: #使用已经存在的docker0默认172.17.0.1/16的网络 external: name: bridge
基于docker-compose运行一个nginx+java的web服务
root@docker2:/home/z9999/compose-case# ls docker-compose.yml root@docker2:/home/z9999/compose-case# cat docker-compose.yml version: '3.8' services: nginx-server: image: harbor.liuzheng.net/server/nginx:20221108025818 container_name: nginx-server expose: - 80 - 443 ports: - "80:80" networks: - front - backend environment: - "TZ=Asia/Shanghai"
#volumes:
# - /home/z9999/compose-case/nginx.conf:/etc/nginx/nginx.conf:ro links: - tomcat-server deploy: resources: limits: cpus: '0.5' memory: 1024M restart: always healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:80/index.html"] interval: 5s timeout: 5s retries: 3 start_period: 60s tomcat-server: image: ashince/tomcat8 container_name: tomcat-server environment: - "TZ=Asia/Shanghai" networks: - backend
volumes:
#- /data/:/data
networks: front: driver: bridge backend: driver: bridge default: external: name: bridge
root@docker2:/home/z9999/compose-case# docker-compose down Stopping nginx-server ... done Stopping tomcat-server ... done Removing nginx-server ... done Removing tomcat-server ... done Removing network compose-case_backend Removing network compose-case_front root@docker2:/home/z9999/compose-case# docker-compose up -d Creating network "compose-case_backend" with driver "bridge" Creating network "compose-case_front" with driver "bridge" Creating tomcat-server ... done
Creating nginx-server ... done
root@docker2:/home/z9999/compose-case# docker network ls
NETWORK ID NAME DRIVER SCOPE
8c09e9963ebb bridge bridge local
d7de761b4c55 compose-case_backend bridge local \\这两个就是docker-compose创建的网络,名字是“项目名称_网络名称”
4a48b5851598 compose-case_front bridge local \\
72549205163a host host local
3ec290be5a76 none null local
\\只把nginx的80和443端口映射到了宿主机上,java和nginx是通过新建的backend网络通信的,通过links创建依赖关系,并在nginx容器中将tomcat-service解析为ip地址
root@docker2:/home/z9999/compose-case# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bfd127c37c5 harbor.liuzheng.net/server/nginx:20221108025818 "/usr/sbin/nginx -g …" 10 minutes ago Up 10 minutes (unhealthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp nginx-server
fb3e68f4a610 ashince/tomcat8 "catalina.sh run" 10 minutes ago Up 10 minutes 8080/tcp tomcat-server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构