Docker commit和dockerfile两种方式创建docker镜像
打开终端机,先透过docker run建立一个ubuntu的容器,如果在您的电脑中没有ubuntu的镜像,它就会从docker hub中下载
命令行:docker run -it ubuntu
容器建立完成后就会进入到里面,ubuntu的bash界面,好了,建立自己的docker镜像是什么意思呢
你见到我们刚才透过docker run ubuntu命令,就可以建立起一个ubuntu的容器,如果我们在这个ubuntu容器的基础上,安装一些软件,例如node.js,以及写好一个会输出helloworld的程序,我们可以再次将这个容器的状态,打包成一个新的镜像。
意味着下次你,或者其他用户,可以直接透过docker run将这个已经安装好的node.js,以及hello world程序的镜像下载回来并且运行成为容器,好了,那我们先在这个容器内安装node.js
命令行:apt update && apt install nodejs -y
安装好之后,打开一个新的终端机,透过docker ps可以看到ubuntu容器正在运行当中,
命令行:docker ps
然后输入docker diff,容器的ID
命令行:docker diff 0c4
文件前面的A代表新增了的文件,C代表更新了的文件,而D代表移除了的文件
刚才我们在容器内执行了apt update 和安装了node.js,这个列表就是反应了对比原来的ubuntu镜像改动了那些文件
然后我们可以透过docker commit,容器的ID,定义镜像的名称,命名方式有一个建议的
首先是自己的名称,例如codingstartup,然后输入斜杠,再输入新镜像的名称,例如叫node_app,可以再加一个冒号,为这个镜像定义一个版本号,例如是0.1,这里不一定是数字,也可以是字串,然后enter,新的镜像就生成了
命令行:docker commit 0c4 codingstartup/node_app:0.1
输入docker image ls查看本地的镜像列表,可以看见一个是ubuntu,而另一个是我们刚刚建立的codingstartup/node_app,版本TAG是0.1,可以看到它的大小事原ubuntu镜像的一倍有多,命令行:docker image ls
好,先将原来的ubuntu容器关闭,输入exit,
命令行:exit
然后将刚才建立的新镜像运行起来,由于镜像就在本地,所以很快就运行了起来
命令行:docker run -it codingstartup/node_app:0.1
输入node -v,确定node.js是已经安装好的
命令行:node -v
那我们就再进一步打包这个镜像,建立一个资料夹,叫做app,
然后在里面建立一个hello-world.js文件,
然后在里面建立一个hello-world.js文件,
文件内容就是很简单的一句console.log(‘Hello World’)
命令行:mkdir /app
命令行:cd app/
命令行:pwd
命令行:echo “console.log(‘Hello World’)” > hello-world.js
命令行:ls
试试执行一下node hello-world.js,成功输出讯息
命令行:node hello-world.js
然后输入exit退出容器,现在容器已经终止运行
命令行:exit
可以在docker ps -a中找到它
命令行:docker ps -a
虽然容器已经停止,但仍然可以执行docker diff,可以看到建立了一个/app的资料夹,以及新增了一个hello-world.js,而这个.bash_history是我们操作容器的时候自动生成的
命令行:docker diff ff4
再透过docker commit,容器ID,以及镜像名称,这次给它一个版本号是0.2
命令行:docker commit ff4 codingstartup/node_app:0.2
执行docker image ls,可以看到0.2版本的镜像都已生成了
命令行:docker image ls
好了,这次我想在执行docker run的时候,直接获取到hello world这句讯息,可以透过docker run codingstartup/node_app:0.2,这次不用加入-it,因为不需要进入容器内,然后在后面加上要执行的指令node /app/hello-world.js,然后执行,可以看到hello world已经成功输出到终端上
命令行:docker run codingstartup/node_app:0.2 node /app/hello-world.js
以上就是手动用docker commit一步步制作镜像的步骤
接着下来介绍一个自动化一点的方式
如果本地没有Development,创建文件夹Development
命令行:mkdir Development
在本机建立一个资料夹,名为node_app
命令行:cd ~/ Development
命令行:mkdir node_app
在里面加入hello-world.js,内容一样是输出Hello World
命令行:cd node_app
命令行:gedit hello-world.js
备注:(如果没有gedit可能会报错,请使用sudo apt-get install gedit命令行安装)
内容输入
console.log(‘Hello World’)
然后再新增一个文件,名为Dockerfile,注意大小写
命令行:ls
命令行:gedit Dockerfile
第一行输入FROM ubuntu,即是以ubuntu镜像为基础
开新一行,输入RUN,即是执行指令的意思,apt update以及安装nodejs
再新开一行,输入WORKDIR定义工作目录为/app
再来一行,输入COPY . .
即是将当前电脑中node_app资料夹中的文件都复制到工作目录,即是/app里面
最后,输入CMD,即是容器9运行起来的时候要执行什么指令
首先会是node,然后文件的路径,/app/hello-world.js
好了,这些就是对于建立新的docker镜像的定义
重复一次,先以ubuntu镜像为基础,然后执行apt update和安装nodejs,之后设置工作目录是/app,然后将所有本机当前目录下的文件复制到容器内的工作目录,即是/app里面,最后,执行node /app/hello-world.js,
内容输入
FROM ubuntu
RUN apt update && apt install nodejs -y
COPY . .
CMD [“node”,”/app/hello-world.js”]
储存一下这个Dockerfile,然后执行指令docker build将它建立成镜像,-t是用来定义镜像的名称和版本号,设定为codingstartup/node_app:0.3,最后输入一点,即是Dockerfile的所在目录,然后执行
docker就会根据Dockerfile的设定去建立新的镜像
命令行:ls
命令行:docker build -t codingstartup/node_app:0.3 .
完成后,执行docker image ls,可以看到0.3版本的镜像已生成
命令行:docker image ls
执行docker run codingstartup/node_app:0.3,可以看到Hello World已成功输出到终端上了
命令行:docker run codingstartup/node_app:0.3
这就是透过Dockerfile建立镜像的方法
日常我们都会用这个方法,因为设定上更加方便快捷
可能你会问,专门建立一个ubuntu镜像就为了安装node.js,有没有更纯粹的方法呢
当然有,我们在docker hub上就可以找到node.js的镜像,
在红框出输入node
还有各种各样的版本
它们基本上是基于alpine这个轻量的Linux系统制作的
打开我们刚才的Dockerfile,将FROM ubuntu 改为FROM node
然后第二句这个安装指令可以删除,储存一下,
命令行:gedit Dockerfile
再执行docker build生成镜像,版本号设定为0.4
命令行:docker build -t codingstartup/node_app:0.4 .
然后再执行docker run测试一下,都能成功输出讯息了
命令行:docker run codingstartup/node_app:0.4
如果我们要指定特定的node.js版本,可以在FROM node后面加上冒号,然后输入版本号就可以(红框处)
命令行:gedit Dockerfile
不过这个版本号要对应docker hub上面所列出的名称的(红框处)
好了,介绍了两种建立docker镜像的方法
命令行:docker ps -a
有了docker,大家有没有觉得编写各个语言的hello world,都更加简单了呢,大家不妨试试
命令行:rm $(docker ps -aq)
以上,就是所要介绍的全部内容