• docker及docker-compose学习


    一  docker简介

         Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

    docker架构

        Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。

    容器与镜像的关系类似于面向对象编程中的对象与类。

    基础构件

    Docker 镜像(Images)

    Docker 镜像是用于创建 Docker 容器的模板。

    Docker 容器(Container)

    容器是独立运行的一个或一组应用。

    Docker 客户端(Client)

    Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

    Docker 主机(Host)

    一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

    Docker 仓库(Registry)

    Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

    Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

     

    Docker Machine

    Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

     

    docker安装

    centos7下

    先安装依赖

     yum install -y yum-utils device-mapper-persistent-data lvm2  再安装  yum -y install docker-ce

    启动   systemctl start docker

    常用命令总结

      docker  search  查找位于dockerhub的镜像 

    如 docker search java

     

    docker pull  下载镜像

    如 docker pull java

    docker images  列出镜像

    docker rmi 即删除镜像

    如 docker rmi java

    docker  save  即保存镜像

    如 docker save java >java.tar

    docker  load 即 加载镜像

    如 docker load <java.tar

    另外 docker还可以通过dokcerfile创建镜像

    命令格式 dokcer build  [OPTION] PATH |URL| -

    示例先下载基础 centos镜像

    docker pull centos

    编写nginx dockerfile

    cat Dockerfile 
    # base image
    FROM centos
    # MAINTAINER
    MAINTAINER json_hc@163.com
    # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
    ADD nginx-1.12.2.tar.gz /usr/local/src
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    # change dir to /usr/local/src/nginx-1.12.2
    WORKDIR /usr/local/src/nginx-1.12.2
    # execute command to compile nginx
    RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install
    EXPOSE 80
    

      下载nginx源码 到当前路径

    执行构建 docker build -t centos_nginx:v1 .

    docker images 查看

    docker容器常用命令

    启动容器

    如 1 docker run java /bin/echo 'hello world'

        2 docker run -d -p 91:80 nginx  启动一个nginx 容器 并映射了91端口可以访问。

    列出容器

    docker ps 

    停止容器 

    docker stop ${容器id} -t (等待时间)

    docker kill   ${容器id} 强制关闭

    启动已停止的容器

    docker start  ${容器id}

    重启  docker restart  ${容器id}

    进入容器

    docker attach   ${容器id}

    或者 

    docker exec -it  ${容器id} /bin/bash

    删除容器

    docker rm ${容器id}

    删除所有容器

    docker rm -f $(docker ps -a -q )谨慎使用

    导出容器

    docker export  nginx-test >nginx-test.tar

    导入容器

    docker import nginx-test.tar nginx-test2

     

    二 docker-compose简介

       Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。

    安装docker-compose

      curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

      chmod +x /usr/local/bin/docker-compose

    [root@localhost ~]# docker-compose --version
    docker-compose version 1.16.1, build 6d1ac21

    使用流程

       a 在 Dockfile 中定义你的应用环境,使其可以在任何地方复制。

       b  在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。

       c  最后,运行dcoker-compose up,Compose 将启动并运行整个应用程序

    示例

    准备工作:提前下载好镜像:

    docker pull mysql
    docker pull wordpress

    需要新建一个空白目录,例如wptest。新建一个docker-compose.yml

     

    version: '2'
    services:
        web: 
          image: wordpress:latest 
          links: 
            - db
          ports: 
            - "8002:80"
          environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_PASSWORD: 123456
        db: 
          image: mysql 
          environment: 
            - MYSQL_ROOT_PASSWORD=123456
    

     

      

     

    
    

    以上命令的意思是新建db和wordpress容器。等同于:

    $ docker run --name db -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    $ docker run --name some-wordpress --link db:mysql -p 8002:80 -d wordpress

    注意,如果你是直接从fig迁移过来的,且weblinks- db:mysql,这里会提示没有给wordpress设置环境变量,这里需要添加环境变量WORDPRESS_DB_HOSTWORDPRESS_DB_PASSWORD

    好,我们启动应用:

    # docker-compose up
    Creating wptest_db_1...
    Creating wptest_wordpress_1...
    Attaching to wptest_db_1, wptest_wordpress_1
    wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html

    就成功了。浏览器访问 http://192.168.1.115:8002 。

    默认是前台运行并打印日志到控制台。如果想后台运行,可以:

    docker-compose up -d

    服务后台后,可以使用下列命令查看状态:

    # docker-compose ps
           Name                      Command               State          Ports         
    -----------------------------------------------------------------------------------
    figtest_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp             
    figtest_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8002->80/tcp 
    
    # docker-compose logs
    Attaching to wptest_wordpress_1, wptest_db_1
    db_1        | 2016-10-14T14:38:46.498030Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    db_1        | 2016-10-14T14:38:46.499974Z 0 [Note] mysqld (mysqld 5.7.15) starting as process 1 ...
    db_1        | 2016-10-14T14:38:46.727191Z 0 [Note] InnoDB: PUNCH HOLE support available
    
    

    停止服务:

    # docker-compose stop
    Stopping wptest_wordpress_1...
    Stopping wptest_db_1...

    重新启动服务:

    docker-compose restart

    docker-compose.yml参考

    每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

    image

    指定镜像tag或者ID。示例:

    image: redis
    image: ubuntu:14.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd

    注意,在version 1里同时使用imagebuild是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。

    build

    用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。

    注意,在version 1bulid仅支持值为字符串。version 2里支持对象格式。

    build: ./dir
    
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

    context为路径,dockerfile为需要替换默认docker-compose的文件名,args为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。示例:
    Dockerfile:

    ARG buildno
    ARG password
    
    RUN echo "Build number: $buildno"
    RUN script-requiring-password.sh "$password"

    docker-compose.yml:

    build:
      context: .
      args:
        buildno: 1
        password: secret
    
    build:
      context: .
      args:
        - buildno=1
        - password=secret

    command

    用来覆盖缺省命令。示例:

    command: bundle exec thin -p 3000

    command也支持数组形式:

    command: [bundle, exec, thin, -p, 3000]

    links

    用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link。示例:

    links:
     - db
     - db:mysql
     - redis

    使用了别名将自动会在容器的/etc/hosts文件里创建相应记录:

    172.17.2.186  db
    172.17.2.186  mysql
    172.17.2.187  redis

    所以我们在容器里就可以直接使用别名作为服务的主机名。

    ports

    用于暴露端口。同docker run -p。示例:

    ports:
     - "3000"
     - "8000:8000"
     - "49100:22"
     - "127.0.0.1:8001:8001"

    expose

    expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose

    expose:
     - "3000"
     - "8000"

    volumes

    挂载数据卷。同docker run -v。示例:

    volumes:
     - /var/lib/mysql
     - cache/:/tmp/cache
     - ~/configs:/etc/configs/:ro

    volumes_from

    挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:

    volumes_from:
     - service_name
     - service_name:ro
     - container:container_name
     - container:container_name:rw

    container:container_name格式仅支持version 2

    environment

    添加环境变量。同docker run -e。可以是数组或者字典格式:

    environment:
      RACK_ENV: development
      SESSION_SECRET:
    
    environment:
      - RACK_ENV=development
      - SESSION_SECRET

    depends_on

    用于指定服务依赖,一般是mysql、redis等。
    指定了依赖,将会优先于服务创建并启动依赖。

    links也可以指定依赖。

    external_links

    链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

    external_links:
     - redis_1
     - project_db_1:mysql
     - project_db_1:postgresql

    注意,external_links链接的服务与当前服务必须是同一个网络环境。

    extra_hosts

    添加主机名映射。

    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"

    将会在/etc/hosts创建记录:

    162.242.195.82  somehost
    50.31.209.229   otherhost

    extends

    继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

    extends:
      file: common.yml
      service: webapp

    service必须有,file可选。service是需要继承的服务,例如webdatabase

    net

    设置网络模式。同docker的--net参数。

    net: "bridge"
    net: "none"
    net: "container:[name or id]"
    net: "host"

    dns

    自定义dns服务器。

    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9

    cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir

     

    cpu_shares: 73
    cpu_quota: 50000
    cpuset: 0,1
    
    user: postgresql
    working_dir: /code
    
    domainname: foo.com
    hostname: foo
    ipc: host
    mac_address: 02:42:ac:11:65:43
    
    mem_limit: 1000000000
    mem_limit: 128M
    memswap_limit: 2000000000
    privileged: true
    
    restart: always
    
    read_only: true
    shm_size: 64M
    stdin_open: true
    tty: true

    命令行参考

    $ docker-compose
    Define and run multi-container applications with Docker.
    
    Usage:
      docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
      docker-compose -h|--help
    
    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)
      --verbose                   Show more output
      -v, --version               Print version and exit
      -H, --host HOST             Daemon socket to connect to
    
      --tls                       Use TLS; implied by --tlsverify
      --tlscacert CA_PATH         Trust certs signed only by this CA
      --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
      --tlskey TLS_KEY_PATH       Path to TLS key file
      --tlsverify                 Use TLS and verify the remote
      --skip-hostname-check       Don't check the daemon's hostname against the name specified
                                  in the client certificate (for example if your docker host
                                  is an IP address)
    
    Commands:
      build              Build or rebuild services
      bundle             Generate a Docker bundle from the Compose file
      config             Validate and view the compose file
      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
      kill               Kill containers
      logs               View output from containers
      pause              Pause services
      port               Print the public port for a port binding
      ps                 List containers
      pull               Pulls service images
      push               Push service images
      restart            Restart services
      rm                 Remove stopped containers
      run                Run a one-off command
      scale              Set number of containers for a service
      start              Start services
      stop               Stop services
      unpause            Unpause services
      up                 Create and start containers
      version            Show the Docker-Compose version information

       

     

     

  • 相关阅读:
    MQ怎么解决消息堆积的问题
    怎么解决Mysql的超大分页
    微信小程序开发入门 —— 认识微信小程序
    C++中strcpy()函数和strcpy_s()函数的使用及注意事项
    UML免费建模工具
    UML 各种图总结精华
    TIFF 文件格式
    LIBTIFF+VS15+WIN10编译
    LIBTIFF VS2013下编译LIBTIFF4.0.9
    Qt 多线程之QtConcurrent::map(处理序列容器)
  • 原文地址:https://www.cnblogs.com/jinbiaof/p/9712526.html
Copyright © 2020-2023  润新知