前面学习过了Dockerfile文件,使用 docker build、docker run 等命令操作容器。
今天学习了Docker Compose,理解上它是管理容器的工具。
为什么这么说呢?首先Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)。
Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,一个服务可包括多个容器实例。
用来做什么呢?现在我们开发时系统都采用微服务,所以就会有很的服务jar包需要部署。每个微服务都要手动启停,很难运维;这就需要docker提前配置好,然后一键启动和关闭。
实例
这里简单对同一个jar包,启动两个服务。
- 安装 Docker Compose
安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
查看安装是否成功
[root@localhost home]# docker-compose -v
docker-compose version 1.21.2, build a133471
已经事先上传好jar文件到宿主机上
[root@localhost home]# ls
eureka-server-0.0.1-SNAPSHOT.jar
创建并编辑Dockerfile,因为文件里jar文件是相对地址,所以Dockerfile要与jar文件放到同一目录
touch Dockerfile
vi Dockerfile
FROM java:8
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8761
ENTRYPOINT ["sh","-c","java -jar /app.jar"]
创建文件 docker-compose.yml
version: '3' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
docker-demo: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9000:8761"
docker-demo2: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9001:8761"
在docker-compose.yml目录下执行
docker-compose up -d // 后台启动并运行容器
此时查看docker进程,可以看到新启动两个容器
[root@localhost home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2fe5298b668 home_docker-demo2 "sh -c 'java -jar /a…" About an hour ago Up 4 seconds 0.0.0.0:9001->8761/tcp home_docker-demo2_1
3f5f46ebd5b4 home_docker-demo "sh -c 'java -jar /a…" About an hour ago Up About an hour 0.0.0.0:9000->8761/tcp home_docker-demo_1
同时查看镜像
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
home_docker-demo2 latest 956acfca80ff About an hour ago 694MB
home_docker-demo latest 956acfca80ff About an hour ago 694MB
以上表示docker-compose up 命令会自动构建镜像并使用镜像启动容器
常用命令
这里的命令都是基于docker-compose.yml里配置的services服务来执行的。
version: '3' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
docker-demo: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9000:8761"
docker-demo2: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9001:8761"
- ps:列出所有运行容器
[root@localhost home]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
home_docker-demo2_1 sh -c java -jar /app.jar Up 0.0.0.0:9001->8761/tcp
home_docker-demo_1 sh -c java -jar /app.jar Up 0.0.0.0:9000->8761/tcp
- port:列出绑定的公共端口,
##列出docker-demo服务的8761的对外端口
[root@localhost home]# docker-compose port docker-demo 8761
0.0.0.0:9000
##列出docker-demo2服务的8761的对外端口
[root@localhost home]# docker-compose port docker-demo2 8761
0.0.0.0:9001
- stop:停止已运行的服务的容器
##停止docker-demo服务
[root@localhost home]# docker-compose stop docker-demo
Stopping home_docker-demo_1 ... done
##查看运行容器,发现home_docker-demo_1已停
[root@localhost home]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
home_docker-demo2_1 sh -c java -jar /app.jar Up 0.0.0.0:9001->8761/tcp
home_docker-demo_1 sh -c java -jar /app.jar Exit 137
##查看docker进程,容器home_docker-demo_1已停
[root@localhost home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2fe5298b668 home_docker-demo2 "sh -c 'java -jar /a…" About an hour ago Up 15 minutes 0.0.0.0:9001->8761/tcp home_docker-demo2_1
3f5f46ebd5b4 home_docker-demo "sh -c 'java -jar /a…" About an hour ago Exited (137) 28 seconds ago home_docker-demo_1
- start:启动指定服务已存在的容器
##启动docker-demo服务
[root@localhost home]# docker-compose start docker-demo
Starting docker-demo ... done
##查看运行容器,发现home_docker-demo_1运行中
[root@localhost home]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
home_docker-demo2_1 sh -c java -jar /app.jar Up 0.0.0.0:9001->8761/tcp
home_docker-demo_1 sh -c java -jar /app.jar Up 0.0.0.0:9000->8761/tcp
##查看docker进程,容器home_docker-demo_1运行中
[root@localhost home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2fe5298b668 home_docker-demo2 "sh -c 'java -jar /a…" 2 hours ago Up 19 minutes 0.0.0.0:9001->8761/tcp home_docker-demo2_1
3f5f46ebd5b4 home_docker-demo "sh -c 'java -jar /a…" 2 hours ago Up 8 seconds 0.0.0.0:9000->8761/tcp home_docker-demo_1
- kill 直接停止并删除容器 ,类似 stop + rm
##kill掉服务
[root@localhost home]# docker-compose kill docker-demo
Killing home_docker-demo_1 ... done
##查看容器已经被删除
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2fe5298b668 home_docker-demo2 "sh -c 'java -jar /a…" 2 hours ago Up 27 minutes 0.0.0.0:9001->8761/tcp home_docker-demo2_1
e1d3b10e5b87 mysql:5.7 "docker-entrypoint.s…" 18 hours ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp test-mysql
[root@localhost home]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
home_docker-demo2_1 sh -c java -jar /app.jar Up 0.0.0.0:9001->8761/tcp
home_docker-demo_1 sh -c java -jar /app.jar Exit 137