Docker极简教程 【进阶】

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Docker极简教程 【进阶】

1. DockerFile创建镜像

创建文件Dockerfile文件,该文件名不可更改


vi Dockerfile

写入文本


FROM alpine:latest
MAINTAINER smilevt
CMD echo "Hello Docker!

保存退出

docker build命令用于使用 Dockerfile 创建镜像,


docker build -t hello_docker .
  • -t : 镜像的名字及标签,通常 name:tag 或者 name
  • path : .点代表当前路径下的所有文件。
  • 运行结果:

    Docker极简教程 【进阶】

    查看是否成功创建镜像并运行

    Docker极简教程 【进阶】

    2. Dockerfile安装Nginx

    再次新建文件夹并新建Dockerfile文件,写入以下内容;

    
    FROM ubuntu
    MAINTAINER anthor
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN apt-get update
    RUN apt-get install -y nginx
    COPY index.html /var/www/html
    ENTRYPOINT ["usr/sbin/nginx", "-g", "daemon off;"]
    EXPOSE 80
    

    简单说一下文本含义:从(FROM)ubuntu容器中运行(RUN)3条命令,第一条是修改archive.ubuntu.com为mirrors.ustc.edu.cn国内镜像,第二、三条是安装nginx,然后复制(COPY)index.html到容器内,提供容器进入点(ENTRYPOINT),使nginx在前台运行,之所以使用数组是为了隔开命令,最后暴露80端口。

    接下来新建index.html文件,执行build命令创建镜像:

    
    docker build -t hello-nginx:tag .
    
    Docker极简教程 【进阶】

    使用run命令启动该hello-nginx容器:

    
    docker run -p 8080:80 -d hello-nginx:tag
    

    测试访问host:8080端口如下:

    Docker极简教程 【进阶】

    可以看到,Nginx成功启动,并输出自定义的index.html。

    3. Dockerfile命令小结

    命令用途|------


    4. 镜像分层

    Dockerfile的每一行都会产生一个新层(新ID),比如:

    Docker极简教程 【进阶】

    已经存在image里面的层是只读的,一旦镜像运行为容器之后,就会产生一个新层(RW读写),分层的好处就是多个image可以共享相同的层,减少存储大小。

    5. Volume

    我们知道,Docker容器中的改动是不会被保存的,为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 比如在使用数据库时就可以使用Volume。

    6. Volume操作

    说白了,Volume只是-v参数而已。容器和宿主机目录挂载的三种方式:

    第一种方式

    运行Nginx容器,-d:后台运行,–name:指定名称nginx,-v /usr/share/nginx/html:运行容器内部用来访问网页的地址,最后的nginx是镜像名。

    
    docker run -d --name nginx -v /usr/share/nginx/html nginx
    

    获取容器/镜像的元数据

    
    docker inspect nginx
    

    可以看到宿主机目录Source和容器内目录Destination:

    Docker极简教程 【进阶】

    继续查看宿本机目录:

    Docker极简教程 【进阶】

    注意:如果是mac,则该路径不是mac上的实际路径,因为mac上运行docker是还有一层虚拟层,这是docker虚拟层中的路径,可以在docker中访问到

    第二种方式

    在启动Nginx容器时使用-v参数挂载本地目录到容器目录

    
    docker run -p 8080:80 --name mynginx -v $PWD:/usr/share/nginx/html -d nginx
    

    这句命令使用PWD环境变量(该变量始终指向当前目录)将当前目录挂载到容器/usr/share/nginx/html目录。

    我们访问主机8080端口

    Docker极简教程 【进阶】

    报错403,因为当前目录啥也没有,没有index.html文件。在当前目录新建该html文件,输入hello,访问网页

    Docker极简教程 【进阶】

    第三种方式

    使用 docker create 创建一个新的容器但不启动它:

    
    docker create -v $PWD/data:/var/mydata --name data_container ubuntu
    
  • 宿主机目录:$PWD/data
  • docker目录:/var/mydata
  • 容器名:data_container
  • 基础镜像:ubuntu
  • 启动 ubuntu 容器镜像(默认ubuntu基础镜像没有服务):

    
    docker run -it --volumes-from data_container ubuntu /bin/bash
    
  • -it: 以交互模式运行容器,并为容器重新分配一个伪输入终端
  • --volumes-from data_container:以另外一个容器挂载
  • 最后在容器内执行/bin/bash命令
  • 进入到容器控制台后输入mount,查看挂载:

    Docker极简教程 【进阶】

    我们在/var/mydata目录下新建whatever.txt文件后退出,进入data目录查看,可以看到刚刚新建的txt文件。

    关注后端技术精选,每天推送优质好文

    Docker极简教程 【进阶】
    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Docker极简教程 【进阶】


     上一篇
    用 Docker Machine 创建 Azure 虚拟主机 用 Docker Machine 创建 Azure 虚拟主机
    作者:sparkdev链接:www.cnblogs.com/sparkdev 链接:www.cnblogs.com/sparkdev 搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各
    2021-04-05
    下一篇 
    在 docker 容器中捕获信号 在 docker 容器中捕获信号
    作者:sparkdev链接:www.cnblogs.com/sparkdev 链接:www.cnblogs.com/sparkdev 我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker ki
    2021-04-05