Docker-compose 编排

osc_08351jos 2020-11-11 14:12:53
Docker Compose


Docker-compose 编排

 Docker-compose 编排
#------------------------------ 一: Docker网络通讯
#Docker单主机网络通信四种
安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、none.host
1.host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
2.Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
3.None:该模式关闭了容器的网络功能。
以上都是不用动手的,真正需要配置的是自定义网络。
4.Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个dockerO虚拟网桥,通过docker心网桥以及lptables nat表配置与宿主机通信。
#Docker跨主机容器通信
1)基于隧道的overlay网络**:按隧道类型来说,不同的公司或者组织有不同的实现方案。\
docker原生的overlay网络就是基于vxlan隧道实现的。ovn则需要通过geneve或者stt隧道来实现的\
flannel最新版本也开始默认基于vxlan实现overlay网络。
2)基于包封装的overlay网络**:基于UDP封装等数据包包装方式,在docker集群上实现跨主机网络。\
典型实现方案有**Weave、Flannel**的早期版本.
3)基于三层实现SDN网络**:基于三层协议和路由,直接在三层上实现跨主机网络,并且通过iptables实现网络的安全隔离。\
典型的方案为 **Calico。同时对不支持三层路由的环境,Calico还提供了基于IPIP封装的跨主机网络实现
#自定义网络固定ip
1.先创建网桥
docker network create --subnet=172.10.0.0/24 li-network
2.再基于网桥分配容器固定ip
docker run -itd --name test --net li-network --ip 172.10.0.10 centos:7 /bin/bash
#直接桥接到会docker0分配固定地址会报错
docker run -itd --name test --net li-network --ip 172.17.0.10 centos:7 /bin/bash
"默认网桥172.17.0.10"
#------------------------------- 二: Docker-compose 编排
YAML是一种标记语言很直观的数据序列化格式,非常适合用来表达或者编辑数据结构、各种配置文件、文件大纲等,例如:许多电子邮件标题格式和YAML非常接近
#Docker Compose配置常用字段
| 字段 | 描述 |
| ------------------------ | ------------------------------------------------------------ |
| build dockerfile context | 指定Dockerfile文件名构建镜像上下文路径 |
| image | 指定镜像 |
| command | 执行命令,覆盖默认命令 |
| container name | 指定容器名称,由于容器名称是唯一的,如果指定 自定义名称,则无法scale |
| deploy | 指定部署和运行服务相关配置,只能在swarm模式适用 |
| environment | 添加环境变量 |
| networks | 加入网络 |
| ports | 暴露容器端口,与-p相同,但端口不能低于60 |
| volumes | 挂载宿主机路径或命令卷 |
| restart | 重启策略,默认no,always,no-failure,unless-stoped |
| hostname | 容器主机名 |
#Docker Compose常用命令
–verbose:输出更多调试信息
–version:打印版本并退出
-f、–file FILE:使用特定的compose末班文件,默认为docker-compose.yml
-p、–project-name NAME:指定项目名称,默认使用目录名称

| 字段 | 解释 |
| ------------------ | ---------------------------- |
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行命令 |
| scale | 指定一个服务容器启动数量 |
| top | 显示容器进程 |
| logs | 查看容器输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |

文件格式以及编写注意事项
- 1、不支持制表符tab键缩进,需要使用空格缩进,使用缩进表示层级关系
- 2、通常开头缩进2个空格,缩进的空格数不重要,只要相同层级的元素左对齐即可
- 3、字符后缩进一个空格,如冒号、逗号、横杆(-)
- 4、用`#`号注释
- 5、如果包含特殊字符用单引号引起来
- 6、布尔值必须用引号括起来
- 7、compose版本号、服务标识符必须顶格写
- 8、属性名与属性值以`:`(冒号加空格)分隔开
- 9、层级使用两个空格表示
- 10、服务属性使用`-`(空格空格-空格)表示
#compose使用的三个步骤
1、使用Dockerfile定义应用程序的环境
2、使用docker-compose.yml定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
3、最后执行docker-compose up命令来启动并运行整个应用程序
version: '2' '//compose版本号'
services: '//服务标识符'
web: '//子服务名'
image: dockercloud/hello-world '//服务依赖镜像属性'
ports: '//服务端口属性'
- 8080
networks: '//网络服务属性'
- front-tier
- back-tier
redis:
image: redis
links: '//容器间的连接设置'
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes: '//挂载一个目录或者一个已存在的数据卷容器'
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
############示例
1、部署Docker-Compose环境
yum install -y docker-ce
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose '//在Linux上我们可以从GitHub上下载它的二进制包来使用,此命令是下载Docker Compose的当前稳定版本'
chmod +x /usr/local/bin/docker-compose
docker-compose -v
#或者上传文件
cp -p docker-compose /usr/local/bin
#//就是一个工具,直接添加到/usr/local/bin/ 当成工具来用
2、使用Dockerfile定义应用程序的环境
mkdir -r /root/compose_nginx/nginx
cd /root/compose_nginx/nginx
cat > Dockerfile<<EOF
FROM centos:7
MAINTAINER this is kgc-nginx image <li>
RUN yum -y update
RUN yum install pcre pcre-devel zlib-devel gcc gcc-c++ make -y
RUN useradd -s /sbin/nologin nginx -M
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN ln -s /usr/local/nginx-1.12.0/sbin/ /usr/local/bin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
EOF
cat > run.sh<<EOF
#!/bin/bash
/usr/local/nginx/sbin/nginx
EOF
ls
#Dockerfile nginx-1.12.0.tar.gz run.sh
3、使用docker-compose.yml定义构成应用程序的服务
cat > docker-compose.yml<<EOF
version: '3'
services: "服务"
nginx: "nginx服务"
hostname: nginx
build: "创建镜像"
context: ./nginx
dockerfile: Dockerfile
ports: "端口映射"
- 1216:80
- 1217:443
networks: "网络"
- li
volumes: "共享宿主机目录"
- ./wwwroot:/usr/local/nginx/html
networks:
li:
EOF
tree
.
├── docker-compose.yml
└── nginx
├── Dockerfile
├── nginx-1.12.0.tar.gz
└── run.sh
4、执行docker-compose up命令来启动并运行整个应用程序
docker-compose -f docker-compose.yml up -d "用编排文件创建容器,并启动"
tree
.
├── docker-compose.yml
├── nginx
   ├── Dockerfile
   ├── nginx-1.12.0.tar.gz
   └── run.sh
└── wwwroot
"自动创建了wwwroot"
[root@docker02 wwwroot]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82ec65e396ff compose_nginx_nginx "/run.sh" 13 minutes ago Up 13 minutes 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
f94496351d49 centos:7 "/bin/bash" 50 minutes ago Up 50 minutes test
[root@docker02 wwwroot]# vim index.html
<h1>this is test web</h1>
[root@docker02 ~]# curl http://192.168.100.190:1216
<h1>this is test web</h1>
#--------------------------------------三:创建多个服务 Nginx和Tomcat
cat > docker-compose.yml<<EOF
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
- li
volumes:
- ./wwwroot:/usr/local/nginx/html
tomcat:
hostname: tomcat
build:
context: ./tomcat
dockerfile: Dockerfile
ports:
- 1200:8080
networks:
- li
volumes:
- ./tomcat/webapps:/usr/local/tomcat/webapps/ROOT
- ./tomcat/logs:/usr/local/tomcat/logs
networks:
li:
li:
EOF
networks: 两个服务可以写一样
两个服务可以写在同一个services下
[root@docker02 webapps]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("Welcome Tomcat 01");%>
</body>
</html>
tomcat 也支持html格式
<h1>this is tomcat web</h1>
[root@docker02 webapps]# ls
index.html index.jsp
[root@docker02 tomcat]# ls
apache-tomcat-9.0.16.tar.gz Dockerfile jdk-8u201-linux-x64.rpm logs webapps
[root@docker02 tomcat]# cat Dockerfile
FROM centos:7
MAINTAINER this is tomcat <li>
ADD jdk-8u201-linux-x64.rpm /usr/local
WORKDIR /usr/local
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64
ENV CLASSPATH /lib/tools.jar:/lib/dt.jar
ENV PATH /bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@docker02 nginx]# ls
Dockerfile nginx-1.12.0.tar.gz run.sh
[root@docker02 nginx]# cat run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@docker02 nginx]# cat Dockerfile
FROM centos:7
MAINTAINER this is kgc-nginx image <li>
RUN yum -y update
RUN yum install pcre pcre-devel zlib-devel gcc gcc-c++ make -y
RUN useradd -s /sbin/nologin nginx -M
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN ln -s /usr/local/nginx-1.12.0/sbin/ /usr/local/bin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@docker02 compose_nginx]# ls
docker-compose.yml nginx tomcat wwwroot
#编排容器
docker-compose -f docker-compose.yml up -d
版权声明
本文为[osc_08351jos]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4310950/blog/4712844

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云