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命令小结


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


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

发表评论