赞
踩
编排技术分类:
1、应用编排
单机:shell/Python脚本
多机/集群:ansible 、saltstack 、pubbet
2、(docker)容器编排
单机:docker-compose
多机/集群:docker swarm 、kubernetes
在前面学习的docker我们操作的都是单个容器,Dockerfile build 手动操作。
在微服务情况下,100个微服务!如果使用一个 一个的手动操作也是非常麻烦的。
因此 Docker Compose 来轻松高效的管理容器,定义运行多个容器!
Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。
docker-compose分三层:project,service,container
project:代表多个service组成的项目,默认是用工作目录的名称作为project的工程名称
service:一个 service 可以包含一个或多个容器,在里面可以定义网络模式端口镜像数据卷等参数
container:可以直接由一个已存在的镜像运行实现,也可以通过dockerfile构建镜像实现
官网网址:https://docs.docker.com/compose/overview/
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。借助 Compose,可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表。
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
使用 Compose 基本上是一个三步过程:
使用 定义您的应用程序的环境,Dockerfile以便它可以在任何地方复制。
定义组成的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
运行docker compose up和 Docker compose command 命令启动并运行你的整个应用程序。也可以docker-compose up使用docker-compose 二进制文件运行。
对于Docker Compose的理解就是把多个容器编排到一个文件中。
Docker
DockerFile
Docker Compose
#下载 curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 10.3M 100 10.3M 0 0 42280 0 0:04:17 0:04:17 --:--:-- 149k # 若是github访问太慢,可以用daocloud下载 sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose root@iuwza-an:[2022-07-27 11:06:45]$/usr/local/bin ls docker-compose #安装 chmod +x /usr/local/bin/docker-compose root@iuwza-an:[2022-07-27 11:08:45]$/usr/local/bin docker-compose --version docker-compose version 1.21.1, build 5a3f1a3 #Docker-compose卸载 rm /usr/local/bin/docker-compose #注意: 如果出现了"Permission denied"的错误,那可能是你没有适当的权限去删除docker-compose。你可以在前面加上sudo来删除。
YAML文件格式
YAML格式的注意事项
数据结构
对象: 键值对的字典 animal: pets 数组: 一组按次序排列的列表 - cat - dog - goldfish 布尔值 debug: "true" debug: "false" #Yaml示例 languages: #序列的映射 - Java - Golang - Python websites: #映射的映射 Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #或者 languages: ["Java","Golong","Python"] websites: Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #Json格式 { languages: [ 'Java', 'Golong', 'Python', ], websites: [ Baidu: 'www.baidu.com', Wangyi: 'www.163.com', Souhu: 'www.souhu.com', ] }
字段 | 描述 |
---|---|
build | 指定Dockerfile文件名(要指定的Dockerfile文件需要在build标签的子级标签中用dockerfile标签指定) |
dockerfile | 构建镜像上下文路径 |
context | 可以是dockerfile路径,或者是执行git 仓库的url地址 |
image | 指定镜像(已存在) |
command | 执行命令,会覆盖容器启动后默认执行的命令(会覆盖Dockerfile的CMD指令) |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量 |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络,引用顶级networks下条目 |
network-mode | 设置容器的网络模式 |
ports | 暴露容器端口,与-p 相同,但是端口不能低于60 |
volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级volumes 定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,(仅版本‘2’支持) |
hostname | 容器主机名 |
sysctls | 在容器内设置内核参数 |
links | 连接到另一个容器,- 服务名称[ : ] |
privileged | 用来给容器root权限,注意是不安全的,true|false |
restart | 重启策略,定义是否重启容器; 1.no,默认策略,在容器退出时不重启容器。 2.on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 3.on-failure:3,在容器非正常退出时重启容器,最多重启3次。 4.always,在容器退出时总是重启容器。 5.unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。 |
depends_on | 此标签用于解决容器的依赖,启动先后问题。如启动应用容器,需要先启动数据库容器php: depends_on: - apache - mysql |
字段 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示正在运行的容器进程 |
logs | 查看服务容器的输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
docker-compose常用命令 docker-compose命令格式 docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] 命令选项如下: -f,–file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。 -p,–project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。 -x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9+版本) -x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本) -verbose输出更多调试信息 -v,–version打印版本并退出 -------------- docker-compose up docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...] 选项包括: -d 在后台运行服务容器 –no-color 不使用颜色来区分不同的服务的控制输出 –no-deps 不启动服务所链接的容器 –force-recreate 强制重新创建容器,不能与–no-recreate同时使用 –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用 –no-build 不自动构建缺失的服务镜像 –build 在启动容器前构建服务镜像 –abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用 -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒) –remove-orphans 删除服务中没有在compose文件中定义的容器 –scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数 # 启动所有服务 docker-compose up # 在后台所有启动服务 docker-compose up -d # -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。 docker-compose -f docker-compose.yml up -d ---------------- 其他常用命令 # 列出项目中目前的所有容器 docker-compose ps [options] [SERVICE...] docker-compose ps # 停止正在运行的容器,可以通过docker-compose start 再次启动 docker-compose stop [options] [SERVICE...] 选项包括: -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒) # 查看帮助 docker-compose -h # 停止和删除容器、网络、卷、镜像 docker-compose down [options] 选项包括: –rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像 -v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷 –remove-orphans,删除服务中没有在compose中定义的容器 # 示例 docker-compose down 停用移除所有容器以及网络相关 # 查看服务容器的日志输出 docker-compose logs [options] [SERVICE...] 查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。 docker-compose logs -f #全屏滚到底部并继续持续输出日志(相当于 tail -f) docker-compose logs -f -t #全屏滚到底部并继续持续输出日志并显示时间戳 docker-compose logs -f -t --tail=10 #全屏滚到底部显示最后N行并继续持续输出日志并显示时间戳 # 构建(重新构建)项目中的服务容器。 docker-compose build [options] [--build-arg key=val...] [SERVICE...] 选项包括: –compress 通过gzip压缩构建上下环境 –force-rm 删除构建过程中的临时容器 –no-cache 构建镜像过程中不使用缓存 –pull 始终尝试通过拉取操作来获取更新版本的镜像 -m, –memory MEM为构建的容器设置内存大小 –build-arg key=val为服务设置build-time变量 服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务 # 拉取服务依赖的镜像。 docker-compose pull [options] [SERVICE...] 选项包括: –ignore-pull-failures,忽略拉取镜像过程中的错误 –parallel,多个镜像同时拉取 –quiet,拉取镜像过程中不打印进度信息 # 重启项目中的服务。 docker-compose restart [options] [SERVICE...] 选项包括: -t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒) # 删除所有(停止状态的)服务容器。 docker-compose rm [options] [SERVICE...] 选项包括: –f, –force,强制直接删除,包括非停止状态的容器 -v,删除容器所挂载的数据卷 # 示例 docker-compose rm 删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。 # 启动已经存在的服务容器。 docker-compose start [SERVICE...] docker-compose start # 在指定容器上执行一个ping命令 docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] # 示例 在指定服务上执行一个命令。 docker-compose run ubuntu ping www.baidu.com # 设置指定服务运行的容器个数 docker-compose scale web=3 db=2 设置指定服务运行的容器个数。通过service=num的参数来设置数量 # 强制停止服务容器 docker-compose kill [options] [SERVICE...] 通过发送SIGKILL信号来强制停止服务容器。 支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号: docker-compose kill -s SIGINT # 验证并查看compose文件配置。 docker-compose config [options] 选项包括: –resolve-image-digests 将镜像标签标记为摘要 -q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息 –services 打印服务名,一行一个 –volumes 打印数据卷名,一行一个 # 为服务创建容器。 docker-compose create [options] [SERVICE...] 选项包括: –force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数 –no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数 –no-build:不创建镜像,即使缺失 –build:创建容器前,生成镜像 # 运行指令 docker-compose exec [options] SERVICE COMMAND [ARGS...] 选项包括: -d 分离模式,后台运行命令。 –privileged 获取特权。 –user USER 指定运行的用户。 -T 禁用分配TTY,默认docker-compose exec分配TTY。 –index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务 # 例如: docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器 # 显示某个容器端口所映射的公共端口。 docker-compose port [options] SERVICE PRIVATE_PORT 选项包括: –protocol=proto,指定端口协议,TCP(默认值)或者UDP –index=index,如果服务存在多个容器,指定命令对象容器的序号(默认为1) # 推送服务依赖的镜像。 docker-compose push [options] [SERVICE...] 选项包括: –ignore-push-failures 忽略推送镜像过程中的错误 # 显示各个容器运行的进程情况。 docker-compose stop [options] [SERVICE...] # 恢复处于暂停状态中的服务。 docker-compose unpause [SERVICE...] # 打印版本信息 docker-compose version # 启动全部容器 docker-compose up -d # 启动指定容器 docker-compose up -d 服务名(如mysql) # 停止容器 docker-compose stop 容器ID # 删除容器(删除前必须关闭容器,执行stop) docker-compose rm nginx # 启动被停止的容器 docker-compose start 容器ID # 更新容器 docker-commpose up -d --build # 停止所有容器并清除 docker-compose down # 重启nignx容器 docker-compose restart nginx
具体每个参数参考官方文档
官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
## 主要是分为 3层. 版本--》服务--〉其他配置/ version: "" ## 版本 services: ## 服务 服务1: ## web build: ... image: networks: volumes ... 服务2: ## redis ... ## 其他配置 网络/卷,全局规则 volumes: network: configs: #案例 version: "3.9" ## 版本 services: ## 服务 web: build: . depends_on: ##依赖。先执行 db redis - db - redis redis: image: redis db: image: postgres
[image] #image 是指定服务的镜像名称或镜像ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Compose会尝试去拉取镜像。如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。 image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd [build] #服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。 build: /path/to/build/dir # 也可以是相对路径,只要上下文确定就可以读取到Dockerfile。 build: ./dir # 设定上下文根目录,然后以该目录为准指定Dockerfile。另外还可以指定args参数 build: context: ../ dockerfile: path/of/Dockerfile args: buildno: 1 #build是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。 # 由./dir构建的名为webapp和标记为tag的镜像。 build: ./dir image: webapp:tag [context] #包含Dockerfile文件的目录路径,或者是git仓库的URL。 当提供的值是相对路径时,它被解释为相对于当前compose文件的位置。 该目录也是发送到Docker守护程序构建镜像的上下文。 build: context: ./dir #使用dockerfile文件来构建,必须指定构建路径。 build: context: . dockerfile: Dockerfile-alternate [args] #添加构建镜像的参数,环境变量只能在构建过程中访问。 #首先,在Dockerfile中指定要使用的参数: ARG buildno ARG password RUN echo "Build number: $buildno" RUN script-requiring-password.sh "$password" #然后在args键下指定参数。 你可以传递映射或列表: build: context: . args: buildno: 1 password: secret build: context: . args: - buildno=1 - password=secret #注:注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。 [commond] #使用command可以覆盖容器启动后默认执行的命令 command: bundle exec thin -p 3000 #该命令也可以是一个类似于dockerfile的列表: command: ["bundle", "exec", "thin", "-p", "3000"] [container_name] #Compose的容器生成的默认名称格式是:<项目名称><服务名称><序号>,可以自定义项目名称、服务名称,但如果想自定义容器名称,可以使用标签指定:container_name: my-web-container;由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。 container_name: my-web-container [volumes] #挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。数据卷的格式可以是下面多种形式: volumes: // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。 - /var/lib/mysql // 使用绝对路径挂载数据卷 - /opt/data:/var/lib/mysql // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./cache:/tmp/cache // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。 - ~/configs:/etc/configs/:ro // 已经存在的命名的数据卷。 - datavolume:/var/lib/mysql #如果要跨多个服务并重用挂载卷,请在顶级volumes关键字中命名挂在卷,但是并不强制,如下的示例亦有重用挂载卷的功能,但是不提倡。 version: "3" services: web1: build: ./web/ volumes: - ../code:/opt/web/code web2: build: ./web/ volumes: - ../code:/opt/web/code #注意:通过顶级volumes定义一个挂载卷,并从每个服务的卷列表中引用它, 这会替换早期版本的Compose文件格式中volumes_from。 version: "3" services: db: image: db volumes: - data-volume:/var/lib/db backup: image: backup-service volumes: - data-volume:/var/lib/backup/data volumes: data-volume: [volumes_from] #从另一个服务或容器挂载其数据卷: volumes_from: - service_name - container_name [depends_on] #在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres #YAML文件定义的容器会先启动redis和db两个服务,最后才启动web 服务。 [PID] #将PID模式设置为主机PID模式。 这就打开了容器与主机操作系统之间的共享PID地址空间。 使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。即打开该选项的容器可以相互通过进程 ID 来访问和操作。 pid: "host" [ports] #ports用于映射端口的标签。常用的简单格式:使用HOST:CONTAINER格式或者只是指定容器的端口(宿主机会随机映射端口)。 ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" #注:当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。 #在v3.2中ports的长格式的语法允许配置不能用短格式表示的附加字段。 长格式如下: ports: - target: 80 published: 8080 protocol: tcp mode: host target:容器内的端口 published:物理主机的端口 protocol:端口协议(tcp或udp) mode:host 和ingress 两种模式,host用于在每个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。 [restart] #no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。 如果退出代码指示出现故障错误,则on-failure将重新启动容器。 restart: "no" restart: always restart: on-failure restart: unless-stopped [environment] #添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。 只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。 environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET #注:如果服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。 将使用build的args子选项来定义构建时的环境变量 [expose] #暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数,如下所示: expose: - "3000" - "8000" [extra_hosts] #添加主机名的标签,会在/etc/hosts文件中添加一些记录。 extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229" 启动后查看容器内部hosts: 162.242.195.82 somehost 50.31.209.229 otherhost [dns] #配置 DNS 服务器。可以是一个值,也可以是一个列表。 dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9 [links] #链接到其它服务中的容器。使用服务名称(同时作为别名)或者“服务名称:服务别名”(如SERVICE:ALIAS),例如: links: - db - db:database - redis [net] #设置网络模式 net: "bridge" net: "none" net: "host"
--------------------------- #编写一个简单web应用服务案例 #新建一个webapp目录 mkdir -p /webapp/ vim docker-compose.yaml version: '2' services: web01: image: nginx ports: - "6061:80" container_name: "web01" networks: - dev web02: image: nginx ports: - "6062:80" container_name: "web02" networks: - dev - pro web03: image: nginx ports: - "6063:80" container_name: "web03" networks: - pro networks: dev: driver: bridge pro: driver: bridge #启动应用 docker-compose up -d docker-compose up -d Creating network "webapp_dev" with driver "bridge" #可以看到创建的网络名用当前的webapp目录+网络名来命名的 Creating network "webapp_pro" with driver "bridge" Pulling web01 (nginx:)... latest: Pulling from library/nginx a2abf6c4d29d: Pull complete a9edb18cadd1: Pull complete 589b7251471a: Pull complete 186b1aaa4aa6: Pull complete b4df32aa5a72: Pull complete a0bcbecc962e: Pull complete Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 Status: Downloaded newer image for nginx:latest Creating web01 ... done Creating web03 ... done Creating web02 ... done #看下是否启动正常 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e8c0f643ddf nginx "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 0.0.0.0:6063->80/tcp, :::6063->80/tcp web03 7cf64af6c275 nginx "/docker-entrypoint.…" 15 minutes ago Up 9 minutes 0.0.0.0:6062->80/tcp, :::6062->80/tcp web02 7325eda0f30c nginx "/docker-entrypoint.…" 15 minutes ago Up 9 minutes 0.0.0.0:6061->80/tcp, :::6061->80/tcp web01 #我们看看创建的网络 docker network ls NETWORK ID NAME DRIVER SCOPE a17bc80124f7 bridge bridge local d041dcd67efc host host local 1f436cb54593 mynet-lnmp bridge local 063368c3a877 none null local 1b7b744ebbf4 webapp_dev bridge local 0d69532ecab1 webapp_pro bridge local #测试访问都正常 curl localhost:6061 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
#前面我们使用Dockerfile来跑了一个LNMP,但是每次我们构建的时候需要一个个去构建如果在实际工作中微服务有几十个或上百个的话那会很麻烦,使用docker-compose可以大大的方便操作 #1、准备环境(基于二进制编译搭建) tree /lnmp/compose_lnmp/ /lnmp/compose_lnmp/ ├── docker-compose.yaml ├── mysql │ ├── Dockerfile │ ├── my.cnf │ └── mysql-boost-5.7.20.tar.gz ├── nginx │ ├── Dockerfile │ ├── nginx-1.12.2.tar.gz │ ├── nginx.conf │ └── wordpress-4.9.4-zh_CN.tar.gz └── php ├── Dockerfile ├── php-7.1.10.tar.gz ├── php-fpm.conf ├── php.ini └── www.conf ######nginx########## vim Dockerfile FROM centos:7 MAINTAINER this is nginx images <2952001366@qq.com> RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx ADD nginx-1.12.2.tar.gz /usr/local/src/ WORKDIR /usr/local/src/nginx-1.12.2 RUN ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module;make -j 2 && make install ENV PATH /usr/local/nginx/sbin:$PATH ADD nginx.conf /usr/local/nginx/conf/ ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html RUN chmod 777 -R /usr/local/nginx/html/ EXPOSE 80 VOLUME [ "/usr/local/sbin/nginx/html/" ] CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ] #nginx.conf配置文件 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; charset utf-8; location / { root html; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { root html; fastcgi_pass 106.13.0.30:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params; } } } ######mysql######### vim Dockerfile FROM centos:7 MAINTAINER this is mysql images <2952001366@qq.com> RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make;useradd -M -s /sbin/nologin mysql ADD mysql-boost-5.7.20.tar.gz /usr/local/src/ WORKDIR /usr/local/src/mysql-5.7.20/ RUN cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1;make -j 2;make install ADD my.cnf /etc/my.cnf EXPOSE 3306 RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf WORKDIR /usr/local/mysql/bin/ RUN ./mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data;cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/;systemctl enable mysqld ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH VOLUME [ "/usr/local/mysql" ] CMD ["/usr/sbin/init"] #my.cnf配置文件 [client] port = 3306 socket=/var/local/mysql/mysql.sock [mysqld] user = mysql basedir=/var/local/mysql datadir=/var/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /var/local/mysql/mysqld.pid socket=/var/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES #######php######### vim Dockerfile FROM centos:7 MAINTAINER this is php images <2952001366@qq.com> RUN yum install -y gd \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel \ gcc gcc-c++ make pcre-devel;useradd -M -s /sbin/nologin nginx ADD php-7.1.10.tar.gz /usr/local/src/ WORKDIR /usr/local/src/php-7.1.10 RUN ./configure \ --prefix=/usr/local/php \ --with-mysql-sock=/usr/local/mysql/mysql.sock \ --with-mysqli \ --with-zlib \ --with-curl \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-openssl \ --enable-fpm \ --enable-mbstring \ --enable-xml \ --enable-session \ --enable-ftp \ --enable-pdo \ --enable-tokenizer \ --enable-zip ; make -j 2 ; make install ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH ADD php.ini /usr/local/php/lib/ ADD php-fpm.conf /usr/local/php/etc/ ADD www.conf /usr/local/php/etc/php-fpm.d/ EXPOSE 9000 CMD /usr/local/php/sbin/php-fpm -F #php-fpm.conf [global] pid = run/php-fpm.pid include=/usr/local/php/etc/php-fpm.d/*.conf #php.ini [PHP] engine = On short_open_tag = Off precision = 14 output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off unserialize_callback_func = serialize_precision = -1 disable_functions = disable_classes = zend.enable_gc = On expose_php = On max_execution_time = 30 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL display_errors = On display_startup_errors = On log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = On html_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 8M auto_prepend_file = auto_append_file = default_mimetype = "text/html" default_charset = "UTF-8" doc_root = user_dir = enable_dl = Off file_uploads = On upload_max_filesize = 2M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [CLI Server] cli_server.color = On [Date] date.timezone = Asia/Shanghai [filter] [iconv] [intl] [sqlite3] [Pcre] [Pdo] [Pdo_mysql] pdo_mysql.cache_size = 2000 pdo_mysql.default_socket= [Phar] [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = On [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [Interbase] ibase.allow_persistent = 1 ibase.max_persistent = -1 ibase.max_links = -1 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" ibase.dateformat = "%Y-%m-%d" ibase.timeformat = "%H:%M:%S" [MySQLi] mysqli.max_persistent = -1 mysqli.allow_persistent = On mysqli.max_links = -1 mysqli.cache_size = 2000 mysqli.default_port = 3306 mysqli.default_socket = /usr/local/mysql/mysql.sock mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mysqlnd] mysqlnd.collect_statistics = On mysqlnd.collect_memory_statistics = On [OCI8] [PostgreSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [bcmath] bcmath.scale = 0 [browscap] [Session] session.save_handler = files session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_length = 26 session.trans_sid_tags = "a=href,area=href,frame=src,form=" session.sid_bits_per_character = 5 [Assertion] zend.assertions = 1 [COM] [mbstring] [gd] [exif] [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 soap.wsdl_cache_limit = 5 [sysvshm] [ldap] ldap.max_links = -1 [mcrypt] [dba] [opcache] [curl] [openssl] #www.conf [www] user = nginx group = nginx listen = 106.13.0.30:9000 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
#准备好所需的dockerfile和相关配置文件之后我们来编写docker-compose version: '2' services: nginx: hostname: nginx build: context: /lnmp/compose_lnmp/nginx/ dockerfile: Dockerfile ports: - 1515:80 - 1616:443 container_name: nginx_server networks: mynet-lnmp: ipv4_address: 106.13.0.10 mysql: hostname: mysql build: context: /lnmp/compose_lnmp/mysql/ dockerfile: Dockerfile ports: - 3306:3306 container_name: mysql_server networks: mynet-lnmp: ipv4_address: 106.13.0.20 php: hostname: php build: context: /lnmp/compose_lnmp/php/ dockerfile: Dockerfile ports: - 9000:9000 container_name: php_server networks: mynet-lnmp: ipv4_address: 106.13.0.30 networks: mynet-lnmp: driver: bridge ipam: config: - subnet: 106.13.0.0/16 #当前的目录结构为 tree /lnmp/compose_lnmp/ /lnmp/compose_lnmp/ ├── docker-compose.yaml ├── mysql │ ├── Dockerfile │ ├── my.cnf │ └── mysql-boost-5.7.20.tar.gz ├── nginx │ ├── Dockerfile │ ├── nginx-1.12.2.tar.gz │ ├── nginx.conf │ └── wordpress-4.9.4-zh_CN.tar.gz └── php ├── Dockerfile ├── php-7.1.10.tar.gz ├── php-fpm.conf ├── php.ini └── www.conf #编写好compose之后我们进入/lnmp/compose_lnmp/ 目录 cd /lnmp/compose_lnmp/ #执行命令 docker-compose -f docker-compose.yaml up -d #选项解释: # -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。 # 在后台所有启动服务 docker-compose up -d ######################################### #看一下是否启动正常 [root@IUwza compose_lnmp]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aaf39f5f44da compose_lnmp_mysql "/usr/sbin/init" 52 minutes ago Up 52 minutes 3306/tcp mysql_server 3aec54317da3 compose_lnmp_nginx "/usr/local/nginx/sb…" 56 minutes ago Up 56 minutes 0.0.0.0:1515->80/tcp, :::1515->80/tcp, 0.0.0.0:1616->443/tcp, :::1616->443/tcp nginx_server fd932ec02fc4 compose_lnmp_php "/bin/sh -c '/usr/lo…" 56 minutes ago Up 56 minutes 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php_server #看一下创建的网络 [root@IUwza compose_lnmp]# docker network ls NETWORK ID NAME DRIVER SCOPE 8554e19cef4e bridge bridge local #可以看到生成网络名称的是目录名+定义的网络名 3c7f094190bf compose_lnmp_mynet-lnmp bridge local 6d8a1d1a871d host host local 403da76603fb none null local #进入mysql容器登录mysql进行创建wordpress库和授权 [root@IUwza ~]# docker exec -it mysql_server bash [root@aaf39f5f44da bin]# mysql -uroot -p mysql: [Warning] World-writable config file '/etc/my.cnf' is ignored. Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.20 Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> create database wordpress; Query OK, 1 row affected (0.00 sec) mysql> grant all privileges on wordpress.* to 'root'@'%' identified by 'an123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> grant all privileges on *.* to 'root'@'%' identified by 'an123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) #因为进来还是以空密码进入,所以改下密码 mysql> alter user root@'localhost' identified by 'an123456'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec) mysql> exit Bye [root@f749710a40d5 bin]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 5.7.20 Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ###创建好了之后访问测试看效果 http://ip/wordpress/index.php
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。