目录
(4)docker-compose pause/unpause
官方文档地址:Overview | Docker Documentation
一、概述
Docker Compose 是 Docker 官方的编排工具通过它可以编写一个模板文件,然后通过这个模板文件快速构建和管理基于Docker容器的集群。
在创建Docker镜像之后,往往需要通过手动pull来获取镜像,然后执行 run 命令来运行。当服务器需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是非常繁琐的。
Docker Compose 技术,就是通过一个.yml 配置文件,将所有容器的部署方法、文件映射、容器连接等一系列的配置写在一个配置文件里,将所有容器的部署方法、文件映射、容器连接等一系列的配置写在一个配置文件里,最后只需要执行 docker-compose up 命令,就像执行脚本一样,去一个个安装容器并部署他们。
二、Docker Compose工作流程
Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在Compose 中可以使用 YAML 语法来配置应用服务,然后使用命令即可创建并启动配置的所有服务。使用 Compose 仅需以下三步:
(1)在 Dockerfile 里定义应用程序的环境,这样它就可以在任何地方再现。
(2)在 docker-compose.yml 里定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
(3)执行 docker-compose up 命令,Compose 启动并运行整个应用程序。
docker-compose.yml 示例:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
depends_on:
- redis
redis:
image: redis
volumes:
logvolume01: {}
三、安装Docker Compose
两种下载方式:
(1)curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
(2)curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose(GitHub比较慢,用的这个)
[root@docker01 ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 423 100 423 0 0 296 0 0:00:01 0:00:01 --:--:-- 297
100 16.2M 100 16.2M 0 0 2308k 0 0:00:07 0:00:07 --:--:-- 3221k
分配权限:
[root@docker01 ~]# chmod +x /usr/local/bin/docker-compose
查看版本信息:
[root@docker01 ~]# docker-compose --version
docker-compose version 1.25.1, build a82fef07
四、Docker Compose管理命令
Docker Compose运行时需要知道 service 名称,可以同时指定多个,也可以不指定。不指定时,默认是对配置文件中所有的 service 执行命令,常用参数如下:
-f:用于指定配置文件
-p:用于指定项目名称
(1)docker-compose build
功能:创建或重新创建服务使用的镜像
docker-compose build service_a
#创建一个名为 service_a的镜像
(2)docker-compose kill
功能:通过容器发送 SIGKILL 信号强行停止服务
(3)docker-compose logs
功能:显示 service 的日志信息
(4)docker-compose pause/unpause
功能:用于暂停或者恢复被暂停的服务
(5)docker-compose port
功能:查看服务中的端口与物理机的映射关系
#查看服务中的80端口映射到物理机的哪个端口
docker-compose port nginx_web 80
(6)docker-compose ps
功能:显示当前项目下的容器
注意:此命令与 docker ps 命令作用不同,此命令会显示停止后的容器,只针对某个项目。
(7)docker-compose pull
功能:拉取服务依赖的镜像
(8)docker-compose restart
功能:重启某个服务中的所有容器
docker-compose restart service_name
注意:只有正在运行的服务可以使用重启命令,停止的服务不可以重启。
(9)docker-compose rm
功能:删除停止的服务(服务里的容器)
常用参数:
-f:强制删除
-v:删除与容器相关的卷
(10)docker-compose run
功能:在服务中运行一个一次性的命令。这个命令会新建一个容器,它的配置和service的配置相同。
注意:
(1)run 指定的命令会直接覆盖掉 service配置中指定的命令
(2)run命令启动的容器不会创建在service配置中指定的端口,如果需要,可以使用 --service-ports 指定。
(11)docker-compose start/stop
功能:用于 启动/停止 运行某个服务的所有容器
(12)docker-compose scale
功能:指定某个服务启动的容器个数
(13)docker-compose down
功能:关闭并删除项目的所有容器
五、Docker Compose的配置文件
1. 配置文件解析
Docker Compose 的配置文件是一个 .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
整个配置文件包括三部分,分别如下:
第一部分:
指定语法的版本
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
2. 准备工作目录
(1)在 /home 目录下创建 docker目录:
[root@docker01 home]# mkdir docker
(2)在docker目录下创建nginx目录、webserver目录以及docker-compose.yml文件
[root@docker01 docker]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 7 20:07 docker-compose.yml
drwxr-xr-x 2 root root 24 Jan 7 20:04 nginx
drwxr-xr-x 2 root root 24 Jan 7 20:00 webserver
(3)创建nginx测试容器
拉取nginx镜像,先创建一个nginx的容器,将该容器的nginx.conf文件复制到宿主机的 /home/docker/nignx 目录下,然后将这个测试容器删除。
[root@docker01 docker]# docker pull nginx
[root@docker01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1403e55ab369 2 weeks ago 142MB
[root@docker01 docker]# docker run -d -p 80:80 --name nginx_test nginx
[root@docker01 docker]# docker cp nginx_test:/etc/nginx/nginx.conf /home/docker/nginx/nginx.conf
[root@docker01 docker]# docker rm -f nginx_test
(4)创建nginx访问页
在webserver目录下新建 index.html 文件,写入以下内容:
welcome to zy's nginx erver!(test docker-compose.yml)
(5)docker-comoise.yml内容
volumes挂载目录和文件:
宿主机的 ./webserver 目录与容器 /usr/share/nginx/html 目录挂载
宿主机的 ./nginx/nginx.conf 文件和容器 /etc/nginx/nginx.conf 文件挂载
version: "3"
services:
nginx:
container_name: zy_nginx
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- ./webserver:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
(6)配置文件与各关联文件或服务之间的目录结构:
[root@docker01 docker]# tree ./
./
├── docker-compose.yml
├── nginx
│ └── nginx.conf
└── webserver
└── index.html
2 directories, 3 files
3. 运行Docker Compose 配置文件
[root@docker01 docker]# docker-compose up -d
Creating network "docker_default" with the default driver
Creating zy_nginx ... done
4. 查看容器
可以看到 zy_nginx的容器已经启动
[root@docker01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c98bf0e4ecc1 nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp zy_nginx
5. 网页访问测试
可以看到成功显示了内容
六、Docker Compose配置实战
使用Docker Compose部署Nignx代理的Tomcat集群,并实现负载均衡。
整个配置过程大体分为以下4步:
(1)准备Tomcat和JDK文件(安装包)
(2)编写 Dockerfile 来部署 Tomcat 与 Java环境,生成镜像文件。
(3)编写 docker-compose.yml 配置文件,启动所有容器服务
(4)测试负载均衡
1. 准备工作目录及配置文件
需要的整个目录结构如下:
[root@docker01 java]# tree ./
./
├── docker-compose.yml
├── etc
│ └── localtime -> /usr/share/zoneinfo/Etc/UTC
├── nginx
│ └── nginx.conf
├── tomcat
│ ├── apache-tomcat-8.5.55.tar.gz
│ ├── Dockerfile
│ └── jdk-8u162-linux-x64.tar.gz
└── webserver
├── tomcatA
│ └── index.jsp
└── tomcatB
└── index.jsp
6 directories, 8 files
下面来创建这些目录和文件:
(1)创建工作目录
在宿主机的 /home目录下新建 java目录,作为工作目录:
[root@docker01 home]# mkdir java
(2)创建子目录
在java目录下,新建 etc,nginx,tomcat,webserver目录
[root@docker01 java]# mkdir {etc,nginx,tomcat,webserver}
[root@docker01 java]# ll
total 0
drwxr-xr-x 2 root root 6 Jan 7 20:45 etc
drwxr-xr-x 2 root root 6 Jan 7 20:45 nginx
drwxr-xr-x 2 root root 6 Jan 7 20:45 tomcat
drwxr-xr-x 2 root root 6 Jan 7 20:45 webserver
(3)创建一个 nginx 测试容器
将nginx 测试容器对应配置文件复制到宿主机 的etc和nginx目录下(与上面第五节的道理一样),复制完删除该测试容器:
[root@docker01 java]# docker run -d -p 80:80 --name nginx_test nginx
[root@docker01 java]# docker cp nginx_test:/etc/nginx/nginx.conf /home/java/nginx/nginx.conf
[root@docker01 java]# docker cp nginx_test:/etc/localtime /home/java/etc/localtime
[root@docker01 java]# docker rm -f nginx_test
修改 nginx.conf 文件 ,添加负载均衡配置,添加 upstream 模块和 server 模块:
[root@docker01 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
#添加 upstream模块 和 server模块
upstream webserver {
server tomcat1:8080 weight=3;
server tomcat2:8080 weight=7;
}
server {
listen 80;
listen [::]:80;
server_name 192.168.65.130; #服务器的IP
location / {
proxy_pass http://webserver; #这里的名字要和 upstream 配置的名称一致
}
}
}
(4)上传安装包并编写Dockerfile
将 Tomcat 和 JDK 安装包上传至宿主机 /home/java/tomcat 目录下,并在该目录下编写Dockerfile文件:
[root@docker01 tomcat]# ll
total 195504
-rw-r--r-- 1 root root 10371538 Jan 7 20:55 apache-tomcat-8.5.55.tar.gz
-rw-r--r-- 1 root root 236 Jan 7 21:05 Dockerfile
-rw-r--r-- 1 root root 189815615 Jan 7 20:56 jdk-8u162-linux-x64.tar.gz
Dockerfile文件内容:
FROM centos
MAINTAINER zhangyin
ADD jdk-8u162-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_162
ADD apache-tomcat-8.5.55.tar.gz /usr/local
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.5.55/bin/catalina.sh","run"]
(5)配置两个测试首页文件
在webserver目录下新建 tomcatA 和 tomcatB目录,并在各自目录下创建 index.jsp 文件。
[root@docker01 webserver]# mkdir {tomcatA,tomcatB}
[root@docker01 webserver]# cat tomcatA/index.jsp
welcome to tomcat-A server
[root@docker01 webserver]# cat tomcatB/index.jsp
welcome to tomcat-B server
(6)编写 docker-compose.yml 文件
在 /home/java 目录下编写 docker-compose.yml 文件,内容如下:
[root@docker01 java]# cat docker-compose.yml
version: "3"
services:
nginx:
container_name: zy_nginx
image: nginx:latest
restart: always
ports:
- 80:80
links:
- tomcat1:tomcat1
- tomcat2:tomcat2
volumes:
- ./webserver:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./etc/localtime:/etc/localtime
depends_on:
- tomcat1
- tomcat2
tomcat1:
hostname: tomcat1
build: ./tomcat
volumes:
- ./webserver/tomcatA:/usr/local/apache-tomcat-8.5.55/webapps/ROOT
- ./etc/localtime:/etc/localtime
tomcat2:
hostname: tomcat2
build: ./tomcat
volumes:
- ./webserver/tomcatB:/usr/local/apache-tomcat-8.5.55/webapps/ROOT
- ./etc/localtime:/etc/localtime
2. 运行并测试
(1)启动所有容器服务
在 java 目录下执行:docker-compose up 命令:
[root@docker01 java]# docker-compose up
Creating network "java_default" with the default driver
Building tomcat1
Step 1/7 : FROM centos
---> 5d0da3dc9764
Step 2/7 : MAINTAINER zhangyin
---> Running in 0cb5c3b43533
Removing intermediate container 0cb5c3b43533
---> 7512bd53d089
Step 3/7 : ADD jdk-8u162-linux-x64.tar.gz /usr/local
---> 227ea07ebb13
Step 4/7 : ENV JAVA_HOME /usr/local/jdk1.8.0_162
---> Running in fe23e3656efd
Removing intermediate container fe23e3656efd
---> 2757572ae8cb
Step 5/7 : ADD apache-tomcat-8.5.55.tar.gz /usr/local
---> 652fd5fa8af9
Step 6/7 : EXPOSE 8080
---> Running in 134eaf173653
Removing intermediate container 134eaf173653
---> 3e41b8b02647
Step 7/7 : ENTRYPOINT ["/usr/local/apache-tomcat-8.5.55/bin/catalina.sh","run"]
---> Running in cf4c5b942a27
Removing intermediate container cf4c5b942a27
---> abd13583648f
Successfully built abd13583648f
Successfully tagged java_tomcat1:latest
(2)查看启动情况
[root@docker01 java]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------
java_tomcat1_1 /usr/local/apache-tomcat-8 ... Up 8080/tcp
java_tomcat2_1 /usr/local/apache-tomcat-8 ... Up 8080/tcp
zy_nginx /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
(3)检测负载均衡
访问10次,会发现7次是tomcat-B,3次是tomcat-A,证明负载均衡实现。