欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Dockerfile定制镜像

程序员文章站 2022-03-29 21:21:06
...

点击个人博客,查看更多文章https://elonjelinek.github.io/

Dockerfile可以通过一份简单的文件把整个镜像的构建过程概括进去,其他人只需要拿到Dockerfile就可以构建一个一模一样的镜像。整体来看,Dockerfile就是一份自动化的Linux命令集。

接下来模拟编写一个简单的镜像文件

找一个空白目录,建立一个文件夹mynginx,在其中建立一个文本文件,并命名为Dockerfile
这里的文件夹名称和文本文件名称可以随意命名,不过习惯中将文本文件命名为Dockerfile

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

在文本文件中添加如下内容:

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

Dockerfile只有两行内容,涉及到两条指令:

第一条FROM用来指定基础镜像,这里我们指定了nginx为基础镜像,在Dockerfile中,FROM是必备指令,并且必须是第一条指令。
第二条RUN用来执行命令,这里的RUN命令用了shell格式,其就像在命令行中输入的命令一样,echo是一个命令,用于将其后面跟着的h1标签内容显示在浏览器上。

这样,一个最简单的Dockerfile文件就写好了,接下来在Dockerfile文件所在目录执行命令:
docker build -t nginx:v2 .
注意,最后有个符号,英文的点.,这个点用来指定上下文路径。

ElonJelinek:mynginx ElonJelinek$ docker build -t nginx:v2 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> c82521676580
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 094dc254208b
Removing intermediate container 094dc254208b
 ---> 86da96bbb7c1
Successfully built 86da96bbb7c1
Successfully tagged nginx:v2
ElonJelinek:mynginx ElonJelinek$

然后在终端来运行测试这个镜像

ElonJelinek:mynginx ElonJelinek$ docker run nginx:v2 echo "Hello World! "
Hello World!
ElonJelinek:mynginx ElonJelinek$

当使用这种方式启动容器时,这里的echo "Hello World! "会覆盖Dockerfile文件中的内容,所以下面输出了Hello World!,注意终端的echo命令,双引号里面的内容如果以感叹号!结尾,必须在其后面加一个空格,不然会报错。

接下来以另一种方式来运行这个镜像:docker run --name webnginx -d -p 80:80 nginx:v2

ElonJelinek:mynginx ElonJelinek$ docker run --name webnginx -d -p 80:80 nginx:v2
1c93f3c589f827a60a9e10088a8d3f5bcf4ef4aed33613efc94c399286e5416b
ElonJelinek:mynginx ElonJelinek$ 

这里--name表示命名新的容器为webnginx-p是port,端口的意思,表示映射到80端口,-d表示输出容器的ID。
现在在终端输入:http://localhost:80,就会看到输出结果

ElonJelinek:mynginx ElonJelinek$ curl http://localhost:80
<h1>Hello, Docker!</h1>
ElonJelinek:mynginx ElonJelinek$ 

也可以在浏览器直接访问:http://localhost:80,效果如下:
使用Dockerfile定制镜像

终止容器:docker stop webnginx

ElonJelinek:mynginx ElonJelinek$ docker stop webnginx
webnginx
ElonJelinek:mynginx ElonJelinek$ 

删除容器:docker rm webnginx

ElonJelinek:mynginx ElonJelinek$ docker rm webnginx
webnginx
ElonJelinek:mynginx ElonJelinek$ 

删除镜像:docker image rm nginx:v2

ElonJelinek:mynginx ElonJelinek$ docker image rm nginx:v2
Untagged: nginx:v2
Deleted: sha256:86da96bbb7c1aa337b9299b9c67e76f01ef54e3c4bf9b50698a757dd90a331cd
Deleted: sha256:3586d37ba041216cec430d5ded620f3aa5927b37683e4f4996f4eee0d55b6644
ElonJelinek:mynginx ElonJelinek$ 
查看所有镜像和容器

查看镜像:docker image ls -a
查看容器:docker container ls -a

ElonJelinek:~ ElonJelinek$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c82521676580        7 weeks ago         109MB
hello-world         latest              2cb0d9787c4d        2 months ago        1.85kB
ElonJelinek:~ ElonJelinek$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
74ddf8bb271e        nginx               "nginx -g 'daemon of…"   25 hours ago        Exited (0) 2 minutes ago                       webserver
c22c2835c747        hello-world         "/hello"                 3 weeks ago         Exited (0) 5 minutes ago                       competent_shannon
ElonJelinek:~ ElonJelinek$ 

点击个人博客,查看更多文章https://elonjelinek.github.io/