zoukankan      html  css  js  c++  java
  • ​Docker 数据卷的管理及自动构建docker镜像

    挂载时创建卷

    挂载卷

    [root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
    079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09

    容器内站点目录: /usr/share/nginx/html

    在宿主机写入数据,查看

    [root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html
    [root@docker01 ~]# curl 10.0.0.100
    http://www.nmtui.com

    设置共享卷,使用同一个卷启动一个新的容器

    [root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest 
    351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
    [root@docker01 ~]# curl 10.0.0.100:8080
    http://www.nmtui.com

    查看卷列表

    [root@docker01 ~]# docker volume ls
    DRIVER              VOLUME NAME

    创建卷后挂载

    创建一个卷

    [root@docker01 ~]# docker volume create 
    f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
    [root@docker01 ~]# docker volume ls 
    DRIVER              VOLUME NAME
    local               f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

    指定卷名

    [root@docker01 ~]# docker volume ls 
    DRIVER              VOLUME NAME
    local               clsn
    local               f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

    查看卷路径

    [root@docker01 ~]# docker volume inspect clsn 
    [
        {
            "CreatedAt": "2018-02-01T00:39:25+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/clsn/_data",
            "Name": "clsn",
            "Options": {},
            "Scope": "local"
        }
    ]

    使用卷创建

    [root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest 
    1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
    # 宿主机测试
    [root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html 
    [root@docker01 ~]# curl 10.0.0.100:9000
    blog.nmtui.com

    设置卷

    [root@docker01 ~]# docker run  -d  -P  --volumes-from 079786c1e297 nginx:latest 
    b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb

    查看使用的端口

    [root@docker01 ~]# netstat -lntup 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1400/sshd           
    tcp        0      0 10.0.0.100:2375         0.0.0.0:*               LISTEN      26218/dockerd       
    tcp6       0      0 :::9000                 :::*                    LISTEN      32015/docker-proxy  
    tcp6       0      0 :::8080                 :::*                    LISTEN      31853/docker-proxy  
    tcp6       0      0 :::80                   :::*                    LISTEN      31752/docker-proxy  
    tcp6       0      0 :::22                   :::*                    LISTEN      1400/sshd           
    tcp6       0      0 :::32769                :::*                    LISTEN      32300/docker-proxy  
    [root@docker01 ~]# curl 10.0.0.100:32769
    http://www.nmtui.com

    手动将容器保存为镜像

    本次是基于docker官方centos 6.8 镜像创建

    官方镜像列表:

    https://hub.docker.com/explore/

    启动一个centos6.8的镜像

    [root@docker01 ~]# docker pull  centos:6.8
    [root@docker01 ~]# docker run -it -p 1022:22 centos:6.8  /bin/bash
    # 在容器种安装sshd服务,并修改系统密码
    [root@582051b2b92b ~]# yum install  openssh-server -y 
    [root@582051b2b92b ~]# echo "root:123456" |chpasswd
    [root@582051b2b92b ~]#  /etc/init.d/sshd start

    启动完成后镜像ssh连接测试

    将容器提交为镜像

    [root@docker01 ~]# docker commit brave_mcclintock  centos6-ssh

    使用新的镜像启动容器

    [root@docker01 ~]# docker run -d  -p 1122:22  centos6-ssh:latest  /usr/sbin/sshd -D 
    5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094

    在容器安装httpd服务

    [root@5b8161fda2a9 /]#  yum install httpd -y

    编写启动脚本脚本

    [root@5b8161fda2a9 /]# cat  init.sh 
    #!/bin/bash 
    /etc/init.d/httpd start 
    /usr/sbin/sshd -D
    [root@5b8161fda2a9 /]# chmod +x init.sh 
    # 注意执行权限

    再次提交为新的镜像

    [root@docker01 ~]# docker commit  5b8161fda2a9 centos6-httpd 
    sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1

    启动镜像,做好端口映射。并在浏览器中测试访问

    [root@docker01 ~]# docker run -d -p 1222:22 -p 80:80  centos6-httpd /init.sh 
    46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c

    Dockerfile自动构建docker镜像

    官方构建dockerffile文件参考

    https://github.com/CentOS/CentOS-Dockerfiles

    Dockerfile指令集

    dockerfile主要组成部分:

    • 基础镜像信息 FROM centos:6.8

    • 制作镜像操作指令RUN yum insatll openssh-server -y

    • 容器启动时执行指令 CMD ["/bin/bash"]

    dockerfile常用指令:

    • FROM 这个镜像的妈妈是谁?(指定基础镜像)

    • MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)

    • RUN 你想让它干啥(在命令前面加上RUN即可)

    • ADD 给它点创业资金(COPY文件,会自动解压)

    • WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)

    • VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)

    • EXPOSE 它要打开的门是啥(指定对外的端口)

    • CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)

    dockerfile其他指令: 

    • COPY 复制文件

    • ENV  环境变量

    • ENTRYPOINT  容器启动后执行的命令

    创建一个Dockerfile

    创建第一个Dockerfile文件

    # 创建目录
    [root@docker01 base]# cd /opt/base
    # 创建Dcokerfile文件,注意大小写
    [root@docker01 base]# vim Dockerfile
    FROM centos:6.8
    RUN yum install openssh-server -y 
    RUN echo "root:123456" |chpasswd
    RUN /etc/init.d/sshd start 
    CMD ["/usr/sbin/sshd","-D"]

    构建docker镜像

    [root@docker01 base]# docker image build  -t centos6.8-ssh . 
    -t 为镜像标签打标签  . 表示当前路径

    使用自构建的镜像启动

    [root@docker01 base]# docker run  -d -p 2022:22 centos6.8-ssh-b 
    dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a

    使用Dcokerfile安装kodexplorer

    Dockerfile文件内容

    FROM centos:6.8
    RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
    # 设置工作目录,之后的操作都在这个目录中
    WORKDIR /var/www/html/
    RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
    RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
    RUN chown -R apache.apache .
    CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

    更多的Dockerfile可以参考官方方法。

    Docker中的镜像分层

    参考文档:

    http://www.maiziedu.com/wiki/cloud/dockerimage/

    Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。

    从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

    Docker 镜像为什么分层

    镜像分层最大的一个好处就是共享资源。

    比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

    如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

    可写的容器层

    当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

    所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

    容器层的细节说明

    镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

    文件操作的

    只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

    这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

    赞赏码

    非学,无以致疑;非问,无以广识

  • 相关阅读:
    HDU4474 Yet Another Multiple Problem BFS搜索
    HDU4473 Exam 数学分析
    2013ACM多校联合(4)
    POJ1273 网络流...
    HDU4472 Count 递推
    POJ1149 PIGS 网络流
    UVA10881 Piotr's Ants 想法题
    javascript js string.Format()收集
    修改 设置 vs.net 网站 调试 设为 起始页
    【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452662.html
Copyright © 2011-2022 走看看