1. 介绍
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
使用Docker问题:
docker镜像在创建之后,往往需要自己手动pull来获取镜像,然后执行run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。
这时就需要用到Docker Compose;
docker-compose用来单机上编排容器(定义和运行多个容器,使容器能互通)
2. 步骤
1、用一个定义应用程序的环境,Dockerfile这样它就可以在任何地方再现。
2、定义组成应用程序的服务,编写docker-compose.yml
文件 以便它们可以在隔离的环境中一起运行。
3、运行docker-compose up
和撰写启动并运行整个应用程序。
3. 安装compose
安装也可参考官网:https://docs.docker.com/compose/install/
下面给出示例:
下载:
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予权限:
sudo chmod +x /usr/local/bin/docker-compose
建立软链接:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证:
docker-compose --version
docker compose常用命令
#帮助信息
[root@localhost ~]# docker-compose --help
#用来创建或重新创建服务使用的镜像
[root@localhost ~]# docker-compose build
例如:docker-compose build service_a #创建一个镜像名叫service_a
#用于通过容器发送SIGKILL信号强行停止服务
[root@localhost ~]# docker-compose kill
#显示service的日志信息
[root@localhost ~]# docker-compose logs
#暂停和恢复服务
[root@localhost ~]# docker-compose pause/unpause
docker-compose pause #暂停服务
docker-compose unpause #恢复被暂停的服务
#用于查看服务中的端口与物理机的映射关系
[root@localhost ~]# docker-compose port
例如:docker-compose port nginx_web 80 #查看服务中80端口映射到物理机上的那个端口
#用于显示当前项目下的容器
[root@localhost ~]# dokcer-compose ps
注意,此命令与docker ps不同作用,此命令会显示停止后的容器(状态为Exited),只针对某个项目。
#用于拉取服务依赖的镜像
[root@localhost ~]# docker-compose pull
#用于重启某个服务中的所有容器
[root@localhost ~]# docker-compose restart
例如:docker-compose restart service_name #只有正在运行的服务可以使用重启命令,停止的服务是不可以重启
#删除停止的服务(服务里的容器)
[root@localhost ~]# docker-compose rm
-f #强制删除
-v #删除与容器相关的卷(volumes)
#用于在服务中运行一个一次性的命令
[root@localhost ~]# docker-compose run
这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处
1、run指定的命令会直接覆盖掉service配置中指定的命令
2、run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用--service-ports指定
#启动/停止运行某个服务的所有容器
[root@localhost ~]# docker-compose start/stop
docker-compose start 启动运行某个服务的所有容器
docker-compose stop 停止运行某个服务的所有容器
#指定某个服务启动的容器个数
[root@localhost ~]# docker-compose scale
[root@localhost ~]# docker-compose scale --help
#备注:
#docker-compose 运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是#对配置文件中所有的service执行命令。
-f #用于指定配置文件
-p #用于指定项目名称
4. 配置文件
docker compose 使用YAML(文件后缀:.yml)文件格式,这需要您了解yml文件的语法;
实例
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- ./webserver:/webserver
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
当然,实际使用中,services里面肯定不止一个nginx容器,还有其他很多容器!
配置说明
#下面将配置文件做个简单的解释说明
docker-compose的配置文件是一个.yml格式的文件
第一部分
version: "3" #指定语法的版本
第二部分
services: #定义服务
nginx: #服务的名称,-p参数后接服务名称
container_name: web-nginx #容器的名称
image: nginx:latest #要使用的镜像,如果没有将在构建时向仓库拉取
restart: always
ports: #端口映射
- 80:80
第三部分
volumes: #物理机与容器的磁盘映射关系
- ./webserver:/webserver
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
5. 测试使用
我们这里做一个简单的测试;
1、创建一个目录来测试:
mkdir docker-compose-test && cd docker-compose-test
2、编辑nginx配置文件:
#user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 10m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location / {
root /webserver;
index index.html index.htm;
}
}
include /etc/nginx/conf.d/*.conf;
}
3、编辑docker-compose.yml文件
vim docker-compose.yml
文件名是docker-compose.yml
:
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
解释:创建一个nginx目录,并将当前目录(即docker-compose-test)下的nginx.conf
配置映射到容器中的/etc/nginx/nginx.conf
(可参考:《Docker 数据卷》章节)
使用命令
docker-compose up
如果需要后台运行,则加一个-d
参数:
docker-compose up -d
同样,停止命令:
docker-compose down
6. 其他
上面的测试仅是一个很简单的测试,实际开发中,肯定需要结合dockerfile做更复杂的配置;