Docker Compose 介绍
简化部署步骤, 通过一YAML格式文件,定义我们所需要启动的容器,网络,端口等其他的信息。
有docker-compose命令工具,启动,停止操作。
docker compose 的安装
Windows和Mac在默认安装了docker desktop以后,docker-compose随之自动安装
PS F:\docker> docker-compose --version
docker-compose version 1.29.2, build 5becea4c
Linux用户需要自行安装
最新版本号可以在这里查询 https://github.com/docker/compose/releases
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
熟悉python的朋友,可以使用pip去安装docker-Compose
因为是Python写的一个工具
$ pip install docker-compose
compose 文件的结构和版本
docker compose文件的语法说明(请保存好,经常会使用的链接): https://docs.docker.com/compose/compose-file/
基本语法结构
version: "3.8"
services: # 容器
servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
image: # 镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
environment: # 可选,相当于 docker run里的 --env
volumes: # 可选,相当于docker run里的 -v
networks: # 可选,相当于 docker run里的 --network
ports: # 可选,相当于 docker run里的 -p
servicename2:
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create
以 Python Flask + Redis练习:为例子,改造成一个docker-compose文件
docker image pull redis
docker image build -t flask-demo .
# create network
docker network create -d bridge demo-network
# create container
docker container run -d --name redis-server --network demo-network redis
docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
docker-compose.yml
文件如下:
version: "3.8"
services:
flask-demo:
image: flask-demo:latest
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
image: redis:latest
networks:
- demo-network
networks:
demo-network:
docker-compose 语法版本
向后兼容
请参考官网:https://docs.docker.com/compose/compose-file/
docker compose 基本命令
PS F:\docker> docker-compose help
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--profile NAME Specify a profile to enable
-c, --context NAME Specify a context name
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--ansi (never|always|auto) Control when to print ANSI control characters
--no-ansi Do not print ANSI control characters (DEPRECATED)
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert keys
in v3 files to their non-Swarm equivalent (DEPRECATED)
--env-file PATH Specify an alternate environment file
Commands:
build Build or rebuild services
config Validate and view the Compose file
create Create services
down Stop and remove resources
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show version information and quit
启动命令 docker-compose up
启动命令,当前有docker-compose.yml
文件
PS F:\docker> docker-compose up
Starting docker_flask-demo_1 ... done Starting docker_redis-server_1 ... done Attaching to docker_redis-server_1, docker_flask-demo_1
redis-server_1 | 1:C 20 Jan 2022 19:17:09.174 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-server_1 | 1:C 20 Jan 2022 19:17:09.174 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis-server_1 | 1:C 20 Jan 2022 19:17:09.174 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-server_1 | 1:M 20 Jan 2022 19:17:09.174 * monotonic clock: POSIX clock_gettime
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * Running mode=standalone, port=6379.
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 # Server initialized
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * Loading RDB produced by version 6.2.6
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * RDB age 304 seconds
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * RDB memory usage when created 0.77 Mb
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 # Done loading RDB, keys loaded: 0, keys expired: 0.
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * DB loaded from disk: 0.000 seconds
redis-server_1 | 1:M 20 Jan 2022 19:17:09.175 * Ready to accept connections
flask-demo_1 | * Serving Flask app 'app.py' (lazy loading)
flask-demo_1 | * Environment: production
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | Use a production WSGI server instead.
flask-demo_1 | * Debug mode: off
flask-demo_1 | * Running on all addresses.
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | * Running on http://172.19.0.2:5000/ (Press CTRL+C to quit)
后台启动
PS F:\docker> docker-compose up -d
Starting docker_flask-demo_1 ... done
Starting docker_redis-server_1 ... done
PS F:\docker>
查看日志 docker-compose logs
在-d
后可以查看log
PS F:\docker> docker-compose logs
持续动态查看日志
PS F:\docker> docker-compose logs -f
查看后台定义的服务 docker-compose ps
需要在docker-compose.yml
文件运行这个指令,否则:
ERROR:
Can’t find a suitable configuration file in this directory or any
parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
PS F:\docker> docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------
docker_flask-demo_1 flask run -h 0.0.0.0 Up 0.0.0.0:8080->5000/tcp
docker_redis-server_1 docker-entrypoint.sh redis ... Up 6379/tcp
注意:默认为docker-compose.yml文件,其他名称需要用-f指定
Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
删除 docker-compose rm
退出状态的docker-compose,就会直接删除
PS F:\docker> docker-compose rm
Going to remove docker_redis-server_1, docker_flask-demo_1
Are you sure? [yN] y
Removing docker_redis-server_1 ... done Removing docker_flask-demo_1 ... done
指定docker-compose名称(前缀) docker-compose -p {name} up
指定名称操作:
PS F:\docker> docker-compose -p myproject up -d
Starting myproject_flask-demo_1 ...
Starting myproject_flask-demo_1 ... done PS F:\docker> docker-compose -p myproject rm
No stopped containers
PS F:\docker> docker-compose -p myproject stop
Stopping myproject_redis-server_1 ... done Stopping myproject_flask-demo_1 ... done PS F:\docker> docker-compose -p myproject rm
Going to remove myproject_redis-server_1, myproject_flask-demo_1
Are you sure? [yN] y
Removing myproject_redis-server_1 ... done Removing myproject_flask-demo_1 ... done PS F:\docker>
docker-compose自定义容器名称
自定义容器名称为 myflask-demo: container_name: myflask-demo
version: "3.8"
services:
flask-demo:
container_name: myflask-demo # 自定义容器名称
image: flask-demo:latest
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
image: redis:latest
networks:
- demo-network
networks:
demo-network:
docker-compose镜像构建和拉取
构建
镜像不存在时,会去pull
拉取镜像,但是自定义的镜像如何docker-compose构建?
把app.py
和Dockerfile
文件放进flask
里
修改原有的yml文件 docker-compose1.yml
:
build
写目录,用来构建镜像
version: "3.8"
services:
flask-demo:
build: ./flask # 构建的目录
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
image: redis:latest
networks:
- demo-network
networks:
demo-network:
直接创建启动
PS F:\docker> docker-compose -f .\docker-compose1.yml up
Building flask-demo
Sending build context to Docker daemon 3.072kB
Step 1/8 : FROM python:3.9.5-slim
---> c71955050276
Step 2/8 : RUN pip install flask redis && groupadd -r flask && useradd -r -g flask flask && mkdir /src && chown -R flask:flask /src
---> Running in 2fb3ac9af1c1
Collecting flask
Downloading Flask-2.0.2-py3-none-any.whl (95 kB)
Collecting redis
Downloading redis-4.1.1-py3-none-any.whl (173 kB)
Collecting click>=7.1.2
Downloading click-8.0.3-py3-none-any.whl (97 kB)
Collecting Jinja2>=3.0
Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
Collecting itsdangerous>=2.0
Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB)
Collecting Werkzeug>=2.0
Downloading Werkzeug-2.0.2-py3-none-any.whl (288 kB)
Collecting MarkupSafe>=2.0
Downloading MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (30 kB)
Collecting packaging>=20.4
Downloading packaging-21.3-py3-none-any.whl (40 kB)
Collecting deprecated>=1.2.3
Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting wrapt<2,>=1.10
Downloading wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (81 kB)
Collecting pyparsing!=3.0.5,>=2.0.2
Downloading pyparsing-3.0.6-py3-none-any.whl (97 kB)
Installing collected packages: wrapt, pyparsing, MarkupSafe, Werkzeug, packaging, Jinja2, itsdangerous, deprecated, click, redis, flask
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 deprecated-1.2.13 flask-2.0.2 itsdangerous-2.0.1 packaging-21.3 pyparsing-3.0.6 redis-4.1.1 wrapt-1.13.3
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.1.3; however, version 21.3.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 2fb3ac9af1c1
---> da32b83af27e
Step 3/8 : USER flask
---> Running in 557bf0bb9d88
Removing intermediate container 557bf0bb9d88
---> 374c6b5f462e
Step 4/8 : COPY app.py /src/app.py
---> 5fc4e5b60e75
Step 5/8 : WORKDIR /src
---> Running in fa96d8ba41d3
Removing intermediate container fa96d8ba41d3
---> 7c90c225ab3e
Step 6/8 : ENV FLASK_APP=app.py REDIS_HOST=redis
---> Running in a84c16facb22
Removing intermediate container a84c16facb22
---> 8b54841afbf4
Step 7/8 : EXPOSE 5000
---> Running in 2b5744ca4e4c
Removing intermediate container 2b5744ca4e4c
---> 41d9b9cb3649
Step 8/8 : CMD ["flask", "run", "-h", "0.0.0.0"]
---> Running in 780790c05526
Removing intermediate container 780790c05526
---> 9b1341debf58
Successfully built 9b1341debf58
Successfully tagged docker_flask-demo:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
WARNING: Image for service flask-demo was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker_flask-demo_1 ... done Creating docker_redis-server_1 ... done Attaching to docker_redis-server_1, docker_flask-demo_1
redis-server_1 | 1:C 20 Jan 2022 19:53:22.062 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-server_1 | 1:C 20 Jan 2022 19:53:22.062 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis-server_1 | 1:C 20 Jan 2022 19:53:22.062 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-server_1 | 1:M 20 Jan 2022 19:53:22.062 * monotonic clock: POSIX clock_gettime
redis-server_1 | 1:M 20 Jan 2022 19:53:22.063 * Running mode=standalone, port=6379.
redis-server_1 | 1:M 20 Jan 2022 19:53:22.063 # Server initialized
redis-server_1 | 1:M 20 Jan 2022 19:53:22.063 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-server_1 | 1:M 20 Jan 2022 19:53:22.064 * Ready to accept connections
flask-demo_1 | * Serving Flask app 'app.py' (lazy loading)
flask-demo_1 | * Environment: production
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | Use a production WSGI server instead.
flask-demo_1 | * Debug mode: off
flask-demo_1 | * Running on all addresses.
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | * Running on http://172.19.0.2:5000/ (Press CTRL+C to quit)
查看本地镜像:
PS F:\docker> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_flask-demo latest 9b1341debf58 2 minutes ago 129MB
自定义Dockerfile
默认找Dockerfile
文件,没有就会报错
这就要添加参数:
build:
context
:指定的目录dockerfile
:自定义Dockerfile文件名称
version: "3.8"
services:
flask-demo:
build:
context: ./flask # 指定的目录
dockerfile: Dockerfile-flask.txt # 自定义Dockerfile文件名称
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
image: redis:latest
networks:
- demo-network
networks:
demo-network:
拉取 docker-compose pull
提前准备好镜像,构建会很快
docker-compose pull