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

[经验分享] Docker的简单介绍及使用

[复制链接]

尚未签到

发表于 2017-12-7 06:50:33 | 显示全部楼层 |阅读模式
  Docker介绍
  Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源.
  Dockert是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等,用于Docker通过操作系统层的虚拟化是实现隔离,所以Docker容器运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率.
  

docker官网:https://www.docker.com/  

  Docker组成
  

Docker Clien  

  
Docker Server
  

  Dockers组件
  

镜像(Image)  

  
容器(Container)
  

  
仓库(Repository)
  

  Docker和OpenStack对比

  Docker的用途
  

  安装Docker
  

# yum install -y docker  

  启动docker容器服务
  

# systemctl start docker.service  

  docker的使用


  •   搜索docker中的centos镜像
      

    # docker search centos
  •   下载centos镜像
      

    # docker pull docker.io/centos
  •   查看镜像
      

    docker images:           列出images  
    docker images -a :       列出所有的images(包含历史)
      
    docker images --tree :   显示镜像的所有层(layer)

      
    docker rmi  <image>  

      
    查看docker中的所有Images镜像信息
      
    # docker images

  •   导出docker中的centos镜像到/opt/下名为centos.tar.gz
      

    # docker save centos > /opt/centos.tar.gz
  •   导入本地的镜像到docker中
      

    # docker load < /opt/centos.tar.gz  
    b51149973e6a: Loading layer 200.2 MB/200.2 MB   
      
    Loaded image: docker.io/centos:latest200.2 MB

  •   使用镜像创建容器
      

    # docker run centos /bin/echo hello,world.  
    hello,world.
      

      
    注:
      run                    启动的命令
      centos                 docker中的镜像名称
      /bin/echo hello,world. 要执行的操作

  •   列出所有的dockers容器
      

    # docker ps -a
  •   自定义创建一个容器
      

    # docker run --name mydocker -t -i centos /bin/bash  

      
    注:
      -name     给容器起个名称
      centos    容器的镜像名称
      -t        tty启用一个为终端
      -i        让容器的标准输入保持打开状态
      /bin/bash 执行的命令
      

      

      启用/bin/bash输出的结果
    [iyunv@fa4af6657ccb /]# ps aux

      USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND   
      root          1  0.0  0.0  11744  1888 ?        Ss   05:10   0:00 /bin/bash
      root         15  0.0  0.0  47440  1672 ?        R+   05:12   0:00 ps aux
      容器的主机名和docker ps -a中的CONTAINER>
  •   如何进入一个容器
      

    使用docker ps先找到容器的CONTAINER>
    # docker ps -a
      


      
    利用docker start CONTAINER>  
    # docker start fa4af6657ccb
      

      
    但是这个时候,只是运行了,如何进入到容器里面呢?使用attach即可
      
    # docker attach fa4af6657ccb
      
    注意:在容器中exit以后,这个进程就结束了,docker是单进程的,如果想要exit以后不结束进程,需要使用nsenter,如果提示找不到命令,请安装yum install -y util-linux   
      

      
    如何查找容器进程的pid?!,可以通过下面命令获取
      
    # docker inspect --format "{{.State.Pid}}" fa4af6657ccb
      
    31809   #进程的PID号
      

      
    利用nsenter进入到容器中(在docker容器中退出,不会受到影响,改容器依旧在运行,并不会真正的退出/bin/bash)
      
    # nsenter -t 31809 -u -i -n -p
      

      
    注:
      -t 是targer pid
      -u 是用户态
      -i 是ipc
      -n 是网络
      -p 是pid
      


      利用bash脚本传递CONTAINER>  
    vim ns.sh并输入写入如下内容
      

      添加执行权限
      

    # chmod +x ns.sh  

      启动docker容器
      

    # docker start fa4af6657ccb  

      运行脚本即可进入指定的docker容器中
      

    # ./ns.bash fa4af6657ccb

  •   删除指定docker容器CONTAINER>  

    # docker rm 1e2b79b937a1  
    1e2b79b937a1
      

      
    # docker rm -f fa4af6657ccb
      
    -f可以删除正在运行的docker容器(不建议这样玩)
      

      
    如果docker容器只运行一次就删除的,做实验的时候可以这样玩(docker ps -a中并没有保留该容器)
      

      
    # docker run --rm centos /bin/echo 'wtf...'
      
    wtf...


  •   删除docker中指定的镜像(IMAGE>  

    # docker rmi 8140d0c64310
      
    Untagged: docker.io/centos:latest    #删除docker镜像中指定的IMAGE>  
    Untagged: docker.io/centos@sha256:bba1de7c9d900a898e3cadbae040dfe8a633c06bc104a0df76ae24483e03c077
      
    Deleted: sha256:8140d0c64310d4e290bf3938757837dbb8f806acba0cb3f6a852558074345348
      
    Deleted: sha256:b51149973e6a6c4fb1091ef34ff70002ee307e971b9982075cf226004a93c9b7

  Docker网络
  下载nginx的Images镜像文件
  

# docker pull nginx  

  运行nginx的容器
  

# docker run -d -P nginx  
# docker run -t -p 10000:80 nginx
  

  
注:
  -P    启用一个随机的端口
  -p    指定一个固定端口映射,使用方法
  


  运行成功以后,docker中的nginx的镜像会32768端口会映射到80端口上,可以使用浏览器访问宿主机的ip:port来查看
  

# docker ps -l
  
CONTAINER>  
b1c52bc516ca        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        0.0.0.0:32768->80/tcp   cranky_shannon
  



  可以使用docker logs CONTAINER>  

# docker logs b1c52bc516ca  

  Docker存储
  创建一个存储卷的容器
  

# docker run -i -t --name volume-test -v /data centos  

  
注:  
  -i -t   进入到新创建的docker容器中
  -v      指定挂在的目录
  centos  Docker中Images基础镜像
  

  列出容器中的所有信息
  

# docker inspect volume-test  

  可以过滤查看一下当前容器的volume挂载的相信信息
  

# docker inspect volume-test | egrep -A10 'Mounts'  "Mounts": [
  {
  "Name": "83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75",
  "Source": "/var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data",
  "Destination": "/data",
  "Driver": "local",
  "Mode": "",
  "RW": true,
  "Propagation": ""
  }
  ],
  

  通过上面查找出来的Source地址(宿主机上的映射存储地址),我们在改目录下创建的文件,都会映射到docker容器中的/data目录下
  

# cd /var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data && touch volumes-test  

  切换回docker容器中的/data目录查看
  

[iyunv@f08eb15c50dd ~]# cd /data && ll  
total 0
  
-rw-r--r--. 1 root root 0 May 21 07:42 volumes-test
  

  另外一种类似于直接挂载的方式使用docker容器的存储
  

# docker run -it -v /opt:/opt:rw centos  

  
注:
  -v     依旧是绑定需要挂在的卷
  /opt   第一个/opt是宿主机的目录
  /opt   第二个/opt是docker容器中的opt目录
  rw     读写的权限
  centos Images镜像文件
  

  
小技巧:例如该目录是nginx的代码存放目录,我们启动了一个docker容器,该容器就是nginx的服务的docker容器,我们只需要修改docker容器中的配置文件即可实现代码修改就可以直接访问啦~
  

  通过docker挂载单个文件到docker容器中的方法
  

创建docker容器  
# docker run -it --name history -v /root/.bash_history:/root/.bash_history centos
  

  
启动docker容器
  
# docker start history
  


  
找到histroy容器的的CONTAINER>  
# docker ps -a | grep 'history' | awk '{print $1}'
  
da58133ebddf
  

  
运行history容器
  
./ns.bash da58133ebddf
  

  新创建的docker容器使用以存在的docker容器的存储
  

# docker run -it --name test1 --volumes-from volume-test centos  

  
注:
  -it             进去到docker容器内部
  --name          新的docker容器的名称
  centos          docker容器的Images镜像
  --volumes-from  从哪个已存在的docker容器(volume-test)
  

  进入到volume-test容器的source目录下并复制/etc/passwd文件,便于在新创建的容器中查看
  

找到Source的地址  
# docker inspect  volume-test | grep -A10 'Mounts'
  

  
复制文件到Source指定的目录下
  
# cp /etc/fstab /var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data
  

  
查看下当前运行的docker容器
  
# docker ps -l

  
CONTAINER>  
fc335784084c        centos              "/bin/bash"         18 minutes ago      Up 18 minutes                           test1
  
进入到test1的docker环境并查看效果
  
[iyunv@fc335784084c ~]# cd /data && ll
  
total 4
  
-rw-r--r--. 1 root root 501 May 21 08:42 fstab
  
-rw-r--r--. 1 root root   0 May 21 07:42 volumes-test
  

  手动自定制docker的Images镜像文件
  

首先需要下载已经存在的centos镜像  
# docker pull centos
  

  
创建一个mynginx的容器
  
# docker run --name mynginx -it centos
  

  
复制mynginx的容器ID
  
# docker ps -a | grep 'mynginx' | awk '{print $1}'  
  
cbd772b294c2
  

  
在mynginx容器中执行
  
[iyunv@cbd772b294c2 ~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
  

  
安装nginx服务
  
# yum install -y nginx
  

  
返回到宿主机的环境中执行创建Image镜像命令
  
# docker commit -m "my nginx" cbd772b294c2 demon/mynginx:v1
  
sha256:928a220be50ccaadf90b7bbd453989d8d8cf859485eb7ebe23bcd7e6b1b95c5d
  

  
注:
  commit -m   提交创建Image镜像
  demon       用户名
  mynginx     是docker镜像Image的名称
  v1          TAG的标签名称
  

  
创建另外一个docker容器的
  
# docker run -it --name nginxv1 demon/mynginx:v1
  

  
编辑nginx配置文件,并加入如下配置
  
# vi /etc/nginx/nginx.conf
  daemon off;
  

  
创建V2可以支持nginx后台运行的Image镜像文件
  
# docker commit -m "my nginx" 4099415603df demon/mynginx:v2
  

  
映射端口
  
# docker run -d -p 82:80 demon/mynginx:v2 nginx
  

  Dockerfile构建
  docker build /opt/ningx/Dockerfile
  

# mkdir -p /opt/dockerfile/nginx && cd /opt/dockerfile/nginx/  
# vim Dockerfile
  

  
以下为Dockerfile的配置文件
  
# This docker file
  
# Version 1
  
# Author: demon
  
# Base image
  
From centos
  

  
#Maintainer
  
MAINTAINER demon demon_guo@126.com
  

  
#Commands
  
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
  
RUN yum install -y nginx
  
#ADD index.html /usr/share/nginx/html/index.html
  
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
  
EXPOSE 80
  
CMD ["nginx"]
  

  
构建通过Dockerfile创建Image镜像
  
# docker build -t demon/mynginx:v3 /opt/dockerfile/nginx
  

  通过Dockerfile在自动安装创建Image镜像文件
  

  创建成功以后的截图
  

  简单介绍下Dockerfile中的参数
  

From        是告知我们要创建的Image镜像是通过哪个基础镜像来的(centos)  
MAINTAINER  维护者信息
  
RUN         需要执行的操作
  
ADD         要添加的内容,COPY文件可以自动解压
  
WORKDIR     类似于cd命令
  
VOLUME      目录的挂载地址
  
EXPOSE      开放的端口号
  
CMD        进程一直会运行下去
  

  使用新创建的image镜像创建容器并做端口映射关系
  

# docker run -d -p 10010:80  demon/mynginx:v3  

  创建容器成功并访问nginx服务
  

  DockerHub
  DockerHub类似于GitHub
  docker registry ---> gitlab
  

下载docker的registry Image镜像  
# docker pull registry
  

  
创建容器
  
# docker run -d -p 5000:5000 registry
  

  
未完待续....
  

运维网声明 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-421527-1-1.html 上篇帖子: Docker网络 下篇帖子: 在Docker中运行web应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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