zoukankan      html  css  js  c++  java
  • Docker系列03—Docker 基础入门

    Docker系列03—Docker 基础入门

     
     

    1、概念介绍

    1.1 容器

    1.1.1 介绍

      容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。

    1.1.2 要使用容器必须需要在内核级支持2中技术

    • namespaces 名称空间
    • Control Group(cgroups) 控制组

    (1)为什么centos6 版本不能使用容器?

    因为centos6 内核版本是2.6;容器需要一个user的名称空间,直到内核3.8版本才有:

     namespace 系统调用参数  隔离内容  内核版本 
    UTS  CLONE_NEWUTS  主机名和域名  2.6.19
    IPC   CLONE_NEWIPC 信号量、消息队列和共享内存   2.6.19
    PID   CLONE_NEWPID 进程编号   2.6.24
    Network   CLONE_NEWNET 网络设备、网络栈、端口等   2.6.29
    Mount   CLONE_NEWNS 挂载点(文件系统)   2.4.19
    User   CLONE_NEWUSER 用户和用户组   3.8

    (2)Control Group(cgroups)

    • blkio:块设备IO
    • cpu:CPU
    • cpuacct:CPU资源使用报告
    • cpuset:多处理平台上的CPU集合
    • devices:设备访问
    • memory:内存用量及报告
    • perf_event:对cgroup中的任务进行统一性能测试
    • net_cls:cgroup中的任务创建的数据报文的类别标识符

    1.2 docker

    1.2.1 介绍

    •  Docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化自动管理机制
    •  Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces,来创建独立的容器(containers。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
    •  依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”

    1.2.2 docker 运行架构

    2、安装启动docker

    2.1 安装环境

    (1)依赖的基础环境

    •  64 位CPU
    •  Linux kernel(内核) 3.10+
    •  Linux kernel cgroups and namespaces

    (2)查询自己服务器的环境

    ① 使用的服务器版本

    [root@along ~]# cat /etc/redhat-release

    CentOS Linux release 7.3.1611 (Core)

    ② 内核版本

    [root@along ~]# uname -r

    3.10.0-514.el7.x86_64

    ③ ip地址

    [root@along ~]# hostname -I

    192.168.130.101 192.168.10.101

    2.2 安装docker

    2.2.1 使用官方安装脚本自动安装

    实际上就是下载一个安装脚本,再执行安装(不推荐,因为不能选择版本安装)

    [root@along ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

    2.2.2 CentOS 7 (使用yum进行安装,推荐)

    (1)添加docker-ce 源信息

    [root@along ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

    (2)修改docker-ce 源

    [root@along ~]# sed -i 's@download.docker.com@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

    (3)更新并安装 Docker-CE

    [root@along ~]# yum makecache fast

    [root@along ~]# yum -y install docker-ce   安装的是默认最新版本

    (4)安装指定版本的docker

    ① 查看都有哪些版本

    [root@along ~]# yum list docker-ce.x86_64 --showduplicates | sort -r   

    ② 下载指定版本,我这里下载的稳定版本

    [root@along ~]# yum -y install docker-ce-17.03.2.ce

    ③ 安装报错(虚拟机中可能会遇到,如果没有报错请忽略)

    Error: Package: docker-ce-18.03.1.ce-1.el7.centos.x86_64 (docker-ce-stable)

               Requires: container-selinux >= 2.9

    报错原因: docker-ce-selinux 版本过低

    解决办法:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/网站下载对应版本的docker-ce-selinux,安装即可

    [root@along ~]# yum -y install https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm

    ④ 再次安装docker 成功

    [root@along ~]# yum -y install docker-ce-17.03.2.ce

    2.2.2 CentOS 7 (二进制安装,推荐)

    到 https://download.docker.com/linux/static/stable/x86_64/ 页面下载自己需要版本的发布包:

    这次安装文档版本 docker-18.03.1-ce

    (1)下载安装

    [root@along ~]# mkdir /data

    [root@along ~]# wget -P /data/ https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz

    [root@along ~]# cd /data/

    [root@along data]# tar -xvf docker-18.03.1-ce.tgz

    (2)配置启动脚本

    [root@along ~]# vim /etc/systemd/system/docker.service

    复制代码
    [Unit]
    Description=Docker Application Container Engine
    Documentation=http://docs.docker.io
    
    [Service]
    Environment="PATH=/data/docker/:/bin:/sbin:/usr/bin:/usr/sbin"
    EnvironmentFile=-/run/flannel/docker
    ExecStart=/data/docker/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS
    ExecReload=/bin/kill -s HUP $MAINPID
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    Delegate=yes
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    复制代码

    (3)配置生效环境变量,方便使用docker命令

    [root@along ~]# vim /etc/profile.d/docker.sh

    export PATH=/data/docker:$PATH

    [root@along ~]# source /etc/profile.d/docker.sh

    (4)配置docker命令补齐脚本

    [root@along ~]# wget -O /usr/share/bash-completion/completions/docker https://raw.githubusercontent.com/alonghub/Docker/master/Resource/docker

    (5)配置dockerfile 语法高亮脚本

    [root@along ~]# wget -O /usr/share/vim/vimfiles/doc/dockerfile.txt https://raw.githubusercontent.com/alonghub/Docker/master/Resource/dockerfile.txt
    [root@along ~]# wget -O /usr/share/vim/vimfiles/ftdetect/dockerfile.vim https://raw.githubusercontent.com/alonghub/Docker/master/Resource/dockerfile2.vim
    [root@along ~]# wget -O /usr/share/vim/vimfiles/syntax/dockerfile.vim https://raw.githubusercontent.com/alonghub/Docker/master/Resource/dockerfile3.vim

    2.2.3 Ubuntu 14.04 16.04 (使用apt-get进行安装)

    (1)安装最新版本

    # step 1: 安装必要的一些系统工具

    sudo apt-get update

    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

    # step 2: 安装GPG证书

    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

    # Step 3: 写入软件源信息

    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

    # Step 4: 更新并安装 Docker-CE

    sudo apt-get -y update

    sudo apt-get -y install docker-ce

    (2)安装指定版本的Docker-CE:

    # Step 1: 查找Docker-CE的版本:

    # apt-cache madison docker-ce

    #   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages

    #   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages

    # Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)

    # sudo apt-get -y install docker-ce=[VERSION]

    2.3 启动docker

    2.3.1 配置docker镜像加速

    多种加速方式:

    •  docker cn
    •  阿里云加速器
    •  中国科技大学
    •  ... ...

    (1)docker cn 加速

    [root@along ~]# mkdir -p /etc/docker

    [root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF'

    {

      "registry-mirrors": ["https://registry.docker-cn.com"]

    }

    EOF

    (2)阿里云加速器

    ① 注册阿里云账号,专用加速器地址获得路径:

            https://cr.console.aliyun.com/#/accelerator

    ② 添加加速器到配置文件

    [root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF'

    {

      "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]

    }

    EOF

    ③ 阿里云页面有操作步骤

     

    2.3.2 配置清空防火墙规则

    [root@along ~]# systemctl stop firewalld && systemctl disable firewalld

    [root@along ~]# /usr/sbin/iptables -F && /usr/sbin/iptables -X && /usr/sbin/iptables -F -t nat && /usr/sbin/iptables -X -t nat

    [root@along ~]# /usr/sbin/iptables -P FORWARD ACCEPT

    2.3.3 启动docker服务

    ① 重载docker启动配置

    [root@along ~]# systemctl daemon-reload 

    ② 将docker设为开机自启

    [root@along ~]# systemctl start docker.service

    ③ 启动docker服务

    [root@along ~]# systemctl enable docker.service

    ④ 查看docker版本

    [root@along ~]# docker version

    复制代码
    Client:
     Version:      17.03.2-ce
     API version:  1.27
     Go version:   go1.7.5
     Git commit:   f5ec1e2
     Built:        Tue Jun 27 02:21:36 2017
     OS/Arch:      linux/amd64
    
    Server:
     Version:      17.03.2-ce
     API version:  1.27 (minimum version 1.12)
     Go version:   go1.7.5
     Git commit:   f5ec1e2
     Built:        Tue Jun 27 02:21:36 2017
     OS/Arch:      linux/amd64
     Experimental: false
    复制代码

    3、docker 基础命令操作

    3.1 镜像操作

    3.1.1 搜索官方仓库镜像

    复制代码
    [root@along ~]# docker search nginx
    NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    nginx                                                  Official build of Nginx.                        10659     [OK]       
    jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1497                 [OK]
    richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   671                  [OK]
    复制代码

    搜索结果解释:

    参数

    说明

    NAME

    镜像名称

    DESCRIPTION

    镜像说明

    STARS

    点赞数量

    OFFICIAL

    是否是官方的

    AUTOMATED

    是否是自动构建的

    3.1.2 拉取镜像

    (1)根据镜像名称(tag指定版本)拉取镜像

    复制代码
    [root@along ~]# docker pull nginx:1.14-alpine
    1.14-alpine: Pulling from library/nginx
    cd784148e348: Pull complete 
    12b08f7ef616: Pull complete 
    65071a4e699c: Pull complete 
    9936647427be: Pull complete 
    Digest: sha256:e3f77f7f4a6bb5e7820e013fa60b96602b34f5704e796cfd94b561ae73adcf96
    Status: Downloaded newer image for nginx:1.14-alpine
    [root@along ~]# docker pull busybox
    Using default tag: latest
    latest: Pulling from library/busybox
    b4a6e23922dd: Pull complete 
    Digest: sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
    Status: Downloaded newer image for busybox:latest
    复制代码

    注:alpine 版本:构建容器小镜像的发型版本

    (2)查看当前主机镜像列表

    [root@along ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    busybox             latest              758ec7f3a1ee        7 days ago          1.15 MB
    nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 MB

    3.1.3 导出镜像

    [root@along ~]# docker image save busybox > docker-busybox.tar.gz
    [root@along ~]# ls docker-busybox.tar.gz 
    docker-busybox.tar.gz
    [root@along ~]# docker image save -o /mnt/busybox_nginx.tar.gz busybox:latest nginx:1.14-alpine 
    [root@along ~]# ls /mnt/busybox_nginx.tar.gz 
    /mnt/busybox_nginx.tar.gz

    注:

    • -o:指定导出镜像的位置;
    • 可以同时导出多个镜像;为一个文件;
    • 指定.tar.gz 可以导出并压缩。

     

    3.1.4 删除镜像

    复制代码
    [root@along ~]# docker image rm busybox
    Untagged: busybox:latest
    Untagged: busybox@sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
    Deleted: sha256:758ec7f3a1ee85f8f08399b55641bfb13e8c1109287ddc5e22b68c3d653152ee
    Deleted: sha256:23bc2b70b2014dec0ac22f27bb93e9babd08cdd6f1115d0c955b9ff22b382f5a
    [root@along ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 MB
    复制代码

    3.1.5 导入镜像

    复制代码
    [root@along ~]# docker image load -i docker-busybox.tar.gz 
    23bc2b70b201: Loading layer  1.37 MB/1.37 MB
    Loaded image: busybox:latest
    [root@along ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    busybox             latest              758ec7f3a1ee        7 days ago          1.15 MB
    nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 MB
    复制代码

    3.1.6 查看镜像的详细信息

    [root@docker01 ~]# docker image inspect centos

    3.2 容器操作

    3.2.1 启动容器

    方法1(不推荐):

      先创建一个容器:docker create 镜像名

      再启动容器:docker start 容器名

    方法2:docker run 镜像名

    (1)格式

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    (2)options 常用命令选项

    •  -t :打开一个终端,像使用交换机一样使用容器
    •  -i:交互式访问
    •  --name:容器名字
    •  --network:指定网络
    •  --rm:容器一停,自动删除
    •  -d:剥离与当前终端的关系;否则会一直占据着终端
    •  -p:端口映射,将容器内服务的端口映射在宿主机的指定端口
      • -p <container port>
      • -p <hostport>:<container port>
      • -p <hostip>:<hostport>:<container port>

    (3)示例:运行一个容器

    复制代码
    [root@along ~]# docker run --name web1 -d -p 8888:80 nginx:1.14-alpine
    ced78e522fd747635e9af01bc20882094e3b55ce50b9ae248962e8e8eeb89774
    [root@along ~]# docker port web1   查询docker端口映射
    80/tcp -> 0.0.0.0:8888
    [root@along ~]# docker run --name b1 -it busybox /bin/sh  在运行容器时,交互式进入容器
    / # ls /
    bin   dev   etc   home  proc  root  sys   tmp   usr   var
    / # exit  退出
    复制代码

    (4)查询容器运行状态命令

    [root@along ~]# docker ps / docker container ls  两个命令是一样的效果

      -a:查询所有的容器

    注:容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!

    复制代码
    [root@along ~]# docker ps   只显示运行的容器
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    ced78e522fd7        nginx:1.14-alpine   "nginx -g 'daemon ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8888->80/tcp     web1
    [root@along ~]# docker ps -a   查询所有容器
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                  NAMES
    bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   3 minutes ago       Up 3 minutes               0.0.0.0:8888->80/tcp   web1
    9621f704b756        busybox             "/bin/sh"                3 minutes ago       Exited (0) 3 minutes ago                          b1
    复制代码

    3.2.2 停止运行的容器

    docker stop  关闭运行的容器

    docker kill   杀死运行的容器

      -s:指定信号,和kill 用法一样;-9 强制停止容器

    复制代码
    [root@along ~]# docker kill web1
    web1
    [root@along ~]# docker ps   只显示运行的容器
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@along ~]# docker ps -a   查询所有容器
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   5 minutes ago       Exited (137) 1 second ago                       web1
    9621f704b756        busybox             "/bin/sh"                5 minutes ago       Exited (0) 5 minutes ago                        b1
    复制代码

    3.2.3 激活关闭的容器

    docker start

    (1)格式

    Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]

    (2)Options:

    • -a:附加到当前终端
    • -i:交互式

    (3)示例

    复制代码
    [root@along ~]# docker start web1
    web1
    [root@along ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    ced78e522fd7        nginx:1.14-alpine   "nginx -g 'daemon ..."   9 minutes ago       Up 8 seconds        0.0.0.0:8888->80/tcp    web1
    复制代码

    3.2.4 查看容器的详细信息

    复制代码
    [root@along ~]# docker inspect web1
    [root@along ~]# docker inspect web1 |grep "IPAddress"   比如我查询到容器的ip
                "SecondaryIPAddresses": null,
                "IPAddress": "172.17.0.2",
                        "IPAddress": "172.17.0.2",
    [root@along ~]# curl 172.17.0.2   通过容器的IP,在宿主机上访问服务
    <!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>
    [root@along ~]# curl 127.0.0.1:8888  映射到宿主机的端口是8888
    <!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>
    复制代码

    3.2.5 删除容器

    复制代码
    [root@along ~]# docker kill web1  先关闭容器,再删除容器
    b1
    [root@along ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@along ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
    bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   6 minutes ago       Exited (137) 2 seconds ago                       web1
    9621f704b756        busybox             "/bin/sh"                6 minutes ago       Exited (0) 6 minutes ago                         b1
    [root@along ~]# docker rm web1
    web1
    [root@along ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
    9621f704b756        busybox             "/bin/sh"                6 minutes ago       Exited (0) 6 minutes ago                         b1
    [root@along ~]# docker rm -f `docker ps -a -q` 删除所有容器,-f 强制删除
    9621f704b756
    [root@along ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    复制代码

    3.2.6 对运行的容器执行指定命令exec

    [root@along ~]# docker exec / docker container exec   

    (1)格式

    Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

    (2)options 选项

    •  -d:在后台运行命令
    •  -e:设置环境变量
    •  -i:交互式
    •  -t:打开一个终端
    •  -u:用户名或UID

    (3)示例

    复制代码
    [root@along ~]# docker run --name web1 -d nginx:1.14-alpine
    81f336e878c0fb3187596f2acd12705d94f532978a8ad37c9f8ae33cc39bfb61
    ① 交互式进入容器
    [root@along ~]# docker exec -it web1 /bin/sh   
    / # ls /
    bin    etc    lib    mnt    root   sbin   sys    usr
    dev    home   media  proc   run    srv    tmp    var
    / # exit
    ② 查询ip
    [root@along ~]# docker exec web1 ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.2/16 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:2/64 scope link 
           valid_lft forever preferred_lft forever
    复制代码

    3.2.7 查询容器内部日志

    [root@along ~]# curl 172.17.0.2
    [root@along ~]# docker logs web1
    172.17.0.1 - - [03/Jan/2019:09:00:42 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

    3.2.8 一图总结对容器的操作命令

     
  • 相关阅读:
    Xshell添加快捷按钮
    Go语言基础之21--反射
    Jenkins自动化CI CD流水线之7--流水线自动化发布PHP项目
    Jenkins自动化CI CD流水线之6--构建邮件状态通知
    Jenkins自动化CI CD流水线之5--pipeline
    Python练习-函数(方法)的定义和应用
    Python文件操作-文件的增删改查
    Python练习-不知道弄个什么鬼
    Python练习-短小精干版三级"片儿"
    Python练习-三级菜单与"片儿"无关!
  • 原文地址:https://www.cnblogs.com/dengbingbing/p/10399237.html
Copyright © 2011-2022 走看看