Jusene's Blog

Docker基本应用

字数统计: 2.7k阅读时长: 12 min
2017/08/27 Share

Docker

Docker作为C/S架构的应用,docker客户端只需要向docker服务端或守护进程发出请求,服务端将完成请求并返回所有工作并返回结果。docker提供了一个命令行工具docker以及一整套RESTful API。

核心组件:
docker client:docker的客户端工具,是用户使用docker的主要接口,docker client与docker daemon通信并将结果返回给用户
docker daemon:运行于宿主机,docker守护进程,用户可通过docker client与其交互
image:镜像文件是只读的;用来创建container,一个镜像可以运行多个container;镜像文件可以通过Dockerfile文件创建,也可以从docker hub/registry下载

repository

  • 公共仓库:Docker hub/registry
  • 私用仓库:docker registry
    docker container:docker的运行实例,容器是一个隔离环境;

docker安装

docker有一些先绝条件:

  • docker不支持32bitCPU
  • 运行Linux 3.8或更高内核,一些老的2.6.x或其后的内核可以运行docker,但运行结果会有很大的不同。
  • 内核必须支持一种适合的存储驱动:device mapper,aufs,vfs,btrfs
  • 内核必须支持并开启cgroup和命名空间
  1. 检查内核和cpu

    1
    ~]# uname -a
    2
    Linux INIT 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
  2. 检查device mapper
    aufs默认不存在linux内核中,而早期docker强依赖aufs,但是目前ubuntu是支持aufs的,但作为企业服务器的redhat不支持,所以研发了一款替代aufs的device mapper。

    1
    ~]# grep device-mapper /proc/devices
    2
    253 device-mapper

如果不存在,我们需要做的是:

1
~]# yum install -y device-mapper
2
~]# modprode dm_mod
  1. 安装docker
    这其中centos6与centos7又有不同,centos6的docker来之epel源,而centos7来之extras源中,所以centos6默认不支持docker的,我们需要安装epel源。

centos6

1
~]# yum install -y docker-io

centos7

1
~]# yum install -y docker

但是强烈建议在centos7上部署docker,在centos7上内核技术才逐渐成熟,centos6上可能会遇见不少的坑。

  1. 启动docker
    1
    ~]# systemctl start docker
    2
    ~]# ip addr show  docker0 
    3
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    4
        link/ether 02:42:ef:69:ff:b0 brd ff:ff:ff:ff:ff:ff
    5
        inet 172.17.0.1/16 scope global docker0
    6
           valid_lft forever preferred_lft forever

这样docker就启动完成了,会出现一个docker0的桥,这也就意味着docker网络默认为nat网络。

配置docker镜像加速

因为国情的原因,国内下载Docker HUB官方的相关镜像很慢,比如ali的docker加速站点:

1
~]# cd /etc/docker
2
~]# cat > daemon.json << EOF
3
{
4
  "registry-mirrors": ["https://02enzqew.mirror.aliyuncs.com"]
5
}
6
EOF
7
~]# systemctl daemon-reload
8
~]# systemctl restart docker

docker 运行一个容器

  1. 搜索镜像 docker search

    1
    [root@INIT docker]# docker search centos
    2
    INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    3
    docker.io   docker.io/centos                             The official build of CentOS.                   3587      [OK]       
    4
    docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              100                  [OK]
    5
    docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8...   81                   [OK]
    6
    docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      33                   
    7
    docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              30                   [OK]
    8
    ....

    我们没加tag,默认给我们加的标签为latest,所以默认我们下载的都是centos7的,如果需要下载centos6 docker search centos:6 加上6的标签,这些镜像源我们都是从Docker HUB上获取的,STARS 是受欢迎的程度,OFFICIAL是标识为官方的base镜像。

  2. 拉取镜像 docker pull

    1
    [root@INIT docker]# docker pull centos
    2
    Using default tag: latest
    3
    Trying to pull repository docker.io/library/centos ... 
    4
    latest: Pulling from docker.io/library/centos
    5
    74f0853ba93b: Pull complete 
    6
    Digest: sha256:26f74cefad82967f97f3eeeef88c1b6262f9b42bc96f2ad61d6f3fdf544759b8
  3. 查看镜像 docker images

    1
    [root@INIT docker]# docker images
    2
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    3
    docker.io/busybox   latest              d20ae45477cb        3 days ago          1.129 MB
    4
    docker.io/centos    latest              328edcd84f1b        3 weeks ago         192.5 MB
  4. 运行容器 docker run

    1
    [root@INIT docker]# docker run -it --name centos7 centos:latest /bin/bash
    2
    [root@3f6c9ac56534 /]#

    docker的运行必须有任务运行,任务结束,容器也就结束了。

  • -t:分配一个(伪)终端tty
  • -i:交互模式
  • –name:给容器命名
  • /bin/bash:运行一个shell,这就是我们分配给容器的任务
  • –rm:当任务结束了,就删除这个容器
  1. 查看容器 docker ps

    1
    [root@INIT docker]# docker ps -a
    2
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    3
    3f6c9ac56534        centos:latest       "/bin/bash"         11 hours ago        Up 6 minutes                            centos7

    可能这里我们会按照上面的方法进入了一个伪终端,当我们exit退出的时候,容器也就结束了,告诉一个小技巧:
    退出:Ctrl+D exit 退出容器
    detach:Ctrl+P + Ctrl+Q 分开一个容器,不会停止容器
    attach: docker attach CONTAINER-ID 附上一个容器

  2. 删除容器 docker rm

    1
    [root@INIT docker]# docker stop 3f6c9ac56534
    2
    3f6c9ac56534
    3
    [root@INIT docker]# docker rm 3f6c9ac56534  
    4
    3f6c9ac56534
    5
    [root@INIT docker]# docker ps -a
    6
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  3. 删除镜像 docker rmi

    1
    [root@INIT docker]# docker images
    2
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    3
    docker.io/busybox   latest              d20ae45477cb        3 days ago          1.129 MB
    4
    docker.io/centos    latest              328edcd84f1b        3 weeks ago         192.5 MB
    5
    [root@INIT docker]# docker rmi busybox:latest
    6
    Untagged: busybox:latest
    7
    Untagged: docker.io/busybox@sha256:b82b5740006c1ab823596d2c07f081084ecdb32fd258072707b99f52a3cb8692
    8
    Deleted: sha256:d20ae45477cbc89863fff11d01cdccf28e4ff06ce2eb2f0206ef971b14eaf6c0
    9
    Deleted: sha256:6a749002dd6a65988a6696ca4d0c4cbe87145df74e3bf6feae4025ab28f420f2
    10
    [root@INIT docker]# docker images            
    11
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    12
    docker.io/centos    latest              328edcd84f1b        3 weeks ago         192.5 MB

基本的使用也就这样了,docker的使用还是很简单的。

Docker help

1
~]# docker -h
2
Commands:
3
    attach    Attach to a running container                                       #在当前shell下附上一个正在运行的容器
4
    build     Build an image from a Dockerfile                                    #通过Dockerfile定制一个镜像
5
    commit    Create a new image from a container's changes                       #提交当前容器为新的镜像
6
    cp        Copy files/folders between a container and the local filesystem     #在容器与宿主机的文件系统之间拷贝文件或目录
7
    create    Create a new container                                              #创建一个新的容器,同run,但不启动容器
8
    diff      Inspect changes on a container's filesystem                         #查看docker容器文件系统的变化
9
    events    Get real time events from the server                                #从docker服务中获取容器的实时事件
10
    exec      Run a command in a running container                                #在已运行的容器中运行命令
11
    export    Export a container's filesystem as a tar archive                    #导出容器文件系统作为一个tar归档文件[对应import]
12
    history   Show the history of an image                                        #展示一个镜像的形成历史
13
    images    List images                                                         #列出系统的当前镜像
14
    import    Import the contents from a tarball to create a filesystem image     #从tar包中的内容创建一个新的文件系统镜像[对于export]
15
    info      Display system-wide information                                     #显示系统的相关信息
16
    inspect   Return low-level information on a container, image or task          #返回在一个容器,镜像或任务的低级的信息输出
17
    kill      Kill one or more running containers                                 #kill一个或多个容器
18
    load      Load an image from a tar archive or STDIN                           #从一个tar包中加载一个镜像[对应save]
19
    login     Log in to a Docker registry.                                        #登陆一个docker源仓库
20
    logout    Log out from a Docker registry.                                     #登出一个docker源仓库
21
    logs      Fetch the logs of a container                                       #输出容器的日志信息
22
    network   Manage Docker networks                                              #管理doker网络
23
    node      Manage Docker Swarm nodes                                           #管理docker swarm节点
24
    pause     Pause all processes within one or more containers                   #暂停容器
25
    port      List port mappings or a specific mapping for the container          #查看映射端口对应的容器内部源端口
26
    ps        List containers                                                     #列出容器
27
    pull      Pull an image or a repository from a registry                       #从一个docker源服务器拉取一个镜像
28
    push      Push an image or a repository to a registry                         #将一个镜像推送到一个docker源服务器
29
    rename    Rename a container                                                  #重命名一个容器
30
    restart   Restart a container                                                 #重启一个容器
31
    rm        Remove one or more containers                                       #删除一个容器
32
    rmi       Remove one or more images                                           #删除一个镜像
33
    run       Run a command in a new container                                    #在一个新的容器运行一个任务
34
    save      Save one or more images to a tar archive (streamed to STDOUT by default) #保存一个镜像到一个tar包[对于load]
35
    search    Search the Docker Hub for images                                    #从docker hub搜索镜像
36
    service   Manage Docker services                                              #管理docker服务(swarm)
37
    start     Start one or more stopped containers                                #启动一个停止的容器
38
    stats     Display a live stream of container(s) resource usage statistics     #显示容器资源使用统计数据数据流
39
    stop      Stop one or more running containers                                 #停止一个正在运行的容器
40
    swarm     Manage Docker Swarm                                                 #管理docker swarm集群
41
    tag       Tag an image into a repository                                      #给源中镜像打标签
42
    top       Display the running processes of a container                        #列出一个容器正在运行进程
43
    unpause   Unpause all processes within one or more containers                 #取消暂停的容器
44
    update    Update configuration of one or more containers                      #更新容器的配置
45
    version   Show the Docker version information                                 #展示docker的版本信息
46
    volume    Manage Docker volumes                                               #管理docker卷
47
    wait      Block until a container stops, then print its exit code             #截取容器停止时的退出状态值

docker run 的一些参数:

  • –add-host 添加hosts host:ip
  • -a,– –attach=[] 附上标准输入,标准输出或错误输出,-ia 可以不启动进入容器
  • -c,– –cpu-shares int 设置cpu使用权重
  • –cap-add value 添加linux功能
  • –cap-drop value 去掉linux功能
  • –cidfile string 把容器id写入到指定文件
  • –cpuset-cpus string 绑定cpu
  • –cpuset-mems string 版定使用mem的cpu
  • -d,–detach 后台运行容器
  • –device value 添加宿主的设备到容器
  • –device-read-bps value 限制一个设备的每秒的读速率(bytes per second)
  • –device-read-iops value 限制一个设备的每秒的读速率(IO per second)
  • –device-write-bps value 限制一个设备的每秒的写速率(bytes per second)
  • –device-write-iops value 限制一个设备的每秒的写速率(IO per second)
  • –dns value 设置dns
  • -e,–env value 设置环境变量
  • –env-file value 从文件中读取环境变量
  • –expose value 指定对外提供服务的端口
  • -h,–hostname string 容器的主机名
  • -i,–interactive 尽管没有附上容器保持标准输出
  • –link value 添加链接到另一个容器
  • –ip value 容器的ip地址
  • –link-local-ip value 链接本地的ip
  • –mac-address string 容器的mac地址
  • -m,–memory string 内存限制
  • –memory-reservation string 内存软限制
  • –memory-swap string swap限制与内存的正比 ‘-1’表示不限制使用swap
  • –memory-swappiness int 调整容器的swappiness 默认-1
  • –name string 分配容器一个名字
  • –network 设置容器的网络 默认default 也就是nat
  • -p,–publish value 指定端口映射
  • -P,–publish-all 自动映射容器对外提供服务的端口
  • –read-only 挂载容器的根文件系统为只读
  • –restart string 当容器退出重新开启(default=no 可以设置always)
  • –rm 当容器退出自动删除容器
  • –sysctl value sysctl选项
  • -t,–tty 分配伪终端
  • –ulimit value ulimit选项
  • -u,–user string 指定运行容器的用户或uid(format: name|uid[:group|gid])
  • -v,–volume value 挂载数据卷
  • –volumes-from 挂载卷从特殊的数据容器
  • -w,–workdir string 指定容器的工作目录

By default all groups have 1024 shares. A group with 100 shares will get a ~10% portion of the CPU time - archlinux cgroups

CATALOG
  1. 1. Docker
  2. 2. docker安装
  3. 3. 配置docker镜像加速
  4. 4. docker 运行一个容器
  5. 5. Docker help