zoukankan      html  css  js  c++  java
  • Docker学习笔记2

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

    官网:https://www.docker.com/
    相关资料:
    1、Docker入门教程 http://dockone.io/article/111
    2、Docker_百度百科 http://baike.baidu.com/view/11854949.htm
    3、史上最全Docker资料集粹 http://special.csdncms.csdn.net/BeDocker/
    4、Docker - 话题精华 - 知乎 http://www.zhihu.com/topic/19950993/top-answers
    5、docker 简明教程 | 简果网 http://www.simapple.com/docker-tutorial

    Docker与虚拟机比较

    作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

    • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
    • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
    • Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
    • Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

    (本段摘自《Docker技术入门与实战》)

    安装

    Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本:

    [root@bogon ~]#  uname -r
    3.10.0-327.22.2.el7.x86_64

    Docker支持以下的CentOS版本:

    • CentOS 7 (64-bit)
    • CentOS 6.5 (64-bit) 或更高的版本

    Docker 支持以下的 Ubuntu 版本:

    • Ubuntu Precise 12.04 (LTS)
    • Ubuntu Trusty 14.04 (LTS)
    • Ubuntu Wily 15.10
    • 其他更新的版本……

    Linux安装

    curl -fsSL https://get.docker.com/ | sh
    
    # daocloud.io 国内镜像
    curl -sSL https://get.daocloud.io/docker | sh

    该安装包适用于 Ubuntu,Debian,Centos 等大部分主流 Linux 发行版。

    CentOS7支持使用yum安装:

    yum update
    yum install docker

    查看文档:
    https://docs.docker.com/engine/installation/linux/centos/
    http://docs.daocloud.io/faq/install-docker-daocloud

    查看版本:

    docker version

    显示:

    Client:
     Version:      1.11.2
     API version:  1.23
     Go version:   go1.5.4
     Git commit:   b9f10c9
     Built:        Wed Jun  1 21:23:11 2016
     OS/Arch:      linux/amd64
    
    Server:
     Version:      1.11.2
     API version:  1.23
     Go version:   go1.5.4
     Git commit:   b9f10c9
     Built:        Wed Jun  1 21:23:11 2016
     OS/Arch:      linux/amd64

    为了后面的需要,我们这里下载个ununtu的镜像:

    docker search ubutun
    docker pull ubutun
    
    # 查看所有可用镜像
    docker images -a

    客户端和守护进程

    Docker 的 C/S 模式

    docker是C/S架构,使用client与Server通信。

    支持三种连接方式:
    unix:///var/run/docker.sock
    tcp://host:port
    fd://socketfd

    Docker 守护进程的配置和操作

    使用ps -ef | grep docker查看docker进程。

    管理docker服务:

    service docker start
    service docker stop
    service docker restart

    如使用service docker start实际上是执行了/bin/systemctl start docker.service命令。
    建议重启使用:

    systemctl daemon-reload
    systemctl restart docker.service

    docker守护进程的配置和操作模式:
    docker -d [OPTIONS]

    运行相关:

     -D, --debug=false
     -e,--exec-driver="native"
     -p,--pidfile="/var/run/docker.pid"

    服务器相关:

     -G,--group="docker"
     -H,--host=[]
     --tls=false

    RemoteAPI相关:

        --api-enable-cors=false

    存储相关:

     -S,--storage-driver=""
     --selinux-enabled=false
     --storage-opt=[]

    网络设置相关:

     -b,--bridge="" 设置自定义网桥
     --bip=""
     --dns=[]
     --ip=0.0.0.0

    启动配置文件:
    Ubuntu: /etc/default/docker
    CentOS: /etc/sysconfig/docker

    如果没有配置文件,可以直接编辑:

    vim  /lib/systemd/system/docker.service

    里面的ExecStart就是启动配置,默认是:

    ExecStart=/usr/bin/docker -H fd://

    我们可以加几个配置:

    ExecStart=/usr/bin/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

    然后重启:

    systemctl daemon-reload
    systemctl restart docker.service
    
    # 如果出问题了,可以使用下面命令查看:
    systemctl status docker.service

    通过ps -ef | grep docker可以查看刚才添加的信息:

    [root@localhost ~]# ps -ef | grep docker
    root      8262     1  0 23:50 ?        00:00:00 /usr/bin/docker daemon -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

    解决centos7和docker1.9没有配置文件问题 - 建站 - IT精英团
    http://www.itnpc.com/news/web/145083113731628.html

    Docker 的远程访问

    使用第二台安装有docker的服务器做演示。为区分,设置label不同。

    修改守护进程默认的启动配置:
    默认是:-H fd://
    可修改为:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1

    可设置多个连接方式。

    • 通过http连接Server:

      curl http://127.0.0.1:2375/info

    访问的是服务器127.0.0.1:2375的info接口,返回服务器相关信息。

    • 通过docker客户端访问Server:

      docker -H tcp://127.0.0.1:2375 info

    和服务器端一样,客户端也支持三种连接方式,默认是 -H unix:///var/run/docker.sock:
    -H unix:///path/to/sock
    tcp://host:port
    fd://socketfd

    docker客户端使用docker info默认访问的是本地Server。可以修改环境变量DOCKER_HOST改变默认连接。命令行直接输入:

    export DOCKER_HOST="tcp://127.0.0.1:2375"

    127.0.0.1:237可以替换为实际的Server地址。

    如果想恢复本地连接,将DOCKER_HOST置空即可:

    export DOCKER_HOST=""

    Docker容器

    容器的基本操作

    Docker run IMAGE [COMMOND] [ARG...] 在新的容器中执行命令

    该命令每运行一次,就创建了一个新的容器。

    docker run ubuntu echo 'hello world' 运行一个新的容器,并执行命令echo
    docker run -i -t  --name test ubuntu /bin/bash          以交互式终端运行一个新的容器,镜像是ubuntu,使用bash,容器别名test

    -i 交互式界面,默认是false
    -t 伪终端,默认false
    --name 容器别名,默认随机命名

    exit 退出交互式界面,容器停止运行
    Crtl+P 或者Crtl+Q 退出交互式界面,容器在后台运行。(注意是大写P和Q)

    查看容器:

    docker ps           查看正在运行的容器
    docker ps -a  查看所有容器
    docker ps -l  查看最近一次运行的容器

    示例:

    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS               NAMES
    8c52c83c1903        redis                       "docker-entrypoint.sh"   2 hours ago         Exited (0) 2 hours ago                         myredis

    容器操作:

    docker create 容器名或者容器ID 创建容器
    docker start [-i] 容器名       启动容器
    docker run 容器名或者容器ID    运行容器,相当于docker create + docker start
    docker attach 容器名或者容器ID 进入容器的命令行
    docker stop 容器名                             停止容器
    docker rm 容器名                               删除容器
    
    docker top 容器名          查看WEB应用程序容器的进程
    docker inspect 容器名 查看Docker的底层信息

    删除容器时,容器必须是停止状态,否则会报错误。

    守护式容器

    什么是守护式容器?

    • 能够长期运行
    • 没有交互式会话
    • 适合运行应用程序和服务

    启动守护式容器:

    docker run -d IMAGE [COMMOND] [ARG...]

    -d 让容器在后台运行

    后台运行任务:

    docker run -d --name d1 ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done;"
    b89b9ce64d34bd202a642c8190428f4776f15e882f138949259722f22120201a

    返回了一个守护进程的唯一ID。

    查看守护进程的运行情况:

    [root@localhost ~]# docker ps
    CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
    b89b9ce64d34        ubuntu                      "/bin/sh -c 'while tr"   3 minutes ago       Up 3 minutes                            d1
    
    [root@localhost ~]# docker logs -f b89b9ce64d34
    hello world
    hello world
    hello world
    hello world
    hello world
    
    [root@localhost ~]# docker logs -f -t --tail 2 b89b9ce64d34
    2016-06-26T10:13:19.786516589Z hello world
    2016-06-26T10:13:20.788871572Z hello world
    2016-06-26T10:13:21.791921389Z hello world
    
    [root@localhost ~]# docker top b89b9ce64d34
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                4156                4148                0                   06:05               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done;
    root                4850                4156                0                   06:16               ?                   00:00:00            sleep 1
    docker logs [-f] [-t] [--tail] 容器名或id       查看容器内WEB应用程序日志

    -f --follow=true|false,默认false,一直跟随log变化
    -t --timestamps=true|false,默认false,加上时间戳
    --tail="all",返回最新多少条日志

    在运行的容器中启动新的进程:

    docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]

    停止守护式进程:

    docker stop 容器名      发送停止信号,等待关闭
    docker kill 容器名      直接关闭容器

    在容器中部署静态网站

    docker run -d -p 80 -i -t ubuntu /bin/bash   主机端口随机
    docker run -d -p 8080:80 -i -t ubuntu /bin/bash  主机端口自定义
    docker run -d -p 0.0.0.0:80 -i -t ubuntu /bin/bash
    docker run -d -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

    -P --publish-all=true|false,默认false
    -p --publish=[],自定义端口,将容器内部使用的网络端口映射到我们使用的主机上。

    docker run -d -P training/webapp python app.py 后台运行一个容器应用
    docker run -d -p 5000:5000 training/webapp python app.py 容器内部的 5000 端口映射到我们本地主机的 5000 端口上
    docker port 容器id            查看到容器的端口映射

    Nginx部署示例:

    # 创建映射端口为80的交互式界面:
    docker run -p 80 --name web -i -t ubuntu /bin/bash
    
    # 第一次使用更新源
    apt-get update
    
    # 安装nginx
    apt-get install nginx
    
    # 安装vim
    apt-get install vim
    
    whereis nginx
    nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
    
    vim /etc/nginx/conf.d/localhost.conf

    发现配置文件在/etc/nginx/conf.d下面:

    conf.d/localhost.conf

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            root   /var/www/; 
            index  index.html index.htm;
        }   
        
    }

    新建个目录:

    mkdir -p /var/www/
    
    vim /var/www/index.html

    内容随便写。

    # 启动nginx
    nginx

    使用Crtl+P(即Crtl+shift+p)退出容器,并后台运行。
    查看:

    [root@localhost ~]# docker port web
    80/tcp -> 0.0.0.0:32769
    
    [root@localhost ~]# docker top web
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                12123               12113               0                   07:14               pts/2               00:00:00            /bin/bash
    root                12159               12123               0                   07:14               ?                   00:00:00            nginx: master process nginx
    33                  12160               12159               0                   07:14               ?                   00:00:00            nginx: worker process
    
    [root@localhost ~]# curl http://127.0.0.1:32769
    

    正常的话会显示网页内容。

    如果exit退出了容器,想开启nginx服务,还可以:

    docker start web
    docker exec web nginx

    Docker镜像

    搜索镜像

    docker search [-s] IMAGE

    下载镜像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    [root@bogon ~]# docker pull ubuntu:16.04
    [root@bogon ~]# docker pull daocloud.io/library/ubuntu:16.04

    下载镜像名称其实由三部分组成:daocloud.io/library/ubuntu:16.04
    其中其中daocloud.io是注册服务器地址,默认是registry.hub.docker.com;ubuntu是仓库名,16.04是标签名,默认是latest。

    查看已下载镜像列表

    docker images [-a]
    
    [root@bogon ~]# docker images 
    REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
    daocloud.io/library/ubuntu       16.04               12543ced0f6f        2 weeks ago         122.4 MB
    ubutun                           latest              12543ced0f6f        2 weeks ago         122.4 MB
    daocloud.io/daocloud/dao-2048    latest              6c1ff658e77e        3 months ago        7.598 MB
    daocloud.io/daocloud/alpine      latest              e9f3e32a4303        3 months ago        11.52 MB
    daocloud.io/library/centos       7.1.1503            fac97c5c4748        8 months ago        212.1 MB
    daocloud.io/daocloud/dao-redis   master-init         173a30377d85        13 months ago       190.4 MB

    给镜像添加标签

    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
    
    [root@bogon ~]# docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest

    删除镜像

    docker rmi [OPTIONS] IMAGE [IMAGE...]
    
    # 按标签删除:多个标签,仅会删除当前标签,不会删除镜像
    [root@bogon ~]# docker rmi ubuntu:latest
    # 按ID删除:直接删除镜像
    [root@bogon ~]# docker rmi 12543ced0f6f

    选项:
    -f, --force 强制删除镜像
    --no-prune 不删除untagged parents

    导出镜像

    docker save [OPTIONS] IMAGE [IMAGE...]
    
    [root@bogon ~]# docker save -o ubuntu_latest.tar ubuntu:latest
    [root@bogon ~]# ls -l
    -rw-r--r--. 1 root root 128086528 Jun 28 12:39 ubuntu_latest.tar

    选项:
    -o, --output 写入到文件

    导入镜像

    docker load --input ubuntu_latest.tar
    # 或者
    docker load < ubuntu_latest.tar

    选项:
    -i, --input 从压缩包载入镜像

    上传镜像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    选项:
    --disable-content-trust=true 跳过镜像签名

    Docker仓库

    Docker数据卷及数据卷容器

    使用Dockerfile创建镜像

    (未完待续)

    作者:飞鸿影~

    出处:http://52fhy.cnblogs.com/

  • 相关阅读:
    vue 组件之间相互传值 父传子 子传父
    krpano 常用标签
    krpano生成全景图
    github的基本使用
    transform:rotate3d/tranlate3d
    css3水波纹效果
    原型的迷惑
    JS变量作用域
    LeetCode Rotate List
    LeetCode Divide Two Integers
  • 原文地址:https://www.cnblogs.com/chunguang/p/5656905.html
Copyright © 2011-2022 走看看