docker简单使用(二)

docker简单使用(二)

Dockerfile简介一

Dockerfile

Dockerfile是一个包含一条条指令的文本文件,其中每一条指令都构建一层(每一条指令的内存,就是描述该层应当如何构建)(docker镜像采用联合文件系统)

1
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

Dockerfile使用示例,建立一个空白文件夹,进去文件夹,创建Dockerfile,编辑Dockerfile,编写指令

1
2
3
4
5
mkdir nginxtest

cd nginxtest

vim Dockerfile

Dockerfile内容:

1
2
3
FROM nginx

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

在当前文件夹,构建镜像:

1
2
3
4
5
6
7
8
9
10
[root@localhost nginxtest]# docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 62c261073ecf
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in c20926fff810
Removing intermediate container c20926fff810
---> 6ee9e7b88db2
Successfully built 6ee9e7b88db2
Successfully tagged nginx:v3

注意docker build最后有个.表示镜像构建的上下文(Context)

镜像构建上下文(Context)

说实话,网上全是抄的一模一样的,全部来去《docker practice》,我也说不好自己理解的是对是错。。

首先,我也抄一下,docker其实是C/S架构,在执行docker build的时候,其实是有和server端(Docker引擎,服务端守护进程)进行交互。
Docker运行时,Docker引擎提供一组REST API,docker命令这样的客户端,就是通过这组API与Docker引擎交互,从而完成各种功能。
因此,在进行docker build的时候,看起来像是在本地进行构建,实际上,是先将上下文定义的路径下构建需要的包上传到Docker引擎,在Docker引擎处(服务端)完成构建。之前进行构建示例时候,有一行可以看出,和server进行了交互:

1
Sending build context to Docker daemon  2.048kB

在Dockerfile中经常会需要用到COPY,服务器在执行构建的时候,就需要知道copy的文件的地址,也就是上下文路径,需要注意的是,Docker的镜像构建上下文,即不是docker build执行的路径,也不是Dockerfile当前所在的目录。默认情况下,是建议创建一个空文件夹,然后将构建需要的文件和Dockerfile都放在该文件夹下,这样理所当然的Dockerfile所在路径就是上下文路径。
(说实话,这个上下文,有点晕,不是很理解,我只能理解成是构建需要的文件所在的路径为上下文;也就是为什么要创建一个空文件夹,将构建需要的文件和Dockerfile放进该文件夹的原因)
一定要记住,千万不要把Dockerfile放在根目录,不然会打包整个硬盘

一些Dockerfile指令示例:

1
2
COPY ./package.json /etc/
COPY pachage.json /etc/

上述两句效果是一样的,都是讲上下文下的package.json拷贝到镜像里面的/etc/

1
COPY /usr/local/nginx/nginx.conf /etc/nginx/

上面这条,会无法工作,因为/usr/local/nginx/nginx.conf已经超出了上下文范文,服务端无法获取该文件

1
docker build -f /usr/kyle/dockertest/a/Dockerfile .

当Dockerfile不在构建上下文的根目录下,可以-f指定该文件位置(当前执行docker build在构建上下文下,可以理解为,当前有个空文件夹,里面是构建需要的文件,但是Dockerfile不在当前文件夹下,可以通过-f指定)

.dockerignore

现在上下文中有不想上传到服务端的文件,就需要使用.dockerignore,例如当前文件夹下有:

1
2
3
4
5
6
7
8
9
[root@localhost mynginx]# ls -al
总用量 20
drwxr-xr-x 2 root root 96 6月 11 15:23 .
drwxr-xr-x. 6 root root 147 6月 11 11:07 ..
-rw-r--r-- 1 root root 99 6月 11 15:22 Dockerfile
-rw-r--r-- 1 root root 10 6月 11 15:23 .dockerignore
-rw-r--r-- 1 root root 33 6月 11 15:20 text1.txt
-rw-r--r-- 1 root root 37 6月 11 15:20 text2.txt
-rw-r--r-- 1 root root 19 6月 11 15:22 text3.txt

不想把text3.txt上传到server,其中Dockerfile内容为:

1
2
3
FROM nginx
COPY text* /home/
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

这样,只需要编辑.dockerignore,将text3.txt添加进去,然后构建镜像即可
可以起容器,进去验证:

1
2
3
4
5
6
7
[root@localhost mynginx]# docker run --name web2 -d -p 8070:80 nginx:v4
76527bd2b0f601e4fa844b9ed3afc4f29da65ee1d202fca6ee6c81380591ad0a
[root@localhost mynginx]#
[root@localhost mynginx]# docker exec -it web2 bash
root@76527bd2b0f6:/# cd /home
root@76527bd2b0f6:/home# ls
text1.txt text2.txt

可以看到,已经忽略了text3.txt

tips:删除镜像docker rmi imageid

1
2
3
4
5
6
[root@localhost mynginx]# docker rmi a59be9875db4
Untagged: nginx:v4
Deleted: sha256:a59be9875db4025dcdab5a26c239302eec9bea47427b04eaa02e2111a800d2ec
Deleted: sha256:7cc4283ef786efa1f9e2885533d3c3eb815a273548f5e7bbfda777726173a7b9
Deleted: sha256:9e87263adf6572244788519ce5c9338c3e70b6e62cc6f1092e9b257a487ecb3c
Deleted: sha256:79b76358156ea32a59800f6d4600a8ce79cc3798cd0ddfcad3362a014f96b397
文章目录
  1. Dockerfile
  2. 镜像构建上下文(Context)
    1. .dockerignore
|