zoukankan      html  css  js  c++  java
  • docker 基础

    目录 : 

       基础

       网络访问 

       数据管理

       镜像构建

       仓库

       杂谈

            --Docker 资源隔离

            --Docker 资源限制

            --Docker 网络模式

    1:在 linux 64位上跑  (win不是不行,基本不用)

    2:安装 https://docs.docker.com/install/linux/docker-ce/centos/ (yum 安装 挺快)

    (  安装完后注意 Docker中配置国内镜像  不然pull的时候特慢 )

    学习时 版本为

    ======================================================================
    Package      Arch      Version           Repository      Size
    ======================================================================
    Installing:
    docker-ce     x86_64   18.03.1.ce-1.el7.centos         docker-ce-stable            35 M

    2:启动 systemctl start docker

    3:一些命令

    [root@192 ~]#

          docker search centos

     名称                 描述        星数                    官方的             自动构建
    NAME            DESCRIPTION      STARS      OFFICIAL      AUTOMATED
    centos           The official build of CentOS.    4214       [OK]
    ansible/centos7-ansible        Ansible on Centos7      109                  [OK]

    (名称格式介绍  官方的就算了  看这个  ansible/centos7-ansible    ansible表示用户名  centos7-ansible表示项目名)

           docker pull centos(就是 search 出来的 NAME)  pull的时候挺慢的...

           docker images 查看当前有的镜像

    [root@192 ~]# docker images

    跟search出来的NAME相同         镜像唯一id      这个是此镜像产生的时间
    REPOSITORY                       TAG                IMAGE ID                CREATED                SIZE

    redis                                       latest              bfcb1f6df2db            2 days ago               107MB

          docker rmi xxx   删除镜像

    关键语句 : 基于镜像创建容器

          docker run centos /bin/echo 'hello word' (运行centos镜像下的  /bin/echo 命令 参数为 "hello word" 运行时带名字加 --name xxx)

          docker run --name LPfirstContainer -it centos /bin/bash (-it是两个参数的缩写 用了-it运行命令后不会退出docker容器 比较没用 还是用下面介绍的 -d 吧) 效果:

    1:若没有 centos 镜像 会自动 pull 下来
    2:会分配一个文件系统 在这个centos镜像位置的上一层 并让它可写 同时还会分配一个ip地址
    3:最后会运行指定的命令或应用程序 就是后面的 /bin/bash (当 命令或应用程序退出 容器就会退出)
    4:退出输入 exit 即可
    [root@192 ~]# docker run --name LPfistContainer -it centos /bin/bash [root@a3ba6ef4d0cc /]#

          docker ps -a  可以看到运行的容器和停止运行的容器

    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES(如果启动时不指定名字 会自动生成个)
    6c03fff6f519        centos              "/bin/echo 'hello wo…"   About a minute ago   Exited (0) About a minute ago                       distracted_heisenberg

          docker start (CONTAINER ID) 重启停了的容器

          docker run -d --name mydocker11 centos (-d在后台启动容器 会返回容器ID 通过 docker ps -a 看到的容器ID会短点)

    [root@192 ~]# docker run -d --name nginxfirst nginx
    f2e8b29c9be7f85f61c62b1fa0c09838dcd79ee3d8c302f4c51e901c776371b4
    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
    f2e8b29c9be7        nginx               "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes               80/tcp              nginxfirst
    a3ba6ef4d0cc        centos              "/bin/bash"              2 hours ago         Exited (127) 2 hours ago                       LPfistContainer
    6c03fff6f519        centos              "/bin/echo 'hello wo…"   3 hours ago         Exited (0) 3 hours ago                         distracted_heisenberg
    [root@192 ~]# 

           docker stop (CONTAINER ID) 停止容器运行

           docker rm (CONTAINER ID) 删除容器,容器得是停止状态 或者加 -f ,后面可跟多个容器ID 空格区分

           docker attach (CONTAINER ID) 进入容器  靠谱的方式在下一条命令

    [root@192 ~]# docker run --name nginxfff -d nginx
    ee3888788a3ffa8e7c1ae72c58670fb2ed41e9868f0e4cea1254d49f4542283f
    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    ee3888788a3f        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         80/tcp              nginxfff
    [root@192 ~]# docker attach ee3888788a3f   (有些容器不能这样进入或者进去的几率低...  结果得 ctrl+c 最终结果是容器停止了)
    ^C[root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                    PORTS               NAMES
    ee3888788a3f        nginx               "nginx -g 'daemon of…"   About a minute ago   Exited (0) 1 second ago                       nginxfff
    [root@192 ~]# 

           nsenter 通过容器的 Pid 进入容器 容器得是启动状态 没有这个命令的话 linux 装下这个软件包 yum install util-linux   推荐的进入方法

            1:首先获取容器Pid : docker inspect --format "{{.State.Pid}}" (容器名或容器ID)   

    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    ee3888788a3f        nginx               "nginx -g 'daemon of…"   14 minutes ago      Exited (0) 12 minutes ago                       nginxfff
    [root@192 ~]# docker start ee3888788a3f
    ee3888788a3f
    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    ee3888788a3f        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 1 second         80/tcp              nginxfff
    [root@192 ~]# docker inspect --format "{{.State.Pid}}" nginxfff
    4231
    [root@192 ~]# docker inspect --format "{{.State.Pid}}" ee3888788a3f
    4231
    [root@192 ~]# 

            2:nsenter --target Pid值 --mount --uts --ipc --net --pid

    [root@192 ~]# docker inspect --format "{{.State.Pid}}" ee3888788a3f
    4231
    [root@192 ~]# nsenter --target 4231 --mount --uts --ipc --net --pid
    mesg: ttyname failed: No such file or directory
    root@ee3888788a3f:/#    (退出 exit 退出后容器不会停止)

               由于这两条命令经常用  脚本如下:  (赋予脚本执行权限 chmod  +x   *.sh)

    [root@test-node1 ~]# cat in.sh
    #!/bin/bash
    CNAME=$1
    CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME)
    nsenter --target "$CPID" --mount --uts --ipc --net --pid
    [root@test-node1 ~]#

     网络访问

            随机映射 : docker run -d -P --name mynginx1 nginx 启动 并随机映射端口 以下显示docker的80端口被映射到主机的32768端口

    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@192 ~]# docker run -d -P --name mynginx1 nginx
    2b0f1c1f585888c9189ba099afe75b54d9e77d60743866771e89369f2334f52c
    [root@192 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    2b0f1c1f5858        nginx               "nginx -g 'daemon of…"   14 seconds ago      Up 12 seconds       0.0.0.0:32768->80/tcp   mynginx1
    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    2b0f1c1f5858        nginx               "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       0.0.0.0:32768->80/tcp   mynginx1
    [root@192 ~]# 

            指定映射 : docker run -d -p 91:80 --name mynginx2 nginx 启动 并指定映射端口 以下显示docker的80端口被映射到主机的91端口       

    [root@192 ~]# docker run -d -p 91:80 --name mynginx2 nginx
    673fae5f191c26e0881bf4186d2bfdf56f61aaf67226b269e70935914fbacc7a
    [root@192 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    673fae5f191c        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:91->80/tcp   mynginx2
    [root@192 ~]# 

            -p hostPort:containerPort

            -p ip:hostPort:containerPort  主机有多个ip

            -p ip::containerPort      主机有多个ip

            

            -p hostPort:containerPort   这条命令可多次执行 但别执行一样的

            -p hostPort:containerPort

     数据管理

            docker 的两种数据存储方案    一 数据卷,二 数据卷容器

            一 数据卷

                                          主机名    使用数据卷    创建的数据卷叫data
    
              docker run -it --name volume-test1 -h   centoss   -v       /data         centos 
    [root@192 ~]# docker run -it --name volume-test1 -h centoss -v /data centos 
    [root@centoss /]# cd data (有这个目录了)
    [root@centoss data]# ll
    total 0
    [root@centoss data]# 

    对比这个看看

    [root@192 ~]# docker run -it --name volume-test1 centos 
    [root@ae83f6c898ad /]# cd data
    bash: cd: data: No such file or directory
    [root@ae83f6c898ad /]# 

    具体的这个 数据卷对应主机的目录是哪呢

             docker inspect volume-test1(找到里面的 Mounts 或可以写成这样 docker inspect volume-test1 | grep Mounts -A 10)

            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "be6ab5ff053cc22309b7734de8dc26decfb5a23fa9aac853cba65ff3e4be1336",
                    "Source": "/var/lib/docker/volumes/be6ab5ff053cc22309b7734de8dc26decfb5a23fa9aac853cba65ff3e4be1336/_data",
                    "Destination": "/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],

    如:

    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    beec10aa8689        centos              "/bin/bash"         9 minutes ago       Exited (0) 9 minutes ago                       volume-test1
    [root@192 ~]# docker start beec10aa8689
    beec10aa8689
    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    beec10aa8689        centos              "/bin/bash"         10 minutes ago      Up 2 seconds                            volume-test1
    [root@192 ~]# ./in.sh beec10aa8689
    [root@centoss /]# cd data/
    [root@centoss data]# vi hello_docker
    hahaha~
    ~
    ~
    ~
    "hello_docker" [New] 1L, 8C written
    [root@centoss data]# exit
    logout
    [root@192 ~]# more /var/lib/docker/volumes/be6ab5ff053cc22309b7734de8dc26decfb5a23fa9aac853cba65ff3e4be1336/_data/hello_docker 
    hahaha~
    [root@192 ~]# 

             指定物理主机目录 挂载到容器上去 

                              物理的opt目录:容器的opt目录   opt目录后别再加/(斜线)

             docker run -it --name volume-test2 -h centosxx -v /opt:/opt centos

             docker run -it --name volume-test2 -h centosxx -v /opt:/opt:ro centos   挂载为只读

             二 数据卷容器

                     volume-test4的数据卷来自于volume-test1(就算volume-test1是停的也没关系,volume-test4也能访问到)

             docker run -it --name volume-test4 --volumes-from volume-test1 centos

    [root@192 ~]# docker run -it --name volume-test1 -h centoss -v /datass centos 
    [root@centoss /]# cd datass/
    [root@centoss datass]# exit
    exit
    [root@192 ~]# docker run -it --name volume-test4 --volumes-from volume-test1 centos
    [root@16c8c496fbea /]# cd datass/
    [root@16c8c496fbea datass]# exit
    exit
    [root@192 ~]# docker ps -a;
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    16c8c496fbea        centos              "/bin/bash"         13 seconds ago      Exited (0) 4 seconds ago                        volume-test4
    4000bbf68d26        centos              "/bin/bash"         53 seconds ago      Exited (0) 27 seconds ago                       volume-test1
    [root@192 ~]# 

      镜像构建

         包括 手动构建和Dockerfile 两种方式  

         例 : 手动构建   一个nginx  (通过在官方的centos镜像中安装nginx实现 源码安装...)  

    [root@192 ~]# docker run --name nginx-man -it centos
    [root@1ee70298d5bd /]# yum install -y wget gcc gcc-c++ make openssl-devel
    
    ...进行各种操作

         

     

           接着

             wget http://nginx.org/download/nginx-1.13.12.tar.gz

             wget  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz     

    [root@1ee70298d5bd /]# mv *.tar.gz /usr/local/src/
    [root@1ee70298d5bd /]# cd /usr/local/src/
    [root@1ee70298d5bd src]# tar zxf pcre-8.38.tar.gz
    [root@1ee70298d5bd src]# tar zxf nginx-1.13.12.tar.gz
    [root@1ee70298d5bd src]# useradd -s /sbin/nologin -M www

    -s<shell>   指定用户登入后所使用的shell。

     /sbin/nologin指的是不允许login当前Linux系统。当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示如下内

      容:This account is currently not available。该功能类似于封掉某个帐户。

     -M  不要自动建立用户的登入目录。

     [root@1ee70298d5bd nginx-1.13.12]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.38

     [root@1ee70298d5bd nginx-1.13.12]# make

     [root@1ee70298d5bd nginx-1.13.12]# make install

     [root@1ee70298d5bd nginx-1.13.12]# vi /etc/rc.local (设置开机自动启动 这是使用者自订开机启动程序 (/etc/rc.d/rc.local)  lrwxrwxrwx.  1 root root     13 Apr  2 18:38 rc.local -> rc.d/rc.local提示:这个设置开机启动的方法是不行的 下面有能用的开机启动方法

     

     但 这样还是不行 docker 里面必须得前台运行 

      [root@1ee70298d5bd nginx-1.13.12]# vi /usr/local/nginx/conf/nginx.conf  (将 nginx 配置为前台运行)

     

    如果启动命令单纯是以后台守护(daemon)模式启动nginx,那么启动命令会立即结束,容器也会立即结束。
    其实只要在任何命令之后加一句 && cat,就会让这条命令卡在前台而不会结束,不是非得用daemon off

           将容器做成镜像

            docker commit -m "my nginx" 1ee70298d5bd lp/myfirstnginx:v1(用户名 项目名 版本号)

    [root@192 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
    1ee70298d5bd        centos              "/bin/bash"         5 hours ago         Exited (137) 2 seconds ago                       nginx-man
    [root@192 ~]# docker commit -m "my nginx" 1ee70298d5bd lp/myfirstnginx:v1
    sha256:caf2eb2e918e4ac6ad553e321ab78ea7b31ba707ea0d92ae772c9e934e1466d8
    [root@192 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    lp/myfirstnginx     v1                  caf2eb2e918e        About a minute ago   423MB
    nginx               latest              ae513a47849c        10 days ago          109MB
    kong                latest              b9dbcf499414        2 weeks ago          91.5MB
    centos              latest              e934aafc2206        4 weeks ago          199MB
    [root@192 ~]# 

            然后这个镜像就可以启动了

    [root@192 ~]# docker run -d -p 99:80 lp/myfirstnginx
    Unable to find image 'lp/myfirstnginx:latest' locally
    docker: Error response from daemon: pull access denied for lp/myfirstnginx, repository does not exist or may require 'docker login'.
    See 'docker run --help'.
    [root@192 ~]# docker run -d -p 99:80 lp/myfirstnginx:v1 (加上版本号)
    2e8f6810773814d9fec11e04a9528cf564a6515893ad8a32559bdfe41e6504c9
    [root@192 ~]# 

            启动后却是  Exited 

            开机启动且不会退出的解决方式

            /etc/rc.local 里面把启动 nginx 的语句删了 nginx的配置文件也还是要加那个daemon off然后从弄个镜像 启动语句这样

              docker run -d -p 99:80 lp/myfirstnginx:v? /usr/local/nginx/sbin/nginx

            例 : Dockerfile  一个nginx        

              

     

    [root@192 ~]# mkdir /opt/docker-file
    [root@192 ~]# cd /opt/docker-file
    [root@192 docker-file]# mkdir nginx
    [root@192 docker-file]# cd nginx
    [root@192 nginx]# pwd
    /opt/docker-file/nginx
    [root@192 nginx]#
    [root@192 ~]# cd /opt/docker-file/nginx/
    [root@192 nginx]# 
    [root@192 nginx]# 
    [root@192 nginx]# wget http://nginx.org/download/nginx-1.13.12.tar.gz
    --2018-05-11 18:06:03--  http://nginx.org/download/nginx-1.13.12.tar.gz
    Resolving nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...
    Connecting to nginx.org (nginx.org)|206.251.255.63|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 1016311 (992K) [application/octet-stream]
    Saving to: ‘nginx-1.13.12.tar.gz’
    
    100%[====================================================================================================================================================>] 1,016,311    378KB/s   in 2.6s   
    
    2018-05-11 18:06:06 (378 KB/s) - ‘nginx-1.13.12.tar.gz’ saved [1016311/1016311]
    
    [root@192 nginx]# wget  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
    --2018-05-11 18:06:12--  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
               => ‘pcre-8.38.tar.gz’
    Resolving ftp.csx.cam.ac.uk (ftp.csx.cam.ac.uk)... 131.111.8.115
    Connecting to ftp.csx.cam.ac.uk (ftp.csx.cam.ac.uk)|131.111.8.115|:21... connected.
    Logging in as anonymous ... Logged in!
    ==> SYST ... done.    ==> PWD ... done.
    ==> TYPE I ... done.  ==> CWD (1) /pub/software/programming/pcre ... done.
    ==> SIZE pcre-8.38.tar.gz ... 2053336
    ==> PASV ... done.    ==> RETR pcre-8.38.tar.gz ... done.
    Length: 2053336 (2.0M) (unauthoritative)
    
    100%[====================================================================================================================================================>] 2,053,336    447KB/s   in 4.5s   
    
    2018-05-11 18:06:23 (447 KB/s) - ‘pcre-8.38.tar.gz’ saved [2053336]
    
    [root@192 nginx]# ll
    total 3004
    -rw-r--r--. 1 root root 290 May 11 18:10 Dockerfile
    -rw-r--r--. 1 root root 1016311 Apr 10 22:19 nginx-1.13.12.tar.gz
    -rw-r--r--. 1 root root 2053336 May 11 18:06 pcre-8.38.tar.gz
    [root@192 nginx]# pwd
    /opt/docker-file/nginx (文件和包的准备都放在这里)
    [root@192 nginx]# 
    [root@192 nginx]# cat Dockerfile 
    # This is my first Dockerfile
    # Version 1.0
    # Author: lp
    
    #Base images
    FROM centos
    
    #MAINTAINER
    MAINTAINER LP
    
    #ADD
    ADD pcre-8.38.tar.gz /usr/local/src
    ADD nginx-1.13.12.tar.gz /usr/local/src
    
    #RUN
    RUN yum install -y wget gcc gcc-c++ make openssl-devel
    RUN useradd -s /sbin/nologin -M www
    
    #WORKDIR
    WORKDIR /usr/local/src/nginx-1.13.12
    
    RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.38 && make && make install
    
    RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
    
    #EXPOSE
    EXPOSE 80
    
    ENV PATH /usr/local/nginx/sbin:$PATH
    
    CMD ["nginx"]
    [root@192 nginx]# 

          包 文件 目录都对上后 就可以开始构建了

                -t 后面是指定的名字和版本

          docker build -t nginx-file:v1 /opt/docker-file/nginx/

          成功后  

    [root@192 nginx]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx-file          v1                  fccb8c19890a        14 seconds ago      414MB
    lp/myfirstnginx     v4                  03bf4c65af38        18 hours ago        423MB
    lp/myfirstnginx     v3                  74b763176158        18 hours ago        423MB
    lp/myfirstnginx     v2                  b2ec4b6c7068        19 hours ago        423MB
    lp/myfirstnginx     v1                  caf2eb2e918e        20 hours ago        423MB
    nginx               latest              ae513a47849c        10 days ago         109MB
    kong                latest              b9dbcf499414        2 weeks ago         91.5MB
    centos              latest              e934aafc2206        4 weeks ago         199MB
    [root@192 nginx]# 

          跑的试试

    [root@192 nginx]# docker run -d --name mynginxfile01 -p 99:80 nginx-file:v1
    1117fcbf41ddbeddf6ba90d24f7f5d0d42596c8e4c1d46022a13f2f16c9ec8e0
    [root@192 nginx]# docker ps -a
    CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                NAMES
    1117fcbf41dd        nginx-file:v1        "nginx"                  9 seconds ago       Up 8 seconds                0.0.0.0:99->80/tcp   mynginxfile01
    22b11f23f745        lp/myfirstnginx:v4   "/usr/local/nginx/sb…"   18 hours ago        Exited (0) 18 hours ago                          wizardly_turing
    66e91bb016a5        lp/myfirstnginx:v3   "/bin/bash"              18 hours ago        Exited (0) 18 hours ago                          happy_hoover
    28e93291b7db        lp/myfirstnginx:v2   "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                          sad_visvesvaraya
    dd699eee3c00        lp/myfirstnginx:v1   "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                          cranky_edison
    1ee70298d5bd        centos               "/bin/bash"              24 hours ago        Exited (137) 20 hours ago                        nginx-man
    [root@192 nginx]# 

     仓库

          docker pull registry 私库没弄

          向docker传自己的镜像

          0:登录docker :docker login (本人用户名是 lpregistry2018)

          1:打 tag

    [root@192 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    stress-file         v1                  1aae2aa28157        22 hours ago        219MB
    nginx-file          v1                  fccb8c19890a        23 hours ago        414MB
    lp/myfirstnginx     v4                  03bf4c65af38        41 hours ago        423MB
    lp/myfirstnginx     v3                  74b763176158        41 hours ago        423MB
    lp/myfirstnginx     v2                  b2ec4b6c7068        41 hours ago        423MB
    lp/myfirstnginx     v1                  caf2eb2e918e        42 hours ago        423MB
    nginx               latest              ae513a47849c        11 days ago         109MB
    kong                latest              b9dbcf499414        2 weeks ago         91.5MB
    centos              latest              e934aafc2206        5 weeks ago         199MB
    registry            latest              d1fd7d86a825        4 months ago        33.3MB
    [root@192 ~]#    
    [root@192 ~]# docker tag --help
    
    Usage:  docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
    
    Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
    
    Options:
    
    [root@192 ~]#

          docker tag lp/myfirstnginx:v4 lpregistry2018/lpregistry_nginx  注意得带上账户名

    [root@192 ~]#  docker tag lp/myfirstnginx:v4 lpregistry2018/lpregistry_nginx
    [root@192 ~]# docker images
    REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
    stress-file                                 v1                  1aae2aa28157        23 hours ago        219MB
    nginx-file                                  v1                  fccb8c19890a        24 hours ago        414MB
    lpregistry_nginx                            v1                  03bf4c65af38        42 hours ago        423MB
    lp/myfirstnginx                             v4                  03bf4c65af38        42 hours ago        423MB
    lpregistry/nginx                            v1                  03bf4c65af38        42 hours ago        423MB
    lpregistry2018/lpregistry_nginx             latest              03bf4c65af38        42 hours ago        423MB
    lpregistry2018/nginx2018/lpregistry_nginx   latest              03bf4c65af38        42 hours ago        423MB
    lp/myfirstnginx                             v3                  74b763176158        42 hours ago        423MB
    lp/myfirstnginx                             v2                  b2ec4b6c7068        42 hours ago        423MB
    lp/myfirstnginx                             v1                  caf2eb2e918e        43 hours ago        423MB
    nginx                                       latest              ae513a47849c        11 days ago         109MB
    kong                                        latest              b9dbcf499414        2 weeks ago         91.5MB
    centos                                      latest              e934aafc2206        5 weeks ago         199MB
    registry                                    latest              d1fd7d86a825        4 months ago        33.3MB
    [root@192 ~]#

          2:push

    [root@192 ~]# docker push --help
    
    Usage:  docker push [OPTIONS] NAME[:TAG]
    
    Push an image or a repository to a registry
    
    Options:
          --disable-content-trust   Skip image signing (default true)
    [root@192 ~]# 

          docker push lpregistry2018/lpregistry_nginx

    [root@192 ~]# docker push lpregistry2018/lpregistry_nginx
    The push refers to repository [docker.io/lpregistry2018/lpregistry_nginx]
    bebe3169f352: Pushed 
    29042eb7dbc3: Pushed 
    487b0057eefa: Pushed 
    979443975c56: Pushed 
    43e653f84b79: Pushed 
    latest: digest: sha256:dfcdda5336a8a86fd33a307da68f612eec67457ba4c2d376824e1e815185a6c9 size: 1364
    [root@192 ~]# 

          在另一台机器pull下 (极慢...)

    [root@192 ~]# systemctl start docker
    [root@192 ~]# docker pull lpregistry2018/lpregistry_nginx
    Using default tag: latest
    latest: Pulling from lpregistry2018/lpregistry_nginx
    469cfcc7a4b3: Pull complete 
    e00778fc1b45: Downloading [==============================>                    ]   51.6MB/85.28MB
    446f480867b2: Download complete 
    72a721fcc3f1: Download complete 
    b3281401aa76: Download complete 
           

     杂谈

          Docker 资源隔离  LXC Kernel namespace

                           Pid

                           Net

                           lpc

                           Mnt

                           Uts

                           User    

           Docker 资源限制   cgroup  (安卓也是的 不同进程崩溃 不会影响其他的)

                   CPU 内存 (磁盘?)

     安装个 stress 压力测试工具 首先需要 epel-6的yum源  提供处 http://mirrors.aliyun.com/repo/

    直接弄个 stress的Dockerfile

    [root@192 docker-file]# mkdir stress
    [root@192 docker-file]# cd stress/
    [root@192 stress]# ll
    total 0
    [root@192 stress]# wget http://mirrors.aliyun.com/repo/epel-6.repo
    --2018-05-11 19:10:23--  http://mirrors.aliyun.com/repo/epel-6.repo
    Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 183.61.241.239, 59.63.233.107, 59.63.233.104, ...
    Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|183.61.241.239|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 1083 (1.1K) [application/octet-stream]
    Saving to: ‘epel-6.repo’
    
    100%[====================================================================================================================================================>] 1,083       --.-K/s   in 0s      
    
    2018-05-11 19:10:23 (71.0 MB/s) - ‘epel-6.repo’ saved [1083/1083]
    
    [root@192 stress]# pwd
    /opt/docker-file/stress
    [root@192 stress]# ll
    total 4
    -rw-r--r--. 1 root root 1083 Jul  2  2014 epel-6.repo
    [root@192 stress]# vi Dockerfile
    [root@192 ~]# cd /opt/docker-file/stress/
    [root@192 stress]# ll
    total 8
    -rw-r--r--. 1 root root  111 May 11 19:14 Dockerfile
    -rw-r--r--. 1 root root 1083 Jul  2  2014 epel-6.repo
    [root@192 stress]# more Dockerfile 
    FROM centos
    ADD epel-6.repo /etc/yum.repos.d/
    RUN yum -y install stress && yum clean all
    ENTRYPOINT ["stress"]
    [root@192 stress]# docker build -t stress-file:v1 .
    [root@192 stress]# docker run --help
    
    Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Run a command in a new container
    
    Options:
          --add-host list                  Add a custom host-to-IP mapping (host:ip)
      -a, --attach list                    Attach to STDIN, STDOUT or STDERR
          --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
          --blkio-weight-device list       Block IO weight (relative device weight) (default [])
          --cap-add list                   Add Linux capabilities
          --cap-drop list                  Drop Linux capabilities
          --cgroup-parent string           Optional parent cgroup for the container
          --cidfile string                 Write the container ID to the file
          --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
          --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
          --cpu-rt-period int              Limit CPU real-time period in microseconds
          --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
      -c, --cpu-shares int                 CPU shares (relative weight)
          --cpus decimal                   Number of CPUs
          --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
          --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)

      -c, --cpu-shares int                 CPU shares (relative weight)

        默认配额是 1024
        假如物理机只启动了一个docker容器 默认就是1024的配额 那么在这种情况下这个容器是可以跑物理机100%cpu的
        假如物理机启动了两个docker容器 默认都是1024的配置 这种情况每个容器只能跑50%cpu

             对cpu的限制

          cat /proc/cpuinfo

           只有一个 processor 即一个逻辑核

              --rm 运行结束后删除容器   --cpu是stress的指令 简单说就是跑满一个cpu

           docker run -it --rm stress-file:v1 --cpu 1

           另一个窗口看一下

    top - 19:47:52 up 20:57,  2 users,  load average: 0.97, 0.32, 0.15
    Tasks: 234 total,   3 running, 231 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1877664 total,   916408 free,   314720 used,   646536 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1369004 avail Mem 
    Maximum tasks = 0, change to (0 is unlimited) null
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                    
    13443 root      20   0    7264     92      0 R 99.3  0.0   1:22.90 stress                                                                                                                     
    13448 root      20   0  146236   2184   1432 R  0.3  0.1   0:00.09 top                                                                                                                        
        1 root      20   0   46224   6712   3968 S  0.0  0.4   0:02.76 systemd                                                                                                                    
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd     

          再开一个窗口  再运行 docker run -it --rm stress-file:v1 --cpu 1

          结果 被平均了 两个 stress 占用cpu  1:1

    top - 19:50:38 up 21:00,  3 users,  load average: 2.11, 0.90, 0.39
    Tasks: 247 total,   4 running, 243 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1877664 total,   893220 free,   327024 used,   657420 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1354492 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                    
    13569 root      20   0    7264     96      0 R 49.8  0.0   0:13.55 stress                                                                                                                     
    13443 root      20   0    7264     92      0 R 49.5  0.0   3:54.26 stress                                                                                                                     
        1 root      20   0   46224   6712   3968 S  0.0  0.4   0:02.78 systemd                                                                                                                    
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 kthreadd  

          关掉第二个stress 再运行 docker run -it -c 512 --rm stress-file:v1 --cpu 1

          结果 被平均了 两个 stress 占用cpu  2:1 等于 1024:512

    top - 19:54:50 up 21:04,  3 users,  load average: 1.65, 1.23, 0.65
    Tasks: 247 total,   4 running, 243 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1877664 total,   895648 free,   325048 used,   656968 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1356332 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                    
    13443 root      20   0    7264     92      0 R 66.1  0.0   7:35.48 stress                                                                                                                     
    13744 root      20   0    7264     92      0 R 33.2  0.0   0:05.47 stress                                                                                                                     
      741 root      20   0  283124   6800   4140 S  0.3  0.4   0:00.19 rsyslogd                                                                                                                   
     2220 root      20   0  141320   5164   3880 S  0.3  0.3   0:06.71 sshd                                                                                                                       
    13571 root      20   0       0      0      0 S  0.3  0.0   0:00.31 kworker/0:3

             关掉各种测试 容器

          再试试其他参数

    [root@192 stress]# docker run --help
    
    Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Run a command in a new container
    
    Options:
          --add-host list                  Add a custom host-to-IP mapping (host:ip)
      -a, --attach list                    Attach to STDIN, STDOUT or STDERR
          --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
          --blkio-weight-device list       Block IO weight (relative device weight) (default [])
          --cap-add list                   Add Linux capabilities
          --cap-drop list                  Drop Linux capabilities
          --cgroup-parent string           Optional parent cgroup for the container
          --cidfile string                 Write the container ID to the file
          --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
          --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
          --cpu-rt-period int              Limit CPU real-time period in microseconds
          --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
      -c, --cpu-shares int                 CPU shares (relative weight)
          --cpus decimal                   Number of CPUs
          --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
          --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)

    --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
        分配几个cpu

           cat /proc/cpuinfo

           有两个 processor 即两个逻辑核

          启动一个 docker run -it --cpuset-cpus 1 --rm stress-file:v1 --cpu 1

          另一个窗口查看  

    top - 20:11:37 up 4 min,  2 users,  load average: 0.67, 0.27, 0.11
    Tasks: 243 total,   3 running, 240 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 50.1 us,  0.2 sy,  0.0 ni, 49.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1877688 total,  1132340 free,   309020 used,   436328 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1385912 avail Mem 
    Maximum tasks = 0, change to (0 is unlimited) nullnull
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                   
     2971 root      20   0    7264     92      0 R  99.7  0.0   1:05.08 stress                                                                                                                    
      142 root      20   0       0      0      0 S   0.3  0.0   0:00.66 kworker/1:0        

           cat /proc/cpuinfo

           有4个 processor 即4个逻辑核

          启动一个 docker run -it --cpuset-cpus 1 --rm stress-file:v1 --cpu 1

          另一个窗口查看 

    top - 20:21:03 up 5 min,  2 users,  load average: 0.31, 0.11, 0.06
    Tasks: 255 total,   2 running, 253 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 25.0 us,  0.1 sy,  0.0 ni, 74.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1877688 total,  1129316 free,   312108 used,   436264 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1380556 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                   
     2997 root      20   0    7264     92      0 R  99.7  0.0   0:07.71 stress                                                                                                                    
     2684 root      20   0  383368  23624  12224 S   0.3  1.3   0:00.83 docker-containe                                                                                                           
        1 root      20   0   46224   6712   3968 S   0.0  0.4   0:02.02 systemd                                                                                                                   
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd          
      -m, --memory bytes                   Memory limit
          --memory-reservation bytes       Memory soft limit
          --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable unlimited swap
          --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
          --mount mount                    Attach a filesystem mount to the container

          对内存的限制

                          --vm 1 --vm-bytes 120m --vm-hang 0  stress的命令

          docker run -it --rm -m 128m stress-file:v1 --vm 1 --vm-bytes 120m --vm-hang 0 没问题

          docker run -it --rm -m 128m stress-file:v1 --vm 1 --vm-bytes 127m --vm-hang 0 物理主机(VMware装的)自动重启了 连接也会断开

           Docker 网络模式

           默认桥接网络模式

    [root@192 ~]# brctl show
    bridge name     bridge id               STP enabled     interfaces
    docker0         8000.024256934b14       no
    [root@192 ~]# 

    虚拟网桥
    [root@192 ~]# ifconfig
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:56:93:4b:14  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.0.41  netmask 255.255.255.0  broadcast 192.168.0.255
            inet6 fe80::20c:29ff:fea3:af35  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:a3:af:35  txqueuelen 1000  (Ethernet)
            RX packets 15748  bytes 1054569 (1.0 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 666  bytes 66394 (64.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 0  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    [root@192 ~]# 

           HOST网络模式

          直接与物理机使用相同的网络(不同容器模式可以不同)

          奇葩网络模式

  • 相关阅读:
    vs2010 怎样设置文本编辑窗口和解决方案资源管理器同步?
    google浏览器如何导出书签
    C#面试题
    Inkscape tricks
    jupyter-notebook kernel died
    matplotlib 显示中文
    Ubuntu+apt-get update时的源
    vscode设置出错, 无法自动补全
    Ubuntu+vscode打不开
    Ubuntu+Firefox总是打不开网页
  • 原文地址:https://www.cnblogs.com/LiuPan2016/p/8989460.html
Copyright © 2011-2022 走看看