• docker-compose初试及命令基础


    转自:https://www.cnblogs.com/jsonhc/p/7811929.html

    以一个简单的lnmp.yaml的配置文件进行讲解docker-compose命令的基础讲解,熟练掌握命令

    复制代码
    [root@docker lnmp]# cat lnmp.yaml 
    version: '3'
    services:
      nginx:
        image: nginx
        ports:
          - "80:80"
        links:
          - php:php
        volumes:
          - "/www:/usr/local/nginx/html"
      php:
        image: php
        expose:
          - "9000"
        volumes:
          - "/www:/usr/local/nginx/html"
      db:
        image: mysql
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: redhat
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
    复制代码

    上面配置文件的关于编写的参数暂时不进行讲解,这里只进行关于docker-compose的命令

    [root@docker ~]# docker-compose --help     
    Define and run multi-container applications with Docker.
    
    Usage:
      docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
      docker-compose -h|--help

    看用法的定义就是利用docker定义和运行多个容器应用

    Options:
      -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
      -p, --project-name NAME     Specify an alternate project name (default: directory name)

    默认如果没有指定具体的compose配置文件,那么就docker-compose.yml,并且如果不指定项目名称,默认就是文件夹的name

    up                 Create and start containers

    现在利用command中的up进行创建并启动容器(多个容器,安装配置文件中,至于顺序现在不讲解)

    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml up
    Creating lnmp_php_1 ... 
    Creating lnmp_db_1 ... 
    Creating lnmp_db_1
    Creating lnmp_php_1 ... done
    Creating lnmp_nginx_1 ... 
    Creating lnmp_db_1 ... done
    复制代码

    后面的一大堆输出,这里不进行全部显示了,创建并启动好了容器后,如何查看运行的状态呢?

    ps                 List containers
    [root@docker lnmp]# docker-compose ps          
    Name   Command   State   Ports
    ------------------------------

    为什么这里没有显示呢?因为配置文件名称不是docker-compose.yml,所以在执行一系列命令时需要加上-f lnmp.yaml

    [root@docker lnmp]# docker-compose -f lnmp.yaml ps
        Name                  Command               State           Ports         
    ------------------------------------------------------------------------------
    lnmp_db_1      docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp    
    lnmp_php_1     /usr/local/php/sbin/php-fpm      Up      9000/tcp  

    由于配置文件lnmp.yaml在当前目录,这里可以进行绝对路径:

    [root@docker lnmp]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml  ps
        Name                  Command               State           Ports         
    ------------------------------------------------------------------------------
    lnmp_db_1      docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp    
    lnmp_php_1     /usr/local/php/sbin/php-fpm      Up      9000/tcp

    由上面可以看出将所有的容器都显示出来,如何指定显出某一个容器呢?

    [root@docker ~]# docker-compose ps --help
    List containers.
    
    Usage: ps [options] [SERVICE...]

    一般的command命令都可以带上SERVICE,这里的service是什么呢?就是配置文件中定义的services服务,配置文件中定义了三个:nginx、php、db(不能写错service名称)

    [root@docker lnmp]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml  ps nginx
        Name                  Command               State         Ports       
    --------------------------------------------------------------------------
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp

    name这一列代表的是容器名称,而不是service名称

    [root@docker lnmp]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    a5747e115947        nginx               "/usr/local/nginx/..."   6 minutes ago       Up 6 minutes        0.0.0.0:80->80/tcp       lnmp_nginx_1
    508ac0a6890c        php                 "/usr/local/php/sb..."   6 minutes ago       Up 6 minutes        9000/tcp                 lnmp_php_1
    aaa3cc6f1040        mysql               "docker-entrypoint..."   6 minutes ago       Up 6 minutes        0.0.0.0:3306->3306/tcp   lnmp_db_1

    name的组成由project+service组成(后面的_1本人认为是构建的次数,第一次构建up就代表1吧)

    If you change a service’s Dockerfile or the contents of its build directory, run docker-compose build to rebuild it.
    docker-compose up --build或者docker-compose build

    config:

    config             Validate and view the Compose file

    利用config命令可以打印处配置文件的内容和service名称以及volumes信息

    [root@docker lnmp]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml config --services
    php
    nginx
    db
    复制代码
    [root@docker lnmp]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml config 
    services:
      db:
        environment:
          MYSQL_DATABASE: wordpress
          MYSQL_PASSWORD: wordpress
          MYSQL_ROOT_PASSWORD: redhat
          MYSQL_USER: wordpress
        image: mysql
        ports:
        - 3306:3306/tcp
      nginx:
        image: nginx
        links:
        - php:php
        ports:
        - 80:80/tcp
        volumes:
        - /www:/usr/local/nginx/html:rw
      php:
        expose:
        - '9000'
        image: php
        volumes:
        - /www:/usr/local/nginx/html:rw
    version: '3.0'
    复制代码
    [root@docker lnmp]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml config --volumes

    down:停止并删除容器、网络、镜像、数据卷

    down               Stop and remove containers, networks, images, and volumes
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml down
    Stopping lnmp_nginx_1 ... done
    Stopping lnmp_db_1    ... done
    Stopping lnmp_php_1   ... done
    Removing lnmp_nginx_1 ... done
    Removing lnmp_db_1    ... done
    Removing lnmp_php_1   ... done
    Removing network lnmp_default
    [root@docker lnmp]# docker-compose -f lnmp.yaml ps  
    Name   Command   State   Ports
    ------------------------------
    [root@docker lnmp]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    复制代码

    down也带有其他的参数:

    复制代码
    Options:
        --rmi type          Remove images. Type must be one of:
                            'all': Remove all images used by any service.
                            'local': Remove only images that don't have a custom tag
                            set by the `image` field.
        -v, --volumes       Remove named volumes declared in the `volumes` section
                            of the Compose file and anonymous volumes
                            attached to containers.
        --remove-orphans    Remove containers for services not defined in the
                            Compose file
    复制代码

    exec:在运行的容器中执行命令:

    exec               Execute a command in a running container
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml exec db env   
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=aaa3cc6f1040
    TERM=xterm
    MYSQL_ROOT_PASSWORD=redhat
    MYSQL_PASSWORD=wordpress
    MYSQL_USER=wordpress
    MYSQL_DATABASE=wordpress
    GOSU_VERSION=1.7
    MYSQL_MAJOR=5.7
    MYSQL_VERSION=5.7.20-1debian8
    HOME=/root
    复制代码

    db是指定了在哪一个service中执行env命令

    images:列出镜像

    [root@docker lnmp]# docker-compose -f lnmp.yaml images
     Container     Repository    Tag       Image Id      Size 
    ----------------------------------------------------------
    lnmp_db_1      mysql        latest   5709795eeffa   389 MB
    lnmp_nginx_1   nginx        latest   c3babfeba09b   551 MB
    lnmp_php_1     php          latest   8902ce599658   1 GB  

    参数-q:列出镜像的id

    [root@docker lnmp]# docker-compose -f lnmp.yaml images -q
    5709795eeffac51eca46cf40ab36669aad27e8cb4b0e91876d5e9f7bafad6acb
    c3babfeba09bab70a8e3b7e8d734ee274af4a02ed8b9b4d286cd58caf64dbdc5
    8902ce599658633ee95e270843b37daabe2e0dc298861ac8c25f5f7e11a7de1e

    kill:杀死容器

    kill               Kill containers
    复制代码
    [root@docker ~]# docker-compose kill --help  
    Force stop service containers.
    
    Usage: kill [options] [SERVICE...]
    
    Options:
        -s SIGNAL         SIGNAL to send to the container.
                          Default signal is SIGKILL.
    复制代码

    可以看见后面也可以指定哪一个service

    logs:将容器中的日志进行输出

    logs               View output from containers
    复制代码
    [root@docker ~]# docker-compose logs --help 
    View output from containers.
    
    Usage: logs [options] [SERVICE...]
    
    Options:
        --no-color          Produce monochrome output.
        -f, --follow        Follow log output.
        -t, --timestamps    Show timestamps.
        --tail="all"        Number of lines to show from the end of the logs
                            for each container.
    复制代码

    将db的日志输出最后的10行:

    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml logs -t --tail db      
    ERROR: tail flag must be all or a number
    [root@docker lnmp]# docker-compose -f lnmp.yaml logs -t --tail="10" db
    Attaching to lnmp_db_1
    db_1     | 2017-11-09T14:48:24.618652188Z 2017-11-09T14:48:24.618090Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
    db_1     | 2017-11-09T14:48:24.618654153Z 2017-11-09T14:48:24.618104Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
    db_1     | 2017-11-09T14:48:24.621872173Z 2017-11-09T14:48:24.620524Z 0 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
    db_1     | 2017-11-09T14:48:24.621897721Z 2017-11-09T14:48:24.620616Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
    db_1     | 2017-11-09T14:48:24.658532597Z 2017-11-09T14:48:24.658110Z 0 [Note] Event Scheduler: Loaded 0 events
    db_1     | 2017-11-09T14:48:24.660827605Z 2017-11-09T14:48:24.658335Z 0 [Note] mysqld: ready for connections.
    db_1     | 2017-11-09T14:48:24.660852816Z Version: '5.7.20'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
    db_1     | 2017-11-09T14:48:24.660857339Z 2017-11-09T14:48:24.658347Z 0 [Note] Executing 'SELECT * FROM INFORMATION_SCHEMA.TABLES;' to get a list of tables using the deprecated partition engine. You may use the startup option '--disable-partition-engine-check' to skip this check. 
    db_1     | 2017-11-09T14:48:24.660861018Z 2017-11-09T14:48:24.658349Z 0 [Note] Beginning of list of non-natively partitioned tables
    db_1     | 2017-11-09T14:48:24.679766350Z 2017-11-09T14:48:24.679398Z 0 [Note] End of list of non-natively partitioned tables
    复制代码

    pause:暂停service:

    pause              Pause services
    [root@docker ~]# docker-compose pause --help
    Pause services.
    
    Usage: pause [SERVICE...]

    将db这个service进行暂停:

    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml pause db
    Pausing lnmp_db_1 ... done
    [root@docker lnmp]# docker-compose -f lnmp.yaml ps
        Name                  Command               State            Ports         
    -------------------------------------------------------------------------------
    lnmp_db_1      docker-entrypoint.sh mysqld      Paused   0.0.0.0:3306->3306/tcp
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up       0.0.0.0:80->80/tcp    
    lnmp_php_1     /usr/local/php/sbin/php-fpm      Up       9000/tcp 
    复制代码

    unpause:将暂停的service进行恢复:

    unpause            Unpause services
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml unpause db
    Unpausing lnmp_db_1 ... done
    [root@docker lnmp]# docker-compose -f lnmp.yaml ps
        Name                  Command               State           Ports         
    ------------------------------------------------------------------------------
    lnmp_db_1      docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp    
    lnmp_php_1     /usr/local/php/sbin/php-fpm      Up      9000/tcp 
    复制代码

    port:查看端口映射信息:

    port               Print the public port for a port binding
    复制代码
    [root@docker ~]# docker-compose port --help 
    Print the public port for a port binding.
    
    Usage: port [options] SERVICE PRIVATE_PORT
    
    Options:
        --protocol=proto  tcp or udp [default: tcp]
        --index=index     index of the container if there are multiple
                          instances of a service [default: 1]
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml port db 3306
    0.0.0.0:3306

    restart:重启service:

    restart            Restart services
    复制代码
    [root@docker ~]# docker-compose restart --help
    Restart running containers.
    
    Usage: restart [options] [SERVICE...]
    
    Options:
      -t, --timeout TIMEOUT      Specify a shutdown timeout in seconds.
                                 (default: 10)
    复制代码

    将nginx这个service进行重启:

    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml restart nginx
    Restarting lnmp_nginx_1 ... done
    [root@docker lnmp]# docker-compose -f lnmp.yaml ps
        Name                  Command               State           Ports         
    ------------------------------------------------------------------------------
    lnmp_db_1      docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
    lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp    
    lnmp_php_1     /usr/local/php/sbin/php-fpm      Up      9000/tcp 
    复制代码

    rm:删除已经停止的服务容器,没有停止删除不了

    rm                 Remove stopped containers
    复制代码
    [root@docker ~]# docker-compose rm --help
    Removes stopped service containers.
    
    By default, anonymous volumes attached to containers will not be removed. You
    can override this with `-v`. To list all volumes, use `docker volume ls`.
    
    Any data which is not in a volume will be lost.
    
    Usage: rm [options] [SERVICE...]
    
    Options:
        -f, --force   Don't ask to confirm removal
        -s, --stop    Stop the containers, if required, before removing
        -v            Remove any anonymous volumes attached to containers
        -a, --all     Deprecated - no effect.
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml rm
    No stopped containers

    如果加上-s/--stop那么就会先将服务进行停止,然后询问你是否删除:

    [root@docker lnmp]# docker-compose -f lnmp.yaml rm -s db
    Stopping lnmp_db_1 ... done
    Going to remove lnmp_db_1
    Are you sure? [yN] 

    -f:代表在删除的过程中不会询问你是否删除,而是直接进行删除

    run:运行一次性命令

    run                Run a one-off command
    [root@docker ~]# docker-compose run --help
    Run a one-off command on a service.
    
    For example:
    
        $ docker-compose run web python manage.py shell

    scale:扩展容器,为service设置多个容器:

    scale              Set number of containers for a service
    复制代码
    [root@docker ~]# docker-compose scale --help
    Set number of containers to run for a service.
    
    Numbers are specified in the form `service=num` as arguments.
    For example:
    
        $ docker-compose scale web=2 worker=3
    
    This command is deprecated. Use the up command with the `--scale` flag
    instead.
    
    Usage: scale [options] [SERVICE=NUM...]
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml scale nginx=2
    WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.

    而且在创建多个容器时需要考虑端口及ip的监听状况(占用的情况)

    start              Start services

    stop               Stop services

    [root@docker lnmp]# docker-compose -f lnmp.yaml stop db
    Stopping lnmp_db_1 ... done
    [root@docker lnmp]# docker-compose -f lnmp.yaml start db
    Starting db ... done

    top:显示运行的进程

    top                Display the running processes
    复制代码
    [root@docker lnmp]# docker-compose -f lnmp.yaml top
    lnmp_db_1
      UID       PID    PPID    C   STIME   TTY     TIME      CMD  
    --------------------------------------------------------------
    systemd+   38246   38223   7   23:27   ?     00:00:00   mysqld
    
    lnmp_nginx_1
    UID     PID    PPID    C   STIME   TTY     TIME                                   CMD                               
    --------------------------------------------------------------------------------------------------------------------
    root   38367   38352   1   23:27   ?     00:00:00   nginx: master process /usr/local/nginx/sbin/nginx -g daemon off;
    www    38421   38367   0   23:27   ?     00:00:00   nginx: worker process                                           
    
    lnmp_php_1
    UID     PID    PPID    C   STIME   TTY     TIME                                CMD                           
    -------------------------------------------------------------------------------------------------------------
    root   38208   38186   0   23:27   ?     00:00:00   php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    www    38307   38208   0   23:27   ?     00:00:00   php-fpm: pool www                                        
    www    38308   38208   0   23:27   ?     00:00:00   php-fpm: pool www  
    复制代码

    指定某一个service:

    [root@docker lnmp]# docker-compose -f lnmp.yaml top nginx
    lnmp_nginx_1
    UID     PID    PPID    C   STIME   TTY     TIME                                   CMD                               
    --------------------------------------------------------------------------------------------------------------------
    root   38367   38352   0   23:27   ?     00:00:00   nginx: master process /usr/local/nginx/sbin/nginx -g daemon off;
    www    38421   38367   0   23:27   ?     00:00:00   nginx: worker process 

    version:显示docker-compose的版本信息:

    version            Show the Docker-Compose version information
    [root@docker lnmp]# docker-compose -f lnmp.yaml version
    docker-compose version 1.17.0, build ac53b73
    docker-py version: 2.5.1
    CPython version: 2.7.13
    OpenSSL version: OpenSSL 1.0.1t  3 May 2016

    docker-compose命令运行的级别在service层,而如果需要对容器进行修改等操作还是运行docker命令方便

  • 相关阅读:
    使用 virtualenv/venv 和 pip 管理虚拟环境
    Python:virtualenv 和 venv 的区别
    Python | Get unique values from a list
    Python ORM 框架 Peewee 知识点
    python之配置日志的几种方式
    python 中的 None,知识点
    Gunicorn 知识点
    gunicorn部署flask的log处理
    Python 逻辑运算符(and、or、not)、成员运算符(in、not in)、身份运算符(is、is not)
    Python 中没有 null,用 None 表示
  • 原文地址:https://www.cnblogs.com/maohuidong/p/9914801.html
Copyright © 2020-2023  润新知