1.3 使用
首先介绍几个术语。
- 服务 ( service ):一个应用容器,实际上可以运行多个相同镜像的实例。
- 项目 ( project ):由一组关联的 应用容器 组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成, Compose 面向项目进行管理。
最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。
下面我们用 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: 编写 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" - 运行 compose 项目: $ docker-compose up Creating network "dockerstudy_default" with the default driver Building web Step 1/5 : FROM python:3.6-alpine 3.6-alpine: Pulling from library/python 59bf1c3509f3: Pull complete 8786870f2876: Pull complete acb0e804800e: Pull complete 52bedcb3e853: Pull complete b064415ed3d7: Pull complete Digest: sha256:579978dec4602646fe1262f02b96371779bfb0294e92c91392707fa999c0c989 Status: Downloaded newer image for python:3.6-alpine ---> 3a9e80fa4606 Step 2/5 : ADD . /code ---> a0c7852e01d5 Step 3/5 : WORKDIR /code ---> Running in a134b64d8727 Removing intermediate container a134b64d8727 ---> f961a3637d29 Step 4/5 : RUN pip install redis flask ---> Running in ad15c1605e3e Collecting redis ... 此时访问本地 5000 端口,每次刷新页面,计数就会加 1。
1.4 命令说明
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
执行 docker-compose [COMMAND] --help
或者 docker-compose help [COMMAND]
可以查看具体某个命令的使用格式。
docker-compose
命令的基本的使用格式是:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
1.4.1 命令选项:
-f, --file FILE
:指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以 多次指定。-p, --project-name NAME
:指定项目名称,默认将使用所在目录名称作为项目名。--x-networking
:使用 Docker 的可拔插网络后端特性--x-network-driver DRIVER
:指定网络后端的驱动,默认为 bridge--verbose
:输出更多调试信息。-v, --version
:打印版本并退出。
1.4.2 ❤️命令使用说明
1. ❤️build
- 作用:构建/重新构建项目中服务容器。
服务容器一旦构建后,将会带上一个标记名,例如对于
web
项目中的一个db
容器,可能是web_db
。 可以随时在项目目录下运行docker-compose build
来重新构建服务。 - 格式:
docker-compose build [选项] [SERVICE...]
- 例子: $ docker-compose build web Building web Step 1/5 : FROM python:3.6-alpine ---> 3a9e80fa4606 Step 2/5 : ADD . /code ---> Using cache ---> a0c7852e01d5 Step 3/5 : WORKDIR /code ---> Using cache ---> f961a3637d29 Step 4/5 : RUN pip install redis flask ---> Using cache ---> fd79c1b59863 Step 5/5 : CMD ["python", "app.py"] ---> Using cache ---> 3292c3a0fc70 Successfully built 3292c3a0fc70 Successfully tagged dockerstudy_web:latest
选项:
--force-rm
:删除构建过程中的临时容器。--no-cache
:构建镜像过程中不使用 cache(这将加长构建过程)。--pull
:始终尝试通过 pull 来获取更新版本的镜像。
2. config
- 作用:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
- 格式:
docker-compose config [选项]
选项:
-q, --quiet
:只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。--services
: 打印服务名,一行一个验证和查看compose文件配置。
3. down
- 作用:此命令将会停止
up 命令
所启动的容器,并移除网络。 - 格式:
docker-compose down [选项]
选项:
--rmi type
:删除镜像,类型必须是:- 'all': 删除compose文件中定义的所以镜像。
- 'local': 删除镜像名为空的镜像。
-v, --volumes
:删除卷。--remove-orphans
:删除Compose文件中未定义的服务。
4. exec
- 作用:进入指定的容器。
- 格式:
docker-compose exec [选项] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
5. help
获得一个命令的帮助。
6. top
查看各个服务容器内运行的进程。
6. ❤️images
- 作用:列出 Compose 文件中包含的镜像。
- 例如: $ cat docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" $ docker-compose images Container Repository Tag Image Id Size ----------------------------------------------------------------------- dockerstudy_redis_1 redis alpine 3900abf41552 30.9 MB dockerstudy_web_1 dockerstudy_web latest 3292c3a0fc70 52.6 MB
7. kill
- 作用:通过发送
SIGKILL
信号来强制停止服务容器。 - 格式:
docker-compose kill [选项] [SERVICE...]
支持通过 -s 参数来指定发送的信号,例如通过如下指令发送 SIGINT 信号。 $ docker-compose kill -s SIGIN
8. ❤️logs
- 作用:查看服务容器的输出。 默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
- 格式:
docker-compose logs [选项] [SERVICE...]
选项:
--no-color
单色输出,不显示其他颜色。-f, --follow
跟踪日志输出,就是可以实时查看日志。-t, --timestamps
显示时间戳--tail
从日志的结尾显示,--tail=200
,显示日志输出。
9. ❤️pause|unpause
- 作用:暂停一个服务容器。| 恢复处于暂停状态中的服务。
- 格式:
docker-compose pause [SERVICE...]
- 例子:
$ docker-compose pause redis Pausing dockerstudy_redis_1 ... done
可以使用
docker-compose unpause
进行恢复。 $ docker-compose unpause redis Unpausing dockerstudy_redis_1 ... done
10. port
- 作用:打印某个容器端口所映射的公共端口。
- 格式:
docker-compose port [选项] SERVICE PRIVATE_PORT
选项:
--protocol=proto
指定端口协议,tcp(默认值)或者 udp。--index=index
如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
11. ❤️ ps
- 作用:列出项目中目前的所有容器。
- 格式:
docker-compose ps [选项] [SERVICE...]
- 例子: $ docker-compose ps Name Command State Ports ----------------------------------------------------------------------- dockerstudy_redis_1 docker-entrypoint.sh redis ... Exit 137 dockerstudy_web_1 python app.py Exit 137
选项:
-q
:只打印容器的 ID 信息。
12. pull
- 作用:拉取服务依赖的镜像。
- 格式:
docker-compose pull [选项] [SERVICE...]
选项:
--ignore-pull-failures
:忽略拉取镜像过程中的错误。
13. push
- 作用:推送服务依赖的镜像到 Docker 镜像仓库。。
- 格式:
docker-compose pull [选项] [SERVICE...]
选项:
--ignore-push-failures
:忽略拉取镜像过程中的错误。
14. run
- 作用:在指定服务上 执行 一个命令。
- 格式:
docker-compose run [选项] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
- 例如:
$ docker-compose run web python --version Python 3.6.15
将会启动一个 web 服务容器,并执行
python --version
命令。 默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。
选项:
-d
后台运行,输出容器名。--name NAME
为容器指定一个名字。--entrypoint CMD
覆盖默认的容器启动指令。-e KEY=VAL
设置环境变量值,可多次使用选项来设置多个环境变量。-u, --user=""
指定运行容器的用户名或者 uid。--no-deps
不自动启动关联的服务容器。--rm
运行命令后自动删除容器, d 模式下将忽略。-p, --publish=[]
映射容器端口到本地主机。--service-ports
配置服务端口并映射到本地主机。-T
不分配伪 tty,意味着依赖 tty 的指令将无法运行。
15. ❤️start
16. ❤️restart
- 作用:重启项目中的服务。
- 格式:
docker-compose restart [选项] [SERVICE...]
- 例子: $ docker-compose restart Restarting dockerstudy_web_1 ... done Restarting dockerstudy_redis_1 ... done
选项:
-t, --timeout TIMEOUT
:指定重启前停止容器的超时(默认为 10 秒)。
17. ❤️stop
- 作用:停止已经处于运行状态的容器,但不删除它。
通过
docker-compose start
可以再次启动这些 容器。 - 格式:
docker-compose stop [options] [SERVICE...]
选项:
-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
18. ❤️rm
- 作用:删除所有(停止状态的)服务容器。
推荐先执行
docker-compose stop
命令来停止容器。 - 格式:
docker-compose rm [options] [SERVICE...]
选项:
-f, --force
强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v
删除容器所挂载的数据卷。
19. ❤️up
- 作用:该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联 服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况,
docker-compose up
启动的容器都在前台,控制台将会同时打印所有容器的输出信 息,可以很方便进行调试。 当通过Ctrl-C
停止命令时,所有容器将会停止。 如果使用docker-compose up -d
,将会在后台启动并运行所有的容器。一般推荐生产环境下 使用该选项。 默认情况,如果服务容器已经存在,docker-compose up
将会尝试停止容器,然后重新创建 (保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配docker-compose.yml
文件 的最新内容。 如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate 。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。 如果用户只想重新部署某个服务,可以使用docker-compose up --no-deps -d
来重新创建服务 并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。 - 格式:
docker-compose up [options] [SERVICE...]
选项:
-d
在后台运行服务容器。--no-color
不使用颜色来区分不同的服务的控制台输出。--no-deps
不启动服务所链接的容器。--force-recreate
强制重新创建容器,不能与 --no-recreate 同时使用。--no-recreate
如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使 用。--no-build
不自动构建缺失的服务镜像。-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
20. scale
- 作用:设置指定服务运行的容器个数。
- 格式:
docker-compose scale [options] [SERVICE=NUM...]
通过service=num
的参数来设置数量。 - 例子: $ docker-compose scale web=3 redis=2 将启动 3 个容器运行 web 服务,2 个容器运行 redis 服务。 一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器;反之,将停止容器。
选项:
-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
21. ❤️version
- 功能:打印版本信息。
- 格式:
docker-compose version
- 例子: $ docker-compose version docker-compose version 1.17.1, build 6d101fb docker-py version: 2.5.1 CPython version: 2.7.13 OpenSSL version: OpenSSL 1.0.1t 3 May 2016
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表