zoukankan      html  css  js  c++  java
  • Docker的简单介绍及使用

    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的使用

    1. 搜索docker中的centos镜像

       # docker search centos
      
    2. 下载centos镜像

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

       docker images:           列出images
       docker images -a :       列出所有的images(包含历史)
       docker images --tree :   显示镜像的所有层(layer)
       docker rmi  <image ID>:  删除一个或多个image
       
       查看docker中的所有Images镜像信息
       # docker images
      
    4. 导出docker中的centos镜像到/opt/下名为centos.tar.gz

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

       # docker load < /opt/centos.tar.gz	
       b51149973e6a: Loading layer 200.2 MB/200.2 MB	
       Loaded image: docker.io/centos:latest200.2 MB
      
    6. 使用镜像创建容器

       # docker run centos /bin/echo hello,world.
       hello,world.
      
       注: 
          run                    启动的命令
          centos                 docker中的镜像名称
          /bin/echo hello,world. 要执行的操作
      
    7. 列出所有的dockers容器

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

       # docker run --name mydocker -t -i centos /bin/bash
       
       注:
          -name     给容器起个名称
          centos    容器的镜像名称
          -t        tty启用一个为终端
          -i        让容器的标准输入保持打开状态
          /bin/bash 执行的命令
      
      
       	启用/bin/bash输出的结果
       	[root@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 ID是一致的
      
    9. 如何进入一个容器

       使用docker ps先找到容器的CONTAINER ID(fa4af6657ccb)
       # docker ps -a
       
       利用docker start CONTAINER ID名称即可启动容器
       # 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 ID实现docker容器在后台持续运行
      vim ns.sh并输入写入如下内容

      添加执行权限

       # chmod +x ns.sh
      

      启动docker容器

       # docker start fa4af6657ccb
      

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

       # ./ns.bash fa4af6657ccb
      
    10. 删除指定docker容器CONTAINER ID

      # docker rm 1e2b79b937a1
      1e2b79b937a1
      
      # docker rm -f fa4af6657ccb
      -f可以删除正在运行的docker容器(不建议这样玩)
      
      如果docker容器只运行一次就删除的,做实验的时候可以这样玩(docker ps -a中并没有保留该容器)
      
      # docker run --rm centos /bin/echo 'wtf...'
      wtf...
      
    11. 删除docker中指定的镜像(IMAGE ID)

      docker rmi 8140d0c64310

      Untagged: docker.io/centos:latest #删除docker镜像中指定的IMAGE ID
      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 ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    b1c52bc516ca        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        0.0.0.0:32768->80/tcp   cranky_shannon
    

    可以使用docker logs CONTAINER ID来查看容器的日志

    # 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目录查看

    [root@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 ID
    # 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 ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    fc335784084c        centos              "/bin/bash"         18 minutes ago      Up 18 minutes                           test1
    	
    进入到test1的docker环境并查看效果
    [root@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容器中执行
    [root@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
    
    未完待续....
  • 相关阅读:
    读写分离
    java并发集合知识点(二)
    jdbc框架有很多,包括spring jdbc
    多线程,势必涉及到共享对象读写问题
    &lt;xliff:g&gt;标签
    租赁市场的上海方(浦东/张江)
    HDU 3488Tour(流的最小费用网络流)
    sql使用存储过程和交易
    状态压缩动态规划 -- 骨牌
    Android-2手机应用程序,短信应用
  • 原文地址:https://www.cnblogs.com/demon89/p/docker.html
Copyright © 2011-2022 走看看