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!