zoukankan      html  css  js  c++  java
  • 单机容器编排工具之Docker Compose

    Docker Compse介绍

    当在宿主机启动较多的容器时候,如果每一个都要手动操作来启动的话会非常麻烦而且容易出错,
    并且不同的容器互相配合使用的时候有一定的依赖关系,需要按一定的次序来启动才行。

    每次启动容器前还得想一想先启动哪一个,这就更加麻烦了。而docker-compose正是用来解决这一问题的工具。

    Docker Compose是docker容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,它有点类似于ansible-playbook命令,可以自动的批量执行容器操作,从而实现自动化的容器管理,使用提前写好的docker-compose.yml文件,按一定的次序来启动,删除,操作容器。

    Docker Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排,
    docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中又定义了容器运行的镜像、参数、依赖,一个服务还可以包括多个容器实例。
    Docker Compse官方地址

    安装方法

    • 方法1:pip安装

      • Ubuntu:
      [root@ubuntu2004:~]#apt update
      [root@ubuntu2004:~]#apt install -y python3-pip
      [root@ubuntu2004:~]#pip3 install docker-compose
      [root@ubuntu2004:~]# docker-compose --version
      docker-compose version 1.27.4, build unknown
      
      • Centos:
      # 需要提前配好epel源
      [root@centos8 ~]#dnf install -y python3-pip
      [root@centos8 ~]#pip3 install docker-compose
      
    • 方法2:从github直接下载

      github下载链接

      比较推荐这种方法,可以自行选择版本。就是可能下载速度有点慢。

      [root@ubuntu2004:~]# 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    179      0  0:00:03  0:00:03 --:--:--   179
      100 11.6M  100 11.6M    0     0   483k      0  0:00:24  0:00:24 --:--:--  171k
      [root@ubuntu2004:~]# chmod +x /usr/local/bin/docker-compose
      [root@ubuntu2004:~]# docker-compose --version
      docker-compose version 1.27.4, build 40524192
      
    • 方法3:直接从包仓库下载

      仓库自带的版本比较旧,不是很推荐使用此种方法

      • Ubuntu:
      [root@ubuntu2004:~]#apt list docker-compose
      Listing... Done
      docker-compose/focal 1.25.0-1 all
      [root@ubuntu2004:~]#apt -y install docker-compose
      [root@ubuntu2004 ~]#docker-compose --version
      docker-compose version 1.25.0-1, build unknown
      
      • Centos:
      # 需要提前配好epel源
      #CentOS7安装,依赖EPEL源
      [root@centos7 ~]#yum -y install docker-compose
      [root@centos7 ~]#docker-compose --version
      docker-compose version 1.18.0, buil 8dd22a9
      
      #Centos8的epel仓库中目前还没有docker-compose包
      

    docker-compose命令的使用

    [root@ubuntu2004:~]# docker-compose --help
    Define and run multi-container applications with Docker.
    
    Usage:
      docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]
      docker-compose -h|--help
    
    Options:
      -f, --file FILE	      指定Compose文件,默认为当前目录下的docker-compose.yml
      -p, --project-name NAME     指定项目名称,默认将使用当前目录名称作为项目名
      -c, --context NAME          Specify a context name
      --verbose                   Show more output
      --log-level LEVEL           设置日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL)
      --no-ansi                   Do not print ANSI control characters
      -v, --version               Print version and exit
      -H, --host HOST             Daemon socket to connect to
    ...省略...
    
    Commands:
      build              Build or rebuild services
      config             检查当前.yml文件配置,如果文件格式有错误则报错,没有错误则打印.yml信息
      create             Create services
      down               Stop and remove containers, networks, images, and volumes
      events             Receive real time events from containers
      exec               Execute a command in a running container
      help               Get help on a command
      images             List images
      kill               Kill containers
      logs               View output from containers
      pause              Pause services
      port               Print the public port for a port binding
      ps                 List containers
      pull               Pull service images
      push               Push service images
      restart            Restart services
      rm                 删除已停止的容器
      run                Run a one-off command
      scale              Set number of containers for a service
      start              启动容器服务
      stop               停止容器服务
      top                Display the running processes
      unpause            Unpause services
      up                 创建并启动容器
      version            Show version information and quit
      
      
    # 还可以docker-compose 子命令 --help 查看更详细的帮助信息
    [root@ubuntu2004:~]# docker-compose config --help
    Validate and view the Compose file.
    
    Usage: config [options]
    
    Options:
        --resolve-image-digests  Pin image tags to digests.
        --no-interpolate         Don't interpolate environment variables.
        -q, --quiet              Only validate the configuration, don't print
                                 anything.
        --services               Print the service names, one per line.
        --volumes                Print the volume names, one per line.
        --hash="*"               Print the service config hash, one per line.
                                 Set "service1,service2" for a list of specified services
                                 or use the wildcard symbol to display all services.
    
    

    docker-compse.yml文件格式

    官方文档

    docker-compose文件的格式很多不同版本,版本不同,语法和格式有所不同。详见官方文档。

    下面给出几个范例,演示版本为最新的3.9版本。

    范例一:nginx

    [root@ubuntu2004:/data/docker-compose]# cat docker-compose.yml
    version: "3.9"
    services:
        nginx1:
            image: nginx:alpine
            restart: always
            expose:
                - 80
            ports:
                - "8080:80"
    
    # 检查.yml文件有没有错误 
    [root@ubuntu2004:/data/docker-compose]# docker-compose config
    services:
      nginx1:
        expose:
        - 80
        image: nginx:alpine
        ports:
        - published: 8080
          target: 80
        restart: always
    version: '3.9'
    
    # up是前台启动,一般会加上-d后台启动
    [root@ubuntu2004:/data/docker-compose]# docker-compose up
    Recreating docker-compose_nginx_1 ... done
    Attaching to docker-compose_nginx_1
    nginx1_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    nginx1_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    nginx1_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    nginx1_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
    nginx1_1  | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    nginx1_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    nginx1_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
    ^CGracefully stopping... (press Ctrl+C again to force)
    Stopping docker-compose_nginx1_1 ... done
    
    [root@ubuntu2004:/data/docker-compose]# docker-compose up -d
    Starting docker-compose_nginx_1 ... done
    
    # 查看容器已经启动了,并且可以访问
    [root@ubuntu2004:/data/docker-compose]# docker-compose ps
             Name                       Command               State          Ports        
    --------------------------------------------------------------------------------------
    docker-compose_nginx1_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp
    
    [root@ubuntu2004:/data/docker-compose]# curl 10.0.0.202:8080
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    # 进入容器,类似于docker exec -it nginx sh
    [root@ubuntu2004:/data/docker-compose]# docker-compose exec nginx1 sh
    / # ls
    bin                   home                  proc                  sys
    dev                   lib                   root                  tmp
    docker-entrypoint.d   media                 run                   usr
    docker-entrypoint.sh  mnt                   sbin                  var
    etc                   opt                   srv
    
    # docker-compose exec nginx1 sh这里使用的nginx1是.yml中的服务名称nginx1
    
    # docker-compose停止所有容器
    [root@ubuntu2004:/data/docker-compose]# docker-compose stop
    Stopping docker-compose_nginx1_1 ... done
    
    

    范例二:mysql

    [root@ubuntu2004:/data/docker-compose]# cat docker-compose.yml 
    version: "3.9"
    services:
        db:
            image: mysql:5.7.32
            container_name: mysql1
            network_mode: "bridge"
            expose:
                - 3306
            ports:
                - "3306:3306"
            volumes:
                - /data/mysql:/var/lib/mysql
            #environment:
                #- MYSQL_ROOT_PASSWORD=744123
            env_file: env_mysql.list
            restart: always
    
    # env文件的相对路径为.yml所在目录
    [root@ubuntu2004:/data/docker-compose]# cat env_mysql.list 
    MYSQL_ROOT_PASSWORD=744123
    
    [root@ubuntu2004:/data/docker-compose]# docker-compose config
    services:
      db:
        container_name: mysql1
        environment:
          MYSQL_ROOT_PASSWORD: '744123'
        expose:
        - 3306
        image: mysql:5.7.32
        network_mode: bridge
        ports:
        - published: 3306
          target: 3306
        restart: always
        volumes:
        - /data/mysql:/var/lib/mysql:rw
    version: '3.9'
    
    # 这里我们把docker-compose.yml改名为mysql.yml,并切换目录然后试着使用docker-compose -f命令来启动容器
    [root@ubuntu2004:/data/docker-compose]# ls
    docker-compose.yml  env_mysql.list
    [root@ubuntu2004:/data/docker-compose]# cp docker-compose.yml mysql.yml
    [root@ubuntu2004:/data/docker-compose]# ls
    docker-compose.yml  env_mysql.list  mysql.yml
    [root@ubuntu2004:/data/docker-compose]# cd
    [root@ubuntu2004:~]# 
    [root@ubuntu2004:~]# docker-compose -f /data/docker-compose/mysql.yml up -d
    Creating mysql1 ... done
    
    # 使用docker ps命令查看,没问题,启动成功了并且端口和名称都和我们指定的一样
    [root@ubuntu2004:~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    800990401cc8        mysql:5.7.32        "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql1
    
    # 但是使用docker-compose ps好像失败了
    [root@ubuntu2004:~]# docker-compose ps
    ERROR: 
            Can't find a suitable configuration file in this directory or any
            parent. Are you in the right directory?
    
            Supported filenames: docker-compose.yml, docker-compose.yaml
            
    # 我们切回到.yml目录再次执行下docker-compose ps命令
    [root@ubuntu2004:~]# cd /data/docker-compose/
    [root@ubuntu2004:/data/docker-compose]# docker-compose ps
     Name              Command             State                 Ports              
    --------------------------------------------------------------------------------
    mysql1   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
    
    # 居然没问题了,是不是很神奇,所以最好一般还是不要修改默认的docker-compose.yml文件名,也不要切出去目录执行docker-compose命令,否则可能会有很多莫名其妙的问题
    

    范例三:Wordpress + Mysql 快速搭建博客网站

    # mysql配置文件
    [root@ubuntu2004:/data/docker-compose]# cat /data/mysql_conf/mysql_test.cnf 
    [mysqld]
    server-id=201
    log-bin=mysql-bin
    
    # mysql环境变量,创建一个数据库和用户
    [root@ubuntu2004:/data/docker-compose]# cat /data/docker-compose/env_mysql.list 
    MYSQL_ROOT_PASSWORD=744123
    MYSQL_DATABASE=wordpress
    MYSQL_USER=wpuser
    MYSQL_PASSWORD=123456
    
    # wordpress环境变量,指定数据库相关信息
    [root@ubuntu2004:/data/docker-compose]# cat /data/docker-compose/env_wordpress.list 
    WORDPRESS_DB_HOST=mysql:3306			<<== 这里使用容器名称来代替IP
    WORDPRESS_DB_NAME=wordpress
    WORDPRESS_DB_USER=wpuser
    WORDPRESS_DB_PASSWORD=123456
    WORDPRESS_TABLE_PREFIX=wp_
    
    # compose文件
    [root@ubuntu2004:/data/docker-compose]# cat docker-compose.yml 
    version: "3.9"
    services:
        db:
            image: mysql:5.7.32
            container_name: mysql
            expose:
                - 3306
            ports:
                - "3306:3306"
            volumes:
                - /data/mysql/:/var/lib/mysql/
                - /data/mysql_conf/:/etc/mysql/conf.d/
            env_file: env_mysql.list
            restart: always
    
        wordpress:
            image: wordpress
            container_name: wordpress
            ports:
                - 80:80
            volumes:
                - /data/wp_html/:/var/www/html/
            env_file: env_wordpress.list
            links:
                - "db:mysql"
            restart: always
            
    [root@ubuntu2004:/data/docker-compose]# docker-compose config
    services:
      db:
        container_name: mysql
        environment:
          MYSQL_DATABASE: wordpress
          MYSQL_PASSWORD: '123456'
          MYSQL_ROOT_PASSWORD: '744123'
          MYSQL_USER: wpuser
        expose:
        - 3306
        image: mysql:5.7.32
        ports:
        - published: 3306
          target: 3306
        restart: always
        volumes:
        - /data/mysql:/var/lib/mysql:rw
        - /data/mysql_conf:/etc/mysql/conf.d:rw
      wordpress:
        container_name: wordpress
        environment:
          WORDPRESS_DB_HOST: mysql:3306
          WORDPRESS_DB_NAME: wordpress
          WORDPRESS_DB_PASSWORD: '123456'
          WORDPRESS_DB_USRE: wpuser
          WORDPRESS_TABLE_PREFIX: wp_
        image: wordpress
        links:
        - db:mysql
        ports:
        - published: 80
          target: 80
        restart: always
        volumes:
        - /data/wp_html:/var/www/html:rw
    version: '3.9'
           
    # 使用docker-compose启动服务
    [root@ubuntu2004:/data/docker-compose]# docker-compose up -d
    Creating network "docker-compose_default" with the default driver
    Pulling wordpress (wordpress:)...
    latest: Pulling from library/wordpress
    852e50cd189d: Already exists
    0266fc315b01: Pull complete
    4c8a5fa787a1: Pull complete
    46fc127c1884: Pull complete
    f768b7fadf16: Pull complete
    345b578c1a78: Pull complete
    90aafe41e78d: Pull complete
    af01fae4e5fc: Pull complete
    9e463236c8bc: Pull complete
    cd12b0a220f2: Pull complete
    d9f76220cef4: Pull complete
    c09cf9a96ea9: Pull complete
    6dda8bec068c: Pull complete
    fd36a10c28fe: Pull complete
    e11e483ab28e: Pull complete
    ab40cb22800e: Pull complete
    b08636db59dd: Pull complete
    d2c7678bc02b: Pull complete
    f903e014412a: Pull complete
    114ff1eb7cb0: Pull complete
    Digest: sha256:92e97d9b3147038e3cc541a224cc951bef597061827e23a208a24c36bff1c1fe
    Status: Downloaded newer image for wordpress:latest
    Creating mysql     ... done
    Creating wordpress ... done
    
    # 查看端口,发现80端口已经打开了
    [root@ubuntu2004:/data/docker-compose]# ss -nlt
    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port   Process    
    LISTEN    0         4096         127.0.0.53%lo:53              0.0.0.0:*                 
    LISTEN    0         128                0.0.0.0:22              0.0.0.0:*                 
    LISTEN    0         128              127.0.0.1:6010            0.0.0.0:*                 
    LISTEN    0         128              127.0.0.1:6011            0.0.0.0:*                 
    LISTEN    0         4096               0.0.0.0:111             0.0.0.0:*                 
    LISTEN    0         128                   [::]:22                 [::]:*                 
    LISTEN    0         128                  [::1]:6010               [::]:*                 
    LISTEN    0         128                  [::1]:6011               [::]:*                 
    LISTEN    0         4096                     *:3306                  *:*                 
    LISTEN    0         4096                  [::]:111                [::]:*                 
    LISTEN    0         4096                     *:80                    *:*         
    

    web端测试访问一下,哎,成功了。

    稍加设置,一个wordpress博客就这样简单的搭好了!是不是很轻松愉快啊@_@ ~

    D3VpOx.png

  • 相关阅读:
    二分查找
    二分排序
    How to use hdu?
    HGOI 20200721
    HGOI 20200720
    HGOI 20190719
    HGOI 20200716
    HGOI 20190714
    LCA 的一些扩展算法
    HGOI 20190711
  • 原文地址:https://www.cnblogs.com/wuvikr/p/14017082.html
Copyright © 2011-2022 走看看