• ​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。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

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

    赞赏码

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

  • 相关阅读:
    SQL第一讲
    CSS3补充内容
    EXCEL数据导入SQL表的方法
    jq第四讲+实例
    jq第三讲
    jq第二讲
    安卓、苹果日历同步
    安卓、苹果手机备忘录同步
    服务器、客户端双认证
    今天我的博客正式开张了!
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452662.html
Copyright © 2020-2023  润新知