容器的基本概念
容器技术是目前比较流行的一种服务器中的资源共享方式。目前的容器一般用于把特定应用所需要的运行环境或者特定的系统环境打包。在传统的虚拟化技术中,在计算机的物理架构上层有一层虚拟机监视器,其把物理资源转换为虚拟资源,然后虚拟机再使用这些虚拟资源创建操作系统,应用再运行在这些操作系统上。而实际上,有很多应用都是共用一些底层的系统文件的,传统的虚拟化技术中,需要为每一个应用程序创建一个操作系统,这样实际上是严重浪费了物理资源。而在容器技术中,在主机中安装容器的运行环境,不同容器都包括自己的一些库以及应用程序,但是它们共用宿主机的操作系统,然后不同应用再使用命名空间等手段实现隔离。
容器运行的时候基于容器镜像,实际上其是运行容器所需要的所有文件的集合。其类似于一个应用程序的安装包。容器镜像实际上是按层来进行堆叠的,大部分的容器镜像都是基于其他的镜像的,例如在Ubuntu的基础镜像上构建一个装有Apache的容器镜像。
所有的镜像都是只读的,只有当把镜像运行为一个容器的时候,它才能够可写。这样做的好处之一是,如果我们需要拉取两个镜像,这两个镜像分别包括CentOS,Apache,Redis以及CentOS,Nginx,MySQL,这个时候我们只需要拉取一个CentOS镜像,而不需要把整个镜像重新拉取。这样就能够节省储存空间以及拉取时候的时间或者带宽。
Docker镜像的构建
我们也可以自己构建Docker镜像。构建Docker镜像的方法有两种,其中一种是通过正在运行的容器,把其打包为一个镜像;而另外一种方式则是通过Dockerfile来构建容器镜像。
使用docker commit创建镜像
通过正在运行的容器来构建镜像的方法是使用命令docker commit
。
首先我们拉取一个Nginx镜像
docker images
来查看目前已经下载的镜像docker create
来创建一个停止的容器docker ps -a
查看所有容器(包括停止中的容器),而docker ps
则是查看运行中的容器docker start
来启动容器了在这之后,通过docker commit
就能把运行中的容器制作成一个容器镜像了
然后docker images
也会有一个新的镜像。
使用docker build以及Dockerfile来创建容器镜像
优势:具有可重复性,透明性以及幂等性。
Dockerfile常用指令有几种,包括RUN,FROM等,例如要从CentOS构建一个Tomcat的镜像方法如下:
FROM centos LABEL author=Visu # ADD的作用把压缩包加到镜像中会自动解压缩 ADD apache-tomcat-9.0.59.tar.gz /usr/local ADD OpenJDK8U-jdk_x64_linux_hotspot_8u322b06.tar.gz /usr/local # COPY没有解压功能 COPY a.txt /usr/local ENV mypath /usr/local # 进入时的目录 WORKDIR $mypath # 暴露端口 EXPOSE 8080 ENV JAVA_HOME /usr/local/jdk8u322-b06 # 添加JAVA以及TOMCAT的一些环境变量 ENV CLASSPATH \$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.59 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.59 ENV PATH \$PATH:\$JAVA_HOME/bin:\$CATALINA_HOME/lib:\$CATALINA_HOME/bin # 启动时自动运行Tomcat并且打印日志 CMD /usr/local/apache-tomcat-9.0.59/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.59/logs/catalina.out # 以上文字有格式上的问题,如果使用右上角的复制会出错(和mathjax插件有关),但是我懒得改了,就这样吧(
随后就可以使用docker build来构建镜像了
docker build -t tomcat-test:0.1 ./
随后通过使用docker run tomcat-test:0.1运行容器,然后在另外一个终端中通过docker inspect查看容器的ip,然后再使用curl就能看见Tomcat中的内容了。
其他有关Dockerfile的文件可参考Dockerfile reference | Docker Documentation
其他和Docker相关的命令
docker pull:用于拉取镜像,如docker pull nginx
docker ps:用于查看所有运行中的容器
docker ps -a:用于查看所有的容器(包括已停止的)
docker run:运行一个已经停止的容器
docker stop:停止一个正在运行的容器
docker exec:进入容器(在进入后退出,不会导致容器的停止)
docker attach:进入容器,退出时容器停止
docker export/import:把容器导出到本地/把容器快照文件导入为镜像