• Docker(一)


    Docker概述

         Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。

         Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。

    原理:

    建立====》传送====》运行

    image

    架构:

    C/S架构

    组件:

    镜像(Image)

    容器(Container)

    仓库(Repository)

    与VM的区别

    image

    docker与Openstack的对比

    image

    Docker能干嘛

    简单配置、代码流水线管理、开发效率、应用隔离、服务器整合、调试能力、多租户、快速部署

    image

    Docker改变了什么?

    面向产品:产品交付

    面向开发:简化环境配置

    面向测试:多版本测试 

    面向运维:环境一致性

    面向架构:自动化扩容

    Docker的部署安装

    环境准备

    yum install -y docker
    systemctl start docker
    systemctl enable docker

    镜像的查看

    [root@linux-node2 ~]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    docker.io/centos     latest              60e65a8e4030        36 hours ago        196.6 MB
    docker.io/nginx      latest              813e3731b203        9 days ago          133.8 MB
    docker.io/registry   latest              a8706c2bfd21        2 weeks ago         422.8 MB

    镜像仓库             标签                  镜像ID              创建时间            镜像大小    

    镜像的下载、导出和导入

    [root@linux-node2 ~]# docker save centos > /opt/centos.tar.gz
    [root@linux-node2 ~]# docker load < /opt/centos.tar.gz
    [root@linux-node2 ~]# docker pull centos

    这次咱们做实验需要三个镜像: nginx、centos、registry

    镜像的删除

    docker:命令     rmi:参数    后面

    [root@linux-node2 ~]# docker rmi 813e3731b203

    你的第一次(创建容器)

    [root@linux-node2 ~]# docker run centos /bin/echo "hehe"
    hehe

    命令解读:使用centos镜像,run执行命令,使用echo命令输出hehe

    查看容器状态

    可以使用docker ps只能看见存活的容器,docker ps  -a 查看全部的容器

    容器ID     使用的镜像     执行的命令     创建的时间  状态   端口   名称(如果不指定,自动生成)

    [root@linux-node2 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
    daeb4d7f7aab        centos              "/bin/echo hehe"    About a minute ago   Exited (0) About a minute ago                       insane_einstein

    创建容器

    --name:指定容器名称

    -t         :分配一个tty终端

    -i         :容器的标准输保持打开的状态

    [root@linux-node2 ~]# docker run --name mydocker -t -i centos /bin/bash
    [root@94ab7a046f7c /]# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.1  11772  1872 ?        Ss   03:42   0:00 /bin/bash
    root         14  0.0  0.0  35888  1472 ?        R+   03:43   0:00 ps aux

    这种方式创建自动进入容器,开启的容器只执行/bin/bash;

    在容器中查看主机名

    [root@94ab7a046f7c /]# hostname
    94ab7a046f7c
    [root@94ab7a046f7c /]# exit

    启动、停止容器

    [root@linux-node2 ~]# docker stop  ID
    [root@linux-node2 ~]# docker start  ID

    进入容器

    方式一:

    [root@linux-node2 ~]# docker attach 94ab7a046f7c
    [root@94ab7a046f7c /]#

    方式二:

    先获取进程的PID然后在通过pid进入容器

    [root@linux-node2 ~]# docker inspect --format "{{.State.Pid}}" 94ab7a046f7c
    4101
    [root@linux-node2 ~]# nsenter -t 4101 -u -i -p
    
    [root@linux-node2 opt]# nsenter --help
     -t, --target <pid>     target process to get namespaces from
     -m, --mount [=<file>]  enter mount namespace
     -u, --uts   [=<file>]  enter UTS namespace (hostname etc)
     -i, --ipc   [=<file>]  enter System V IPC namespace
     -n, --net   [=<file>]  enter network namespace
     -p, --pid   [=<file>]  enter pid namespace
     -r, --root  [=<dir>]   set the root directory
     -w, --wd    [=<dir>]   set the working directory
     -F, --no-fork          do not fork before exec'ing <program>

    通过脚本实现进入容器

    #/bin/sh
    PID=$(docker inspect --format "{{.State.Pid}}" $1)
    nsenter -t $PID -p -i -u -n

    删除容器

    [root@linux-node2 ~]# docker rm ID/名称
    加-f 强制删除,包括正在运行中的容器

    映射

    image

    随机映射

    端口的映射是系统自动分配的?

    [root@linux-node2 ~]# docker run -d -P nginx
    90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb
    [root@linux-node2 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
    90316d97ee97        nginx               "nginx -g 'daemon off"   25 seconds ago      Up 23 seconds       0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   ecstatic_almeida

    指定映射

    指定端口的映射

    [root@linux-node2 ~]# docker run -d -p 81:80 nginx
    0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc
    [root@linux-node2 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
    0294a8f5b4fc        nginx               "nginx -g 'daemon off"   11 seconds ago      Up 10 seconds       443/tcp, 0.0.0.0:81->80/tcp                     admiring_ramanujan

    查看日志

    [root@linux-node2 ~]# docker log +ID

    数据管理

    image

    数据卷

    默认挂载目录

    创建一个数据卷,名称是volume-test1,挂载到data下默认挂载目录

    [root@linux-node2 ~]# docker run -it --name volume-test1 -v /data centos 
    [root@1768d6414cfc /]# ls -l /data/
    total 0

    打开一个新的窗口

    列出容器的所有信息,查看mounts模块

    [root@linux-node2 ~]# docker inspect 1768d6414cfc 
     "Mounts": [
            {
                "Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167",
                "Source": "/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],

    查找挂载点并进入

    查看挂载的位置
    [root@linux-node2 ~]# ll /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data
    总用量 0
    进入到挂载点
    [root@linux-node2 ~]# cd /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data

    创建一个cgt测试,并重新回到容器中查看

    [root@linux-node2 _data]# mkdir cgt
    
    去容器中查看
    [root@1768d6414cfc /]# ls -l /data/
    total 4
    drwxr-xr-x 2 root root 4096 Jan  4 14:04 cgt

    指定挂载目录

    将/opt挂载到/opt目录下
    [root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt centos

    指定权限

    只需要在挂载后面加上权限即可。

    加读写rw;只读ro

    [root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos

    挂载单个文件

    记录历史记录

    [root@linux-node2 ~]# docker run -it -v ~/.bash_history:/.bash_history centos

    数据卷容器

    让一个容器可以访问另一个容器的数据卷

    启动两个容器

    启动nfs容器,挂在一个卷,使用-d直接在后台执行
    [root@linux-node2 ~]# docker run -d --name nfs -v /data centos 
    209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126
    
    启动test1容器,挂载到nfs的数据卷容器上,
    [root@linux-node2 ~]# docker run -it --name test1 --volumes-from nfs centos
    [root@5e399198d6a8 /]# ls /data/
    查看没内容

    找到nfs容器的挂载点

    (可以使用名称,不仅仅是ID)

    找到nfs容器的ID
    [root@linux-node2 opt]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
    209bc89b365a        centos              "/bin/bash"         2 minutes ago        Exited (0) 2 minutes ago                       nfs
    找到nfs容器的挂载点
    [root@linux-node2 _data]# docker inspect nfs
    [root@linux-node2 opt]# cd /var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data
    [root@linux-node2 _data]# touch cgt

    在test1上查看

    到test1上查看
    [root@5e399198d6a8 /]# ls /data/
    cgt

    点睛:数据卷容器不论停止还是开启,不影响其他容器挂载使用

    如何制作镜像

    方式一:手动构建容器

    1:创建一个容器mynginx,使用centos镜像

    [root@linux-node2 ~]# docker run --name mynginx -it centos
    [root@f9c7dfb6f552 /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    [root@f9c7dfb6f552 /]# yum -y install nginx
    [root@f9c7dfb6f552 /]# exit 
    exit

    2:基于mynginx容器做一个镜像mynginx:v1

    [root@linux-node2 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    f9c7dfb6f552        centos              "/bin/bash"         3 minutes ago       Exited (0) 15 seconds ago                       mynginx
    基于mynginx这个容器做一个镜像
    [root@linux-node2 ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v1
    3f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8
    提交镜像,同时打一个标签叫mynginx:v1,cgt相当于你向github上提交的用户名
    
    查看镜像
    [root@linux-node2 ~]# docker images
    REPOSITORY                           TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    cgt/mynginx                          v1                  3f3adc859b77        About a minute ago   326.4 MB

    3:基于mynginx:v1创建一个容器mynginxv1

    目的是修改nginx不让其在后台运行

    [root@linux-node2 ~]# docker run -it --name nginxv1 cgt/mynginx:v1
    [root@ea64c5855006 /]# vi /etc/nginx/nginx.conf
    daemon off;      # 不再后台运行
    [root@ea64c5855006 /]# exit 
    exit
    
    [root@linux-node2 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    ea64c5855006        cgt/mynginx:v1      "/bin/bash"         2 minutes ago       Exited (0) 42 seconds ago                       nginxv1

    4:基于mynginxv1提交mynginxv2版本

    重新提交V2版本
    [root@linux-node2 ~]# docker commit -m "my nginx" ea64c5855006  cgt/mynginx:v2
    a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67
    查看V2镜像
    [root@linux-node2 ~]# docker images
    REPOSITORY                           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    cgt/mynginx                          v2                  a480cdf9055e        25 seconds ago

    5:基于mynginxv2镜像,创建mynginxv2容器

    启动容器,-d后台运行,-p指定端口 在后面是镜像,最后是命令(因为是yum安装的,可以直接写nginx,如果不是yum,那要写绝对路径)
    [root@linux-node2 ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx
    4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171
    
    [root@linux-node2 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
    4eaf8a19034a        cgt/mynginx:v2      "nginx"             15 seconds ago      Up 14 seconds       0.0.0.0:82->80/tcp   elegant_leakey
    可以在浏览器访问82端口

    方式二:Dockerfile

    1:Dockerfile包含的信息

        基础镜像信息
        维护者信息
        镜像操作指令
        容器启动时执行指令

    2:文件的编写

    [root@linux-node2 ~]# mkdir /opt/dockerfile/nginx/ -p
    [root@linux-node2 ~]# cd /opt/dockerfile/nginx/
    将index.html上传到此处
    [root@linux-node2 nginx]# vim Dockerfile
    # This is docker file
    # version v1
    # Author caoxiaojian
    # Base image(基础镜像)
    FROM centos
    
    # Maintainer(维护者信息)
    MAINTAINER caoxiaojian  1111@qq.com
    
    # Commands(执行命令)
    RUN rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum -y install nginx
    # Add(添加文件)
    ADD index.html /usr/share/nginx/html/index.html    # index.html是自己编写的文件,放在后面的目录中,因为yum安装后Documentroot是在这里
    RUN echo "daemon off;" >>/etc/nginx/nginx.conf
    EXPOSE 80           # 对外的端口
    CMD ['nginx']       # 执行的命令

    image

    3:构建容器,并运行

    建立newnginx容器,-t:标签,执行/opt/dockerfile/nginx/下面的默认的Dockerfile文件
    [root@linux-node2 nginx]# docker build -t cgt/mynginx:v3 /opt/dockerfile/nginx/
    
    [root@linux-node2 nginx]# docker run -d -p 83:80 cgt/mynginx:v3

    基情链接:

    http://itgladiator.github.io/架构/2015/06/06/Docker学习.html

     

  • 相关阅读:
    心态--编程+成长
    【Oracle】容易犯的错误和技巧集合
    【WPF】DataGrid的Row样式设置
    【WPF】给TextBox添上Label
    【Oracle】异常信息的加工处理
    【.Net 】Json和Xml解析
    【Win32 API】利用SendMessage实现winform与wpf之间的消息传递
    【WCF】利用WCF实现上传下载文件服务
    【Oracle】实现Oracle数据库对象的一键升级
    感触
  • 原文地址:https://www.cnblogs.com/caoxiaojian/p/5101753.html
Copyright © 2020-2023  润新知