一、docker-compose简介
1.简介
docker-compose官方文档
docker容器的编排工具:解决相互有依赖关系的多个容器的管理工具。
单台dockerhost上就可以同时管理(增、删、改、查等)多个容器。
docker镜像在创建后,往往需要自己手动pull来获取镜像,然后执行run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接时,部署一个服务的手动操作是比较麻烦的。
2.作用机理
通过一个.yml配置文件,将所有容器的部署方法、文件映射、容器连接等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样去一个一个安装容器并自动部署,极大的便利了复杂服务的部署。
二、安装docker-compose
1.安装
[root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# docker-compose -v
docker-compose version 1.25.0, build 0a186604
2.设置tab键的空格距离
[root@docker ~]# vim .vimrc
set tabstop=2
[root@docker ~]# source .vimrc
三、示例介绍
1.配置示例
通过识别一个docker-compose.yml的配置文件去管理容器。
[root@docker ~]# mkdir compose
[root@docker ~]# cd compose/
[root@docker compose]# vim docker-compose.yaml
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx
restart: always
ports:
- 90:80
volumes:
- ./webserver:/usr/share/nginx/html
2.格式介绍
第一部分
version指定语法格式的版本;
第二部分
services: #定义服务(想要运行什么样的容器);
nginx: #服务的名称
container_name:web-nginx #容器名称
image:nginx:latest #使用的镜像
restart: always #重启策略
ports: #端口映射
- 80:80
volumes: #挂载目录
3.运行yaml文件,自动进行容器部署
注意:运行docker-compose规定的容器。在执行这条命令的当前目录下,需要有一个docker-compose.yml的配置文件,并且通常只有一个。
(1)前台运行
[root@docker compose]# ls
docker-compose.yaml
[root@docker compose]# docker-compose up
Creating network "compose_default" with the default driver
Creating web-nginx ... done
Attaching to web-nginx
web-nginx | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web-nginx | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web-nginx | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web-nginx | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
docker-compose up后会显示都做了什么操作,并占用终端,如果想要退出终端占用,加-d选项。
(2)后台运行
[root@docker compose]# docker-compose up -d
Starting web-nginx ... done
4.停止运行
[root@docker compose]# docker-compose stop
Stopping web-nginx ... done
5.重启
[root@docker compose]# docker-compose restart
Restarting web-nginx ... done
6.运行带有Dockerfile的yaml文件
注意:在运行container的过程中,还可以支持Dockerfile。
[root@docker compose]# cd webserver/
[root@docker webserver]# echo 123 > index.html
[root@docker webserver]# cd ..
[root@docker compose]# vim Dockerfile
FROM nginx
COPY ./webserver/index.html /usr/share/nginx/html/index.html
[root@docker compose]# vim docker-compose.yaml
version: "3"
services:
nginx:
build: .
container_name: test-web
image: nginx-web:v1.0
restart: always
ports:
- 91:80
运行docker-compose命令时,如果文件内有Dockerfile,可以提前执行:docker-compose build或者在up -d的时候添加–build选项。
[root@docker compose]# docker-compose up -d --build
Building nginx
Step 1/2 : FROM nginx
---> 7e4d58f0e5f3
Step 2/2 : COPY ./webserver/index.html /usr/share/nginx/html/index.html
---> dfb587bb79ab
Successfully built dfb587bb79ab
Successfully tagged nginx-web:v1.0
Recreating web-nginx ... done
四、docker-compose管理命令介绍
1.compose具有管理应用程序整个生命周期的命令
启动、停止和重建服务;
查看正在运行的服务的状态;
流式传输运行服务的日志输出;
在服务上运行一次性命令;
2.常用命令
帮助信息
[root@docker compose]# docker-compose --help
用来创建或重新创建服务使用的镜像
[root@docker compose]# docker-compose build
Building nginx
Step 1/2 : FROM nginx
---> 7e4d58f0e5f3
Step 2/2 : COPY ./webserver/index.html /usr/share/nginx/html/index.html
---> Using cache
---> dfb587bb79ab
Successfully built dfb587bb79ab
Successfully tagged nginx-web:v1.0
用于通过容器发送SIGKILL信号强行停止服务
[root@docker compose]# docker-compose kill nginx
显示service的日志信息
[root@docker compose]# docker-compose logs
暂停和恢复服务
[root@docker compose]# docker-compose pause
docker-compose pause #暂停服务
docker-compose unpause #恢复被暂停的服务
用于查看服务中的端口与物理机的映射关系
[root@docker compose]# docker-compose port nginx 80
docker-compose port nginx_web 80 #查看服务中80端口映射到物理机上的那个端口。
用于显示当前项目下的容器
[root@docker compose]# docker-compose ps
注意:此命令与docker ps作用不同,此命令会显示停止后的容器(状态为Exited),只针对某个项目。
用于拉取服务依赖的镜像
[root@docker compose]# docker-compose pull
用于重启某个服务中的所有容器
[root@docker compose]# docker-compose restart
docker-compose restart service_name #只有正在运行的服务可以使用重启命令,停止的服务是不可以重启。
删除停止的服务(服务里的容器)
[root@docker compose]# docker-compose rm
-f #强制删除
-v #删除与容器相关的卷(volumes)
用于在服务中运行一个一次性的命令
[root@docker compose]# docker-compose run nginx ls /
这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处。
(1)run指定的命令会直接覆盖掉service配置中指定的命令;
(2)run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用–service-ports指定;
启动/停止运行某个服务的所有容器
[root@docker compose]# docker-compose start/stop
docker-compose start #启动运行某个服务的所有容器
docker-compose stop #停止运行某个服务的所有容器
指定某个服务启动的容器个数
[root@docker compose]# docker-compose scale nginx=2
注意:如果需要运行多个容器,容器名称就不要指定,会随机生成,还有注意端口映射问题,不要冲突(docker-compose port字段支持仅写一个容器暴露的端口)。
备注
docker-compose运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的service执行命令。
-f #用于指定配置文件
-p #用于指定项目名称
五、使用示例
1.搭建wordpress的博客
[root@docker compose]# vim docker-compose.yaml
version: "3.1"
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 123.com
WORDPRESS_DB_NAME: wordpress
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123.com
MYSQL_ROOT_PASSWORD: 123.com
2.部署LNMP环境
version: "3"
services:
nginx:
container_name: nginx
image: nginx
restart: always
ports:
- 90:80
volumes:
- ./wwwroot/html:/usr/share/nginx/html
- ./docker/nginx:/etc/nginx
db:
container_name: mysql
image: mysql:5.7
restart: always
ports:
- 3306:3306
environment:
MYSQL_DATABASE: nginx
MYSQL_USER: nginx
MYSQL_PASSWORD: 123.com
MYSQL_ROOT_PASSWORD: 123.com
php-fpm:
container_name: php-fpm
image: php:7.2-fpm
restart: always
ports:
- 9000:9000
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: nginx
WORDPRESS_DB_PASSWORD: 123.com
WORDPRESS_DB_NAME: nginx
volumes:
- ./wwwroot/html:/usr/share/nginx/html
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype- dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mysqli pdo pdo_mysql