简化部署步骤, 通过一YAML格式文件,定义我们所需要启动的容器,网络,端口等其他的信息。
有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-composecompose 文件的结构和版本
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 ...] [--profile启动命令 docker-compose up...] [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.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 rm注意:默认为docker-compose.yml文件,其他名称需要用-f指定
Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
退出状态的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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)