像风一样 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 : .点代表当前路径下的所有文件。
运行结果:
查看是否成功创建镜像并运行
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 .
使用run命令启动该hello-nginx容器:
docker run -p 8080:80 -d hello-nginx:tag
测试访问host:8080端口如下:
可以看到,Nginx成功启动,并输出自定义的index.html。
命令 | 用途 |
---|---|
FROM | base image |
RUN | 执行命令 |
ADD | 添加文件 |
COPY | 拷贝文件 |
CMD | 执行文件 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路径 |
MAINTAINER | 维护者 |
ENV | 设定环境 |
ENTRYPOINT | 容器入口 |
USER | 指定用户 |
VOLUME | mount point |
4. 镜像分层
Dockerfile的每一行都会产生一个新层(新ID),比如:
已经存在image里面的层是只读的,一旦镜像运行为容器之后,就会产生一个新层(RW读写),分层的好处就是多个image可以共享相同的层,减少存储大小。
5. Volume我们知道,Docker容器中的改动是不会被保存的,为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 比如在使用数据库时就可以使用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:
继续查看宿本机目录:
注意:如果是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端口
报错403,因为当前目录啥也没有,没有index.html文件。在当前目录新建该html文件,输入hello,访问网页
第三种方式
使用 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,查看挂载:
我们在/var/mydata目录下新建whatever.txt文件后退出,进入data目录查看,可以看到刚刚新建的txt文件。