设为首页 收藏本站
查看: 994|回复: 0

[经验分享] Docker

[复制链接]
累计签到:161 天
连续签到:1 天
发表于 2017-8-13 21:11:54 | 显示全部楼层 |阅读模式
1.docker是操作系统级别的虚拟化,只能运行相同或相似内核的操作系统(类Unix系统),依赖于Linux的内核特性:Namespace和Cgroups,使用go语言编写
2.Docker是C/S架构程序。
3.写时复制,在最顶层的可写层上有底层的镜像的拷贝,底层的镜像是只读的
4.查看docker版本(docker version)
5.#docker search tutorial 在Docker Hub中搜索镜像
[iyunv@zhangleivod ~]# docker search tutorial
NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
learn/tutorial                                                                          28                  
georgeyord/reactjs-tutorial             This is the backend of the React comment b...   4                    [OK]

#docker pull learn/tutorial 从Docker Hub中拉取镜像
在拉取镜像的过程中会出现多个镜像,这也是docker镜像的层级机构的表现,每一级都是镜像都是在底层的镜像上创建增加的。

#docker run learn/tutorial echo "hello, world"

6.docker 安装、修改程序的每一步都是在最上层的可写层进行的操作
7.docker ps -l 查看当前的容器列表,docker -a 查看所有镜像
8.docker commit 容器ID号  learn/ping(docker的镜像名字)
9.docker inpect 容器ID号 查看容器的详细信息(也可以查看镜像的详细信息:docker inspect 镜像ID)
10.docker images 查看创建的image镜像
11.docker push learn/tutorial 将镜像推送至仓库中

******************************************************************************
1.Docker的命名空间(NameSpace),为了实现轻量级的虚拟化需要对各容器资源环境的隔离,进而引入命名空间
        PID(processID) 进程隔离
        NET(Network) 管理网络接口
        IPC(InterProcess Communication) 管理跨进程通信的访问
        MNT(Mount) 管理挂载点
        UTS(Unix TimesSharing System) 隔离内核和版本标识

2.Control groups控制组:
        用来分配资源
        来源于google
        Linux kernel 2.6.24 @2007
  Control groups 的作用
          资源限制(如各容器的内存限制)
          优先级设定
          资源计量
          资源控制
3.Docker容器的能力
        文件系统隔离: 每个容器都有自己的root文件系统
        进程隔离: 每个容器都运行在自己的进程环境中
        网络隔离:容器间的虚拟网络接口和IP地址都是分开的
        资源隔离和分组:使用cgrous将CPU和内存之类的资源独立的分配给每个docker容器

******************************************************************************
Docker的安装:略

********************************************************************************
1.ps -ef |grep docker  查看docker的后台进程运行情况
2.docker后台进程的启动、关闭、重启
        #systemctl start docker
        #systemctl stop docker
        #systemctl restart docker
3.docker启动配置文件
        /lib/systemd/system/docker.service

*******************************************************************************
1.启动docker
        #docker run ubuntu echo "hello,world" 命令执行完成后容器停止
        #docker run -i -t IMAGE /bin/bash        交互式运行docker容器
2.查看docker容器
        #docker ps -l  查看最新启动的docker容器
        #docker ps -a  查看启动过的所有的容器
        #docker inspect 容器的ID(可以不用是全称,只要与其他ID区分开即可) 查看容器的详细信息
        #docker run --name=自定义的容器名 -i -t IMAGE /bin/bash    自定义容器名,方便以后查询方便(包括查看容器的详细信息 #docker inspect 容器名(容器ID))
        #docker start -i 容器名(容器ID)  以交互式的方法来启动容器
        #docker rm 容器名(容器ID) 删除已经停止的docker容器
*******************************************************************************
docker 守护式容器:(适合运行应用程序和服务,适合长期运行)

1.#docker run -i -t IMAGE /bin/bash 启动的容器可以使用(CTRL + P 与 CTRL + q 来停止 )
2.#docker attach 容器名   进入已经在后台运行中的容器
3.#docker run -d --name=dc1  ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d:选项只是在后台运行指令,指令运行完成后,容器自动退出,所以上面使用while循环来执行命令,方便查看attach后的效果
4.查看docker容器执行命令的内部输出  #docker logs -t -f 容器名,使用-f选项可以使用CTRL + C 终止后台持续的输出,但不退出容器
        -t 显示时间
        --tail 10:可以显示最新输出的10条信息,数字设置为0 显示最新的输出信息
        -f 持续输出命令的输出信息
5.#docker top 容器名    查看docker 容器内的进程
6.在运行的容器中启动新进程
        #docker exec [-d] [-t] [-i]        容器名 [command] [arg]
        #docker exec -i -t dc1 /bin/bash
        #docker top dc1 查看dc1容器中新创建的进程
7.停止守护式容器:
        #docker stop 容器名   速度较慢
        #docker kill 容器名   速度较快
*********************************************************************************
docker部署静态网站
1.设置容器的端口映射
        docker run [-P] [-p]
        -P:为容器内的所有端口做映射
                #docker run -P -i -t ubunt /bin/bash

        -p:指定映射那些端口
                -p,--publish=[]
                1.containerPort
                        docker run -p 80 -i -t ubuntu /bin/bash   宿主机的端口是随机的,需要使用docker ps(docker port 容器名查看端口映射情况)
                2.hostPort:containerPort
                        docker run -p 8080:80 -i -t ubuntu /bin/bash
                3.ip:containerPort
                        docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
                4.ip:hostPort:containerPort
                        docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

容器中部署nginx服务器

注:docker E: Unable to locate package ping 安装软件时出现此问题,可以使用apt-get update 来更新解决
使用docker ps 来查看端口之间的映射关系,也可以使用docker port 容器名来查看端口的映射关系
使用docker top 容器名   查看容器中运行的进程


1.apt-get install -y nginx
2.apt-get install -y vim
3.mkdir -p /var/www/html
  cd /var/www/html
  vim index.html
  <html>
        <head>
        <title> Nginx in Docker</title>
        </head>

   <body>
        <h1> hello, I'm website in Docker</h1>
   </body>
4.使用curl http://127.0.0.1:32769 来验证,也可以使用容器内的IP(docker inspect 容器名来查看) curl http://容器内IP


***********************************************************************************************
查看和创建docker镜像和仓库
#docker info 查看容器的基础信息
#docker inspect 容器名(镜像名) 查看容器或是镜像的详细信息包括镜像的位置信息。"RootDir": "/var/lib/docker/overlay/aac2feb388e07c7a57497af46d94704bfcdc27d34adadc25e1e801e0383e85e3/root"
#docker images :
        --no_trunc  不截断容器ID
        -a  显示所有镜像(包括中间层镜像)
        -q  只显示容器的ID列表
docker rmi 镜像名(镜像ID) 删除镜像
        -f 强制删除镜像
        --no-prune=false 不删除未标签的父镜像
docker rmi $(docker images -q ubuntu)
************************************************************************************************
获取和推送镜像
1.docker search ubunt 查找Docker Hub中的ubuntu的镜像
2.docker search  -s 3 ubuntu   查找3星及以上等级的ubunt镜像
3.docker pull 镜像名 拉取镜像
4.docker push 镜像名 推送镜像,只会提交修改的image部分
************************************************************************************************
构建镜像2种方式:
1.docker commit 容器名    通过容器构建
2.docker build    通过dockerfile构建

docker commit  容器名
        -a,--author
        -m, --message
        -p,--pause=true  

Repository:本地镜像仓库
Registry:远端DockerHub镜像仓库

#docker commit  -a 'zhangleivod' -m 'nginx' web  nginx/commit_test
#docker run -d -p 80 --name nginx_web1 nginx/commit_test nginx -g "daemon off;"  #指定nginx(-g "daemon off;")以前台的方式运行,否则nginx停止掉,容器也停止
#docker ps (docker port 容器名) 查看端口映射关系

创建第一个Dockerfile

#First Dockerfile

FROM ubuntu:14.04
MAINTAINER zhangleivod   zhangleivod@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80


步骤如下:
1.mkdir -p dockerfiel/df_test1
2.cd dockerfile/df_test1
3.vim Dockerfile
        FROM ubuntu:14.04
        MAINTAINER zhangleivod   zhangleivod@163.com
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80
4.docker build -t "nginx/nginx_test1" .
        -t 指定创建之后的docker镜像名,. 指定当前Dockerfile所在的位置
*********************************************************************************************
Dockerfile 指令
指令格式
        注释:使用#号注释
        INSTRUCTION argument 指令名必须要大写

        FROM ubuntu:14.04
        MAINTAINER zhangleivod   zhangleivod@163.com
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80    指定运行该镜像的容器使用的端口,dockerfile中只是告诉容器暴露的端口,但是出于安全的考虑,默认是不启动的,需要使用docker run -p 80 来打开端口

容器运行时运行的指令:
CMD指令  
        CMD ["executable", "pram1", "pram2" ] exec模式
        CMD command pram1 pram2 shell 模式
        CMD ["pram1", "pram2"](作为ENTERPOINT指令的默认参数)

        FROM ubuntu:14.04
        MAINTAINER zhangleivod   zhangleivod@163.com
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80
        CMD ["/usr/sbin/nginx","g","daemon off;"]

        #docker run -p 80 --name ngin/ngin_test3  -d zhangeleivod/df_test3  (因在Dockerfile中指出了cmd,所以docker run 命令中未给出命令: nginx -g "daemon off;" )

ENTERPOINT指令

        ENTERPOINT指令:ENTERPOINT ["executable", "pram1", "pram2" ] exec模式
        ENTERPOINT指令: ENTERPOINT pram1 pram2 shell 模式

注:RUN指令是在创建镜像构建过程中运行的,CMD指令是在容器运行时运行的,如果在容器中运行时(docker run)给出了命令,那么将会覆盖CMD中给出的指令,所以CMD指令是容器运行时的默认指令。
ENTERPINT指令默认不会被docker run中给出的指令所覆盖,但可以使用docker run --enterpoint覆盖。
在docker run 中执行的/bin/bash 也是指令


ADD指令
COPY指令
        共同点:以上的ADD与COPY指令都是将宿主机上的文件复制到容器内中
        区别:ADD包含类似于tar的解压功能,如果单纯复制文件,Docker推荐使用COPY。


VOLUMNE指令
        可以存在一个和多个容器的目录中,可以绕过联合文件系统,可以提供共享数据和数据初始化的功能

WORKDIR指令
        创建默认的容器的默认工作目录

ENV指令
        创建环境变量在构建镜像中和容器运行中都有效
        ENV <key><value>
        ENV <key>=<value> ...

USER指令
        USER ngin  以nginx的用户运行容器
        USER user
        USER user:group
        USER user:gid
        USER uid
        USER uid:gid
        USER uid:group
        未指定运行默认是root用户

ONBUIOLD
        镜像触发器:当一个镜像被其他镜像作为基础镜像时执行
        会在构建过程中插入指令
***************************************************************************************************
Dockerfile构建过程(会删除中间层创建层的ID,但不删除中间层镜像,可以通过运行中间层镜像来调试容器)

1.从基础镜像运行一个容器
2.执行一条指令,对容器做出修改
3.执行类似docker commit的操作,提交一个新的镜像层
4.再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的吓一跳指令,直至所有指令执行完成



构建缓存,构建一次之后,再次构建时直接使用镜像缓存
对于想要更新构建过程中的镜像程序,则不使用镜像缓存,可以使用docker build --no-cache


查看镜像的构建过程
        #docker history image

***************************************************************************************************
docker 容器网络互联

docker0:
        Linux的虚拟网桥(网桥工作在数据链路层,网桥可以理解成一个交换机)
Linux虚拟网桥的特点:
        可以设置IP地址,并且容器默认分配的IP地址都与该IP出于同一个网段
        相当于拥有一个隐藏的虚拟网卡



网桥管理工具: #yum install bridge-utils
                           #brctl show 查看网桥信息
                           [iyunv@zhangleivod ~]# brctl show
                                bridge name        bridge id                STP enabled        interfaces
                                br-0a0659a5f7ff                8000.024284e959c5        no               
                                br-6a2f2b4a6a4f                8000.0242937e41f6        no               
                                docker0                8000.0242dac1b593        no                veth25785ca
                                                                                                                veth2792238
                                                                                                                vethb0c441e
                                docker0(虚拟的网桥)后面有3个接口分别连接着3个容器的虚拟网卡

自定义docker0
        #ifconfig docker0 192.168.200.1 netmask 255.255.255.0
        修改完之后 重新启动docker服务器进程(systemctl restart docker)

        也可以在启动的配置文件中添加 DOCKER_OPS 值  -b=br0,前提是先要创建一个网桥,
        #brctl addbr br0
        #ifconfig br0 192.168.10.0 netmask 255.255.255.0
        #vim /etc/default/docker
         DOCKER_OPS="br0"
        #重启docker守护进程(systemctl restart docker)

***************************************************************************************************
Docker容器的互联

用于测试Docker镜像DockerFile:
        FROM ubuntu:14.04
        RUN apt-get install -y ping
        RUN apt-get update
        RUN apt-get install -y nginx
        RUN apt-get install -y curl
        EXPOSE 80
        CMD /bin/bash


允许所有容器间的互联(在同一台主机下,所有的容器都是通过虚拟网桥来连接的,且都是可以互联的)
        --icc=true 默认
        --link选项         是为了使重启容器后IP地址经常变化带来的不便,可以使用--link选项为其添加别名,之后访问该容器只需要使用别名访问即可
如:docker run -it --name cct3 --link=cct1:webtest zhangleivod/cct
    #ping webtest 即可
    #env 查看环境变量的变化
    #ci /etc/host 查看参数变化

总结:其实--link,冒号后面的参数就是为主机名与IP地址之间做的映射,之后就可以通过访问别名(主机名)可以访问变化IP的容器


拒绝所有容器间的互联:
        --icc=false


允许特定容器间的连接
        启动选项的配置:
                --icc=false --iptables=true
                --link
******************************************************************************************************



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-402888-1-1.html 上篇帖子: centos7安装elasticsearch-5.0.0 下篇帖子: docker 启动失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表