像风一样 Java笔记虾


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极简教程 【进阶】_Java

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

Docker极简教程 【进阶】_Java_02


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极简教程 【进阶】_Java_03

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

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

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

Docker极简教程 【进阶】_Java_04

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


3. Dockerfile命令小结


命令用途
FROMbase image
RUN执行命令
ADD添加文件
COPY拷贝文件
CMD执行文件
EXPOSE暴露端口
WORKDIR指定路径
MAINTAINER维护者
ENV设定环境
ENTRYPOINT容器入口
USER指定用户
VOLUMEmount point

4. 镜像分层

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

Docker极简教程 【进阶】_Java_05

已经存在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极简教程 【进阶】_Java_06

继续查看宿本机目录:

Docker极简教程 【进阶】_Java_07

注意:如果是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极简教程 【进阶】_Java_08

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

Docker极简教程 【进阶】_Java_09


第三种方式

使用 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极简教程 【进阶】_Java_10

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