docker-compose-docker集群的快速编排
docker-compose
该项目是docker官方开源的一个项目
负责实现对docker集群的快速编排
docker-compose将所管理的容器分为三层
project(工程) 也就是目录
service(服务) yml文件中的容器(可以多个)
container(容器)服务:一个应用的容器,实际上可以包含若干个相同镜像的容器实例
工程: 又一组关联的应用容器做成一个完整的业务单元,在docker-compose.yml中定义
docker-compose目录下的所有文件组成一个工程,如果没有指定的工程名,那么就为当前目录名
一个工程可以包含多个服务,每个服务定义了容器运行的镜像,参数,依赖
一个服务当中可以包含多个容器实例
docker-compose没有实现负载均衡的问题,所以需要借助其他工具实现服务发现和负载均衡
可以将docker-compose间接理解为ansible,可以使用ansible为多台主机部署服务,而docker-compose可以创建多个容器服务
docker-compose项目整个结构是由python完成的,调用docker服务来提供API对容器进行管理,因此操作的平台支持docker API,就可以通过docker-compose进行服务的编排Docker Compose的工程配置文件默认为docker-compose.yml
安装
https://docs.docker.com/compose/install/ 中可以找到安装方法
linux安装
# 将docker-compose脚本下载到/usr/local/bin/下 [root@localhost ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/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 651 100 651 0 0 305 0 0:00:02 0:00:02 --:--:-- 305 100 11.6M 100 11.6M 0 0 1650k 0 0:00:07 0:00:07 --:--:-- 2520k # 设置权限 [root@localhost ~]# chmod +x /usr/local/bin/docker-compose # 软连接到path路径 [root@localhost ~]# ln -s /usr/local/bin/docker-compose /usr/bin/ # 查看版本号 [root@localhost ~]# docker-compose -v docker-compose version 1.27.4, build 40524192
docker-compose.yml语法
- 如果要编排的容器较多,建议使用目录将docker-compose.yml分隔开
创建工程目录
[root@localhost ~]# mkdir test [root@localhost ~]# cd test/
编写yml文件
[root@localhost test]# vim docker-compose.yml nginx: container_name: nginx_lmk image: nginx:latest ports: - "80:80" volumes: - /www/html/:/usr/share/nginx/html hostname: nginx_lmk.com nginx-two: container_name: nginx_kml image: nginx:latest ports: - "81:80" volumes: - /www/html/:/usr/share/nginx/html hostname: nginx_kml.com
运行yml文件
[root@localhost test]# docker-compose up -d Creating nginx_lmk ... done Creating nginx_kml ... done [root@localhost test]# docker-compose ps Name Command State Ports ----------------------------------------------------------------------- nginx_kml /docker-entrypoint.sh ngin ... Up 0.0.0.0:81->80/tcp nginx_lmk /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp
写入一个简单的index.html并访问
[root@localhost test]# echo 'hello_lmk' > /www/html/index.html [root@localhost test]# curl 192.168.100.211 hello_lmk [root@localhost test]# curl 192.168.100.211:81 hello_lmk
docker-compose 命令
创建容器
docker-compose up -d
-d 容器后台启动停止
docker-compose stop
docker-compose kill删除容器
docker-compose rm
启动
docker-compose start
下载 (只下载yml文件的镜像)
docker-compose pull
开启的容器只有停止后才可以删除
接上面的yml文件
如果将docker-compose.yml修改为nginx.yml 就需要指定文件名运行了
[root@localhost test]# mv docker-compose.yml nginx.yml [root@localhost test]# docker-compose -f nginx.yml -p myweb up -d Creating nginx_lmk ... done Creating nginx_kml ... done # -f 指定yml文件名 # -p 指定项目名 [root@localhost test]# docker-compose -f nginx.yml -p myweb ps Name Command State Ports ----------------------------------------------------------------------- nginx_kml /docker-entrypoint.sh ngin ... Up 0.0.0.0:81->80/tcp nginx_lmk /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp # 这种方法很麻烦,所以尽量用不同的目录区别容器
docker-compose部署wordpress
- 实例
编写yml文件
以下为正规写法[root@localhost test]# vim docker-compose.yml version: '3' # 指定版本号 services: # 服务标签 db: # 容器标签——随意写就是容器名 image: mysql:5.7 # 指定容器的镜像 volumes: # 将data_data映射到容器的mysql目录 - db_data:/var/lib/mysql restart: always # 容器遇到错误会重启 environment: # 定义参数 MYSQL_ROOT_PASSWORD: 123.com # 设置mysql的root密码 MYSQL_DATABASE: kml # 创建mysql的一个库 MYSQL_USER: lmk # 创建一个mysql的用户 MYSQL_PASSWORD: 123.com # 设置mysql lmk这个用户的密码 wordpress: # 容器标签 depends_on: # 以依赖顺序启动 这里依赖的是上面的db容器,如果上面的失败这个也就不启动了 - db image: wordpress:latest # 指定镜像 links: # 使用links可以将db容器的ip记录到该容器中 - db volumes: # 将wp_site映射到html目录 - wp_site:/var/www/html ports: # 指定映射端口 相当于 docker run -p这个 - "80:80" - "443:443" restart: always # 容器遇到错误重启 和 --restart 一样 environment: # 定义参数 WORDPRESS_DB_HOST: db:3306 # 指定要连接的数据库 这里db之前links了就不用写ip了 WORDPRESS_DB_USER: lmk # 指定数据库的用户 WORDPRESS_DB_PASSWORD: 123.com # 指定数据库lmk用户的密码 volumes: # 创建卷 db_data: # 一个卷 wp_site: # 两个卷
启动容器
[root@localhost test]# docker-compose up -d Creating test_db_1 ... done Creating test_wordpress_1 ... done
查看一些数据
# yml文件最后创建的卷 [root@localhost test]# docker volume ls DRIVER VOLUME NAME local test_db_data local test_wp_site # 查看容器启动情况 [root@localhost test]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------- test_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp test_wordpress_1 docker-entrypoint.sh apach Up 0.0.0.0:443->443/tcp, ... 0.0.0.0:80->80/tcp # 查看容器的挂载信息 [root@localhost test]# docker inspect test_wordpress_1 "Mounts": [ { "Type": "volume",# 挂载类型 "Name": "test_wp_site", # 卷名 "Source": "/var/lib/docker/volumes/test_wp_site/_data", # 源地址(物理机地址) "Destination": "/var/www/html", # 挂载地址(容器地址) "Driver": "local", # 类型 "Mode": "rw", # 可读写 "RW": true, #是否读写 "Propagation": "" # 传播方向 } ], # 进入目录 可以看到已经持久化出来了 [root@localhost test]# cd /var/lib/docker/volumes/test_wp_site/_data [root@localhost _data]# ls index.php wp-blog-header.php wp-cron.php wp-mail.php license.txt wp-comments-post.php wp-includes wp-settings.php readme.html wp-config.php wp-links-opml.php wp-signup.php wp-activate.php wp-config-sample.php wp-load.php wp-trackback.php wp-admin wp-content wp-login.php xmlrpc.php
指定网卡
- 编写yml文件
[root@localhost test]# vim docker-compose.yml version: '3' # 版本 services: #服务 web1: #容器名 image: nginx # 镜像 ports: # 映射端口 - "8080:80" container_name: 'web1' # 容器的名字 networks: # 指定网卡 - dev # dev网卡 web2: image: nginx ports: - "8082:80" container_name: "web2" networks: - pro - dev web3: image: nginx ports: - '8083:80' container_name: 'web3' networks: - pro networks: # 创建网卡 dev: # 创建dev网卡 driver: bridge # 指定网卡类型 pro: driver: bridge
运行yml文件
[root@localhost test]# docker-compose up -d Creating web2 ... done Creating web1 ... done Creating web3 ... done
查看网络
# 多出来两块网卡了 [root@localhost test]# docker network ls NETWORK ID NAME DRIVER SCOPE 8e8ce96b6c6b bridge bridge local dc088ea51e19 host host local cec68349a7d5 none null local e6b06fcb2ec9 test_default bridge local 2ed0fa1a71ea test_dev bridge local 0bc547f8aa6e test_pro bridge local # 查看映射端口 [root@localhost test]# docker-compose port --protocol=tcp web1 80 0.0.0.0:8080 [root@localhost test]# docker-compose port --protocol=tcp web2 80 0.0.0.0:8082 [root@localhost test]# docker-compose port --protocol=tcp web3 80 0.0.0.0:8083 # 访问本机的映射端口即可 # 另外 web1 和 web3 不可以通讯,因为不是一块网卡 # web2可以和web1和web3通讯
build的使用
- build可以指定dockerfile文件
- 先将dockerfile文件构建成镜像,在通过镜像启动容器
创建目录结构_写入dockerfile文件
[root@localhost test]# mkdir dockerfile [root@localhost test]# cd dockerfile/ [root@localhost dockerfile]# mkdir htdocs [root@localhost dockerfile]# echo 'hello' > htdocs/index.html [root@localhost dockerfile]# vim Dockerfile FROM httpd ADD htdocs /usr/local/apache2/htdocs VOLUME /usr/local/apache2/htdocs [root@localhost test]# vim docker-compose.yml version: '3' # 版本号 services: # 服务 web_httpd: # 容器名 build: ./dockerfile # dockerfile文件地址 ports: # 映射端口号 - '6061:80' container_name: web123 # 容器内的名字 networks: # 指定网卡 - my_net networks: # 创建网卡 my_net: driver: bridge
启动docker-compose
[root@localhost dockerfile]# docker-compose up -d
WARNING: Found orphan containers (web3, test_db_1, web2, web1, test_wordpress_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Building web_httpd
Step 1/3 : FROM httpd:latest
---> 417af7dc28bc
Step 2/3 : ADD htdocs /usr/local/apache2/htdocs
---> 3038a3891823
Step 3/3 : VOLUME /usr/local/apache2/htdocs
---> Running in 2158337298da
Removing intermediate container 2158337298da
---> df9020772424
Successfully built df9020772424
Successfully tagged test_web_httpd:latest
WARNING: Image for service web_httpd was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating web123 ... done
# 访问
[root@localhost dockerfile]# curl 192.168.100.211:6061
hello
- 会先构建镜像,在基于镜像创建容器
容器扩展
- 根据上面的docker-compose.yml文件扩展5台容器
[root@localhost test]# vim docker-compose.yml version: '3' services: web_httpd: build: ./dockerfile ports: - '80' networks: - my_net networks: my_net: driver: bridge
扩展容器
[root@localhost test]# docker-compose up -d --scale web_httpd=5 --no-recreate Creating test_web_httpd_1 ... done Creating test_web_httpd_2 ... done Creating test_web_httpd_3 ... done Creating test_web_httpd_4 ... done Creating test_web_httpd_5 ... done # --scale 容器的名字=几台 # --no-recreate 不回重复扩展容器
docker-compose.yml补充
- volumes_from 挂载容器卷
volumes_from: - data1 - data2 # 将本地的容器卷挂载到当前这个容器
- dns 指定dns地址
dns:8.8.8.8 # 指定一个dns dns: # 指定多个dns - 114.114.114.114 - 8.8.8.8
本博客所有文章是以学习为目的,如果有不对的地方可以一起交流沟通共同学习 邮箱:1248287831@qq.com!