前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知,使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)。Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。
一、安装 docer-compose#安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
#赋予权限
sudo chmod +x /usr/local/bin/docker-compose
#查看安装是否成功
docker-compose -v
# 下载服务镜像
docker-compose pull:
# ps:列出所有运行容器
docker-compose ps
# logs:查看服务日志输出
docker-compose logs
# up:构建、启动容器
docker-compose up
# kill:通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka
# port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
docker-compose port eureka 8761
# build:构建或者重新构建服务
docker-compose build
# start:启动指定服务已存在的容器
docker-compose start eureka
# stop:停止已运行的服务的容器
docker-compose stop eureka
# rm:删除指定服务的容器
docker-compose rm eureka
# 设置指定服务运气容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3
# run:在一个服务上执行一个命令
docker-compose run web bash
当服务的配置发生更改时,可使用 docker-compose up 命令更新配置,此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去。
links:服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务
,这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了。
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
三、docer-compose详细命令
config
docker-compose config -q
验证 `docker-compose.yml` 文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。
pull
docker-compose pull` 拉取服务依赖的镜像。
# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中 nginx 服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q
up
`docker-compose up` 创建并启动所有服务的容器。指定多个 yml 加 `-f` 选项。以守护进程模式运行加 `-d` 选项。
# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
docker-compose -f docker-compose.yml up -d
logs
`docker-compose logs` 查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color
ps
`docker-compose ps` 列出工程中所有服务的容器。
# 列出工程中所有服务的容器
docker-compose ps
# 列出工程中指定服务的容器
docker-compose ps nginx
run
`docker-compose run` 在指定服务容器上执行一个命令。
# 在工程中指定服务的容器上执行 echo "helloworld"
docker-compose run nginx echo "helloworld"
exec
`docker-compose exec` 进入服务容器。
# 进入工程中指定服务的容器
docker-compose exec nginx bash
# 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
docker-compose exec --index=1 nginx bash
pause
`docker-compose pause` 暂停服务容器。
# 暂停工程中所有服务的容器
docker-compose pause
# 暂停工程中指定服务的容器
docker-compose pause nginx
unpause
`docker-compose unpause` 恢复服务容器。
# 恢复工程中所有服务的容器
docker-compose unpause
# 恢复工程中指定服务的容器
docker-compose unpause nginx
restart
`docker-compose restart` 重启服务容器。
# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx
start
`docker-compose start` 启动服务容器。
# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx
stop
`docker-compose stop` 停止服务容器。
# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx
kill
`docker-compose kill` 通过发送 `SIGKILL` 信号停止指定服务的容器。
# 通过发送 SIGKILL 信号停止工程中指定服务的容器
docker-compose kill nginx
rm
`docker-compose rm` 删除服务(停止状态)容器。
# 删除所有(停止状态)服务的容器
docker-compose rm
# 先停止所有服务的容器,再删除所有服务的容器
docker-compose rm -s
# 不询问是否删除,直接删除
docker-compose rm -f
# 删除服务容器挂载的数据卷
docker-compose rm -v
# 删除工程中指定服务的容器
docker-compose rm -sv nginx
down
停止并删除所有服务的容器、网络、镜像、数据卷。
# 停止并删除工程中所有服务的容器、网络
docker-compose stop
# 停止并删除工程中所有服务的容器、网络、镜像
docker-compose down --rmi all
# 停止并删除工程中所有服务的容器、网络、数据卷
docker-compose down -v
images
`docker-compose images` 打印服务容器所对应的镜像。
# 打印所有服务的容器所对应的镜像
docker-compose images
# 打印指定服务的容器所对应的镜像
docker-compose images nginx
port
`docker-compose port` 打印指定服务容器的某个端口所映射的宿主机端口。
[root@localhost docker-nginx]# docker-compose port nginx 80
0.0.0.0:80
top
`docker-compose top` 显示正在运行的进程。
# 显示工程中所有服务的容器正在运行的进程
docker-compose top
# 显示工程中指定服务的容器正在运行的进程
docker-compose top nginx
四、docer compose.yaml文件模板
详细的启动一个的docek的实例的配置请参考官方文档中的配置和网站上自己搜索对应的docker的配置文件。详细的网站在博文参考中,提供给大家参考。
---------------------Redis 配置指令参考---------------------
version: "2"
services:
### console
console:
build:
context: ./images/console
args:
# console 容器 www-data用户密码
- USERPASS=root
- GIT_NAME=yangnan
- GIT_EMAIL=20706149@qq.com
- INSTALL_YARN=false
volumes_from:
- php-fpm
- nginx
- mysql
- redis
volumes:
- ./ssh:/home/www-data/.ssh
links:
- redis
- mysql
tty: true
### php-fpm
php-fpm:
build: ./images/php-fpm
volumes:
- ./app/:/var/www/
### nginx
nginx:
image: nginx
ports:
- "8081:80"
volumes_from:
- php-fpm
volumes:
- ./logs/nginx/:/var/log/nginx/
- ./images/nginx/sites:/etc/nginx/conf.d/
links:
- php-fpm
### mysql
mysql:
image: mysql
ports:
- "7706:3306"
environment:
MYSQL_ROOT_PASSWORD: "123"
MYSQL_DATABASE: "test"
MYSQL_USER: "root"
MYSQL_PASSWORD: "123"
volumes:
- ./data/mysql:/var/lib/mysql
### redis
redis:
image: redis
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
五、docker compose 制作docker示例
5.1 dockerfile 文件
# 打包项目,获得 jar 包 docker-demo-1.0.jar
mvn clean package
# 在 jar 包所在路径创建 Dockerfile 文件,添加以下内容
FROM java:8
VOLUME /tmp
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
5.2 docker-compose.yml文件
# 在 jar 包所在路径创建文件 docker-compose.yml,添加以下内容
version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
docker-demo: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9000:8761"
5.3 docker-compose up 编译
# 在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器
访问 http://localhost:9000/hello 即可访问微服务接口
docker-compose up
docker-compose up -d // 后台启动并运行容器
博文参考
命令说明 - Docker —— 从入门到实践
Docker Compose | 菜鸟教程
Docker:Docker Compose 详解 - 简书
docker -compose 容器常用命令 - 时光一寸灰 - 博客园