美文网首页
《Docker---从小白到深度理解(一)初始Docker》

《Docker---从小白到深度理解(一)初始Docker》

作者: Dufresne_gogogo | 来源:发表于2018-12-03 09:27 被阅读0次
    docker_1.png

    Docker--简介

    关于Docker我们来看一下百度百科给出的介绍:

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

    上面提到Dockers是个容器能实现虚拟化,那么我们看一下Docker与虚拟机的区别

    [图片上传失败...(image-e9d569-1543800377211)]

    我们能看出docker容器要比传统的虚拟机要轻,传统的虚拟机需要创建一个guest系统环境,docker不需要他可以依赖本地的系统环境,很轻。Docker的容器本身不需要额外创建虚拟机管理系统,因此你可以启动多套Docker容器,这样就可以充分发挥主机服务器的物理资源,也可以降低因为采购服务器licenses而带来的额外成本。

    Docker核心--镜像和容器

    首先我们来看一下官方给出的解释:

    A container is launched by running an image. An image is an executable package that includes everything needed to run an application--the code, a runtime, libraries, environment variables, and configuration files.

    A container is a runtime instance of an image--what the image becomes in memory when executed (that is, an image with state, or a user process). You can see a list of your running containers with the command, docker ps, just as you would in Linux.

    镜像包含了一系列可运行的代码、架包、环境变量、配置文件等等的可执行的包,而容器的创建需要一个可运行的镜像,容器就是一个运行时镜像的实例。

    我们再来看下这张图:

    [图片上传失败...(image-777eb2-1543800081343)]

    一般认为,没有继承自其他镜像的镜像为Base Image,也就是rootfs,图片中的bootfs和rootfs两个概念,来源于Linux,鉴于笔者对Linux只停留在应用的情况下,对于bootfs与rootfs就不做更深入的解释,下面我们来讲一下docker运行的基本原理。

    1. Docker镜像是由文件系统叠加而成。最低端是一个引导文件系统,即bootfs。当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载,以留出更多的内存供initrd磁盘镜像使用。
    1. Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs可以是一种或多种操作系统。
    1. 在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。
    1. 当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。 当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。如果修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。
    1. 如此强大的技术之一。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器

    也就是说镜像制作好了之后,是只读的不可以更改,当进行运行启动容器是,会在最顶层加载一个读写文件系统,所有的数据都会保存到这个文件系统上面,对底层的镜像是零浸入的,这也就是说我们能够将一个application制作成一个镜像,这个镜像是可复用的,这大大节省了运维成本,针对一些镜像,例如mysql,centos我们直接可以下载镜像,直接运行!!

    Docker 基本语法

    查看docker 镜像

    NAME                                         DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    node                                         Node.js is a JavaScript-based platform for s…   6670                [OK]                
    tomcat                                       Apache Tomcat is an open source implementati…   2191                [OK]                
    java                                         Java is a concurrent, class-based, and objec…   1905                [OK]                
    openjdk                                      OpenJDK is an open-source implementation of …   1395                [OK]                
    ghost                                        Ghost is a free and open source blogging pla…   879                 [OK]                
    anapsix/alpine-java                          Oracle Java 8 (and 7) with GLIBC 2.28 over A…   373                                     [OK]
    jetty                                        Jetty provides a Web server and javax.servle…   281                 [OK]                
    couchdb                                      CouchDB is a database that uses JSON for doc…   246                 [OK] ```
    
    **拉取镜像**
    
    ```root@tuxiaolei:/home/nvshenluoxiaobai# docker pull nginx
    Using default tag: latest
    latest: Pulling from library/nginx
    a5a6f2f73cd8: Pull complete 
    1ba02017c4b2: Pull complete 
    33b176c904de: Pull complete 
    Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
    Status: Downloaded newer image for nginx:latest
    

    查看本地镜像列表

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    redis               latest              5958914cc558        3 days ago          94.9MB
    nginx               latest              568c4670fa80        4 days ago          109MB
    

    查看某个镜像的详细信息

    [
     {
     "Id": "sha256:5958914cc55880091b005658a79645a90fd44ac6a33abef25d6be87658eb9599",
     "RepoTags": [
     "redis:latest"
     ],
     "RepoDigests": [
     "redis@sha256:f57d1597d038a742dfba6acfaf48b10e6383466eea2aef95d1ee76f32633f959"
     ],
     "Parent": "",
     "Comment": "",
     "Created": "2018-11-28T23:30:01.179460123Z",
     "Container": "dfc3616dd94b0f16f74ad3c738baa37168d6f782685c763391dc1fe5e4fa1569",
     "ContainerConfig": {
     "Hostname": "dfc3616dd94b",
     "Domainname": "",
     "User": "",
     "AttachStdin": false,
     "AttachStdout": false,
     "AttachStderr": false,
     "ExposedPorts": {
     "6379/tcp": {}
     },
     "Tty": false,
     "OpenStdin": false,
     "StdinOnce": false,
     "Env": [
     "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
     "GOSU_VERSION=1.10",
     "REDIS_VERSION=5.0.2",
     "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
     "REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
     ],
     "Cmd": [
     "/bin/sh",
     "-c",
     "#(nop) ",
     "CMD [\"redis-server\"]"
     ],
     "ArgsEscaped": true,
     "Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
     "Volumes": {
     "/data": {}
     },
     "WorkingDir": "/data",
     "Entrypoint": [
     "docker-entrypoint.sh"
     ],
     "OnBuild": [],
     "Labels": {}
     },
     "DockerVersion": "17.06.2-ce",
     "Author": "",
     "Config": {
     "Hostname": "",
     "Domainname": "",
     "User": "",
     "AttachStdin": false,
     "AttachStdout": false,
     "AttachStderr": false,
     "ExposedPorts": {
     "6379/tcp": {}
     },
     "Tty": false,
     "OpenStdin": false,
     "StdinOnce": false,
     "Env": [
     "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
     "GOSU_VERSION=1.10",
     "REDIS_VERSION=5.0.2",
     "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
     "REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
     ],
     "Cmd": [
     "redis-server"
     ],
     "ArgsEscaped": true,
     "Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
     "Volumes": {
     "/data": {}
     },
     "WorkingDir": "/data",
     "Entrypoint": [
     "docker-entrypoint.sh"
     ],
     "OnBuild": [],
     "Labels": null
     },
     "Architecture": "amd64",
     "Os": "linux",
     "Size": 94925974,
     "VirtualSize": 94925974,
     "GraphDriver": {
     "Data": {
     "LowerDir": "/var/lib/docker/overlay2/32d07536d351114ebefc53daff1094e9ca6c37d282b04136eb6e1b9a6affdaab/diff:/var/lib/docker/overlay2/d338e933b9e1877932f2ce4e7ff25bbaf8c30a6fb7ab8ade9497f3bd633daafc/diff:/var/lib/docker/overlay2/bf74e4d9e35815d13204572b9592890ad4b86c853d814dff97930253d6695706/diff:/var/lib/docker/overlay2/c32e23b8e5b5d222f9467a10f41fd33ac41916b1c042304012f85b50f9eef9a7/diff:/var/lib/docker/overlay2/54c65094137a50d0c34363abbb4c29a2dd771f12e70761fae95da3fb5f7daef6/diff",
     "MergedDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/merged",
     "UpperDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/diff",
     "WorkDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/work"
     },
     "Name": "overlay2"
     },
     "RootFS": {
     "Type": "layers",
     "Layers": [
     "sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
     "sha256:2c1e04fae1f2111671c8ab19fee9d5d69ee29709487cac889385ff4bdb5f081f",
     "sha256:94bdf74df564a4f3c84f5854c4496f80915a375662f220c74b649878e781a13e",
     "sha256:90d2c5d0209d338573643ca0517731154dcc9c49e50ec9d0857eaddee2d871da",
     "sha256:dc682cc939702aa54f3aa457b12f9c572dbc0271f3f6e9023a45657cb075cd8e",
     "sha256:bb84a87b243fddbd353bedec71dc3fcb4d0b61ff2f8cc8d64730ede22dad09c9"
     ]
     },
     "Metadata": {
     "LastTagTime": "0001-01-01T00:00:00Z"
     }
     }
    ]
    

    启动镜像

    基本命令 docker run + 名字(或者imageID或者containerID)

    root@tuxiaolei:~$ ps -ef | grep nginx
    root     26523 24712  0 17:03 pts/0    00:00:00 docker run nginx
    root     26583 26561  0 17:03 ?        00:00:00 nginx: master process nginx -g daemon off;
    systemd+ 26650 26583  0 17:03 ?        00:00:00 nginx: worker process
    nvshenl+ 26889 26872  0 17:04 pts/1    00:00:00 grep --color=auto nginx
    

    基本命令就讲到这里,其余常用命令在后面的实战中给出,这里附上docker官方文档地址

    Dockerfile

    Dockerfile定义容器内环境中发生的事情。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件那个环境.

    ​
    MAINTAINER love@gmail.com
    ​
    RUN mkdir -p /smart/bin/com.xx.more/smart-gateway
    ​
    WORKDIR /smart/bin/com.xx.more/smart-gateway
    ​
    EXPOSE 9999
    ​
    ADD ./smart-gateway/target/smart-gateway.jar ./
    ​
    CMD java -Djava.security.egd=file:/dev/./urandom -jar smart-gateway.
    

    我们来解读一下

    From---> 表明当前镜像所基于的镜像,我们是个javaweb 项目,项目依赖于java镜像

    MAINTAINER---->维护者信息

    RUN---> 运行是命令

    WORKDIR--->工作目录

    EXPOSE---> 暴露端口,方便镜像 运行时做映射

    ADD---> 将本地目录文件加入镜像

    CMD--->指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

    VOLUME---> 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

    相关文章

      网友评论

          本文标题:《Docker---从小白到深度理解(一)初始Docker》

          本文链接:https://www.haomeiwen.com/subject/wjmecqtx.html