一、安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
如果curl 命令无法下载,可在https://github.com/docker/compose/releases网站点下载,再使用:
[root@localhost ~]# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
测试安装:
[root@myregistrydomain bin]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01
升级:$ docker-compose migrate-to-labels
删除: $ sudo rm /usr/local/bin/docker-compose
二、配置python应用
1、创建一个临时目录
$ mkdir composetest
$ cd composetest
2、创建一个app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
redis等第三方工具也可以预先安装好,配置上可用的host与port。
3、创建 requirements.txt 文件
flask
redis
4、创建 Dockerfile
FROM python:3.7.2
ADD . /root/app
WORKDIR /root/app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
5、创建docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:latest"
6、运行docker-compose.yml
$ docker-compose up
Building web
Step 1/6 : FROM python:3.7.2
---> ad01f54ca3a9
Step 2/6 : RUN mkdir -p /root/app
---> Running in 6dfd4c0db49b
---> 0c8d4fa45f8b
Removing intermediate container 6dfd4c0db49b
Step 3/6 : ADD . /root/app
---> 7b746ad08b96
Removing intermediate container d8c5a1680274
Step 4/6 : WORKDIR /root/app
---> 4d10074d895d
Removing intermediate container dfaa7afd83f1
Step 5/6 : RUN pip install -r requirements.txt
---> Running in ed78df8f448c
Collecting flask (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
....
redis_1 | 1:M 27 Dec 21:59:07.907 * Ready to accept connections
web_1 | * Serving Flask app "app" (lazy loading)
web_1 | * Environment: production
web_1 | WARNING: Do not use the development server in a production environment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: on
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger PIN: 278-298-439
web_1 | 172.18.0.1 - - [27/Dec/2018 22:05:41] "GET / HTTP/1.1" 500 -
7、测试
[root@localhost componsetest]# curl http://localhost:5000
Hello World! I have been seen 1 times.
[root@localhost componsetest]# curl http://localhost:5000
Hello World! I have been seen 2 times.
三、docker-compose操作命令
-f指定的文件或路径
$ docker-compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db
docker-compose.yml指定一个webapp服务
webapp:
image: examples/web
ports:
- "8000:8000"
volumes:
- "/data"
docker-compose.admin.yml可以做为webapp的附加服务配置,如果与前面的docker-compose.yml文件配置重复,会覆盖上面的文件配置。
webapp:
build: .
environment:
- DEBUG=1
所有命令行如下:
Command:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
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 the Docker-Compose version information
$ docker-compose up -d #compose以守护进程模式运行加-d选项
$ docker-compose stop
$ docker-compose restart
$ docker-compose logs redis #查看compose日志
$ docker-compose run services cmd #对容器执行命令(一次)
$ docker-compose run web env #查看web容器环境变量
四、docker-compose.yml配置
compose 文件是一个定义服务、 网络和卷的 YAML 文件 。Compose 文件的默认路径是 ./docker-compose.yml,服务定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数一样 docker container create。同样,网络和卷的定义类似于 docker network create 和 docker volume create。正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,你不需要再次指定它们docker-compose.yml。可以使用 Bash 类 ${VARIABLE} 语法在配置值中使用环境变量。
提示: 可以是用 .yml 或 .yaml 作为文件扩展名
1、bulid
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。
build: /path/to/build/dir
也可以是相对路径:
build: ./dir
设定上下文根目录,然后以该目录为准指定 Dockerfile
build:
context: ../
dockerfile: path/of/Dockerfile
2、context
context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的url,当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context
build:
context: ./dir
3、 dockerfile
使用此 dockerfile 文件来构建,必须指定构建路径
build:
context: .
dockerfile: Dockerfile-alternate
4、image
services:
web:
image: nginx
在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。例如下面这些格式都是可以的:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd
5. args
添加构建参数,这些参数是仅在构建过程中可访问的环境变量,首先, 在Dockerfile中指定参数:
ARG fendo
ARG password
RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"
然后指定 build 下的参数,可以传递映射或列表
build:
context: .
args:
fendo: 1
password: fendo
或
build:
context: .
args:
- fendo=1
- password=fendo
指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值
args:
- fendo
- password
YAML中的布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。
6、command
使用 command 可以覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000
该命令也可以是一个列表,方法类似于 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
7、container_name
Compose 的容器名称格式是:<项目名称><服务名称><序号>
虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:
container_name: app
这样容器的名字就指定为 app 了。
8、depends_on
在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。
9、pid
pid: "host"
将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。
10、ports
映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
11.extra_hosts
添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
启动之后查看容器内部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
12.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
如果你不使用宿主机的路径,你可以指定一个volume_driver。
volume_driver: mydriver
参考:
https://docs.docker.com/compose/overview/
https://github.com/docker/compose/releases