【云源生】Docker-Compose快速入门及实践
文章目录
- 【云源生】Docker-Compose快速入门及实践
- **前言**
- **一、Dcoker Compose简介**
- 官网介绍
- Docker和DockerFile以及Docker Compose的区别
- 二、Docker Compose环境部署
- YAML文件格式及编写注意事项
- 三、Docker Compose 配置常用字段
- 四、Docker Compose 常用命令
- 五、Docker Compose 命令手册
- 六、docker-compose.yaml属性
- 七、Docker Compose字段使用说明
- 八、实践编写web应用案例
- 九、实践Docker-Compose编写LNMP
前言
编排技术分类:
1、应用编排
单机:shell/Python脚本
多机/集群:ansible 、saltstack 、pubbet
2、(docker)容器编排
单机:docker-compose
多机/集群:docker swarm 、kubernetes
一、Dcoker Compose简介
- 在前面学习的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的区别
- Docker
- 和操作系统无关的一个沙箱容器,宿主机安装的什么操作系统和其本身无关,在它基础上可以制作各种系统类型的基础服务。
- DockerFile
- 是把手工安装docer镜像的过程变成一个配置文件的方式运行,这样每次不需要一步步手敲命令去安装了,而只是需要一个配置文件运行既可生成一个镜像。
- Docker Compose
- 提供了服务和项目的概念,这样一个服务可以配置多个项目,这个服务是多个项目的集合体,启动和关闭都相对一个一个项目的启动要方便很多。
二、Docker Compose环境部署
- Docker-Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 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文件格式
- YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json数据描述语言,语法比 json简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { } 括起来。
- YAML格式的注意事项
- 不支持制表符 tab 键缩进,只能使用空格缩进
- 通常开头缩进2个空格
- 字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
- 用 # 号注释
- 如果包含特殊字符用单引号 ‘’ 引起来作为普通字符;如果用双引号“”表示特殊字符本身的意思
- 布尔值必须用引号 “” 括起来
- 区分大小写
- 数据结构
对象: 键值对的字典
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',
]
}
三、Docker Compose 配置常用字段
字段 | 描述 |
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 |
四、Docker Compose 常用命令
字段 | 描述 |
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示正在运行的容器进程 |
logs | 查看服务容器的输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
五、Docker Compose 命令手册
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
六、docker-compose.yaml属性
具体每个参数参考官方文档
官方文档: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
七、Docker Compose字段使用说明
[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应用案例
---------------------------
#编写一个简单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>
九、实践Docker-Compose编写LNMP
#前面我们使用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