Docker Compose入门
Docker Compose入门
简介
Docker Compose是用于定义和运行多个 Docker 容器的应用
使用Dockerfile
模板文件可以定义单独的应用容器,若需要多个容器相互配合来完成某项任务的情况,则需要
用户通过一个单独的 docker-compose.yml
模板文件来定义一组相关联的应用容器为一个项目。
Compose
中有两个重要的概念:
服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
定制镜像
在使用Docker Compose对容器进行编排前,需要先用Dockerfile定制镜像,Dockerfile 是一个文本文件,其内包含了一条条的指令,例如
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
其中:
FROM
指定基础镜像:定制镜像就是以一个镜像为基础,FROM
是必备的指令,并且必须是第一条指令。
RUN
执行命令:包括shell和exec两种格式,尽量只使用一个RUN指令,并使用 &&
将各个所需命令串联起来
- shell格式:RUN <linux命令>
- exec格式:RUN ["可执行文件", "参数1", "参数2"]
其他指令包括:
COPY
将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置
ADD
在 COPY
基础上增加了一些功能:<源路径>
可以是一个 URL,<源路径>
为一个 tar
压缩文件会自动解压缩
CMD
指定默认的容器主进程的启动命令,推荐使用 exec
格式,比如CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT
类似于CMD
,但可在执行docker run后增加参数
ENV
VOLUME
<路径>存储层挂载
EXPOSE
<端口1> [<端口2>...]声明容器运行时提供服务的端口
WORKDIR
<工作目录路径>指定当前工作目录
最后构建镜像:
docker build [选项] <上下文路径/URL/->
,比如在Dockerfile
文件所在目录执行:docker build -t nginx:v3 .
指定了最终镜像的名称为nginx:v3
Compose
安装(linux):
- arm:
sudo pip install -U docker-compose
- x86:
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 国内用户可以使用以下方式加快下载 $ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
- arm:
示例
场景:用
Python
来建立一个能够记录页面访问次数的 web 网站web应用:
app.py
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
- docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
- 运行:
docker-compose up
- 模版文件
docker-compose.yml
version: '3'
services:
webapp: # 运行容器名
build:
context: ./dir # 指定Dockerfile所在文件夹路径
dockerfile: Dockerfile-alternate # Dockerfile文件名
args:
buildno: 1 # 指定变量
command: echo "hello world"
ports: # 端口映射
- "80:80"
volumes: # 持久化映射
- "/data:/var/lib/mysql"
devices: # 设备映射
- "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on: # 先启动db和redis ,后启动webapp
- db
- redis
redis:
image:redis # 从dockerhub拉取镜像
tmpfs: # 挂载tmpfs 文件系统到容器
- /run
- /tmp
db:
image:postgres
expose:# 暴露端口
- "3000"
每个服务都必须通过 image
指令指定镜像或 build
指令(需要 Dockerfile)等来自动构建生成镜像
image
:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose
将会尝试拉取这个镜像
build
:指定 Dockerfile
所在文件夹的路径,Compose
将会利用它自动构建这个镜像,然后使用这个镜像
command
:覆盖容器启动后默认执行的命令
devices
:指定设备映射关系
depends_on
:解决容器的依赖、启动先后的问题
tmpfs
:挂载tmpfs 文件系统到容器
expose
:暴露端口,但不映射到宿主机,只被连接的服务访问
ports
:暴露端口信息,使用 宿主端口:容器端口 (HOST:CONTAINER)
格式形成映射
volumes
:数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER
)或者数据卷名称(VOLUME:CONTAINER
)
environment
:配置容器环境变量
参考
[ 1 ] https://yeasy.gitbook.io/docker_practice/
文章标题:Docker Compose入门
文章链接:http://120.46.217.131:82/archives/51/
最后编辑:2023 年 2 月 7 日 14:52 By Yang
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)