跳过正文
  1. 文章/
  2. 云原生/
  3. Docker/
  4. Docker基础/

3、镜像

·2397 字·5 分钟· loading · loading · ·
云原生 Docker Docker基础
GradyYoung
作者
GradyYoung
Docker基础 - 点击查看当前系列文章
§ 3、镜像 「 当前文章 」

镜像
#

是一种轻量级、可执行的独立软件包,它包含运行某个软件多需要的所有内容(环境),我们应把应用程序和配置依赖打包好形成一个可交付的运行环境(代码、运行时库、环境变量、配置文件等),这个打包好的运行环境就是image镜像文件

联合文件系统UnionFS
#

Union文件系统是一个分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到一个虚拟文件系统下。Union文件系统就是Docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

Commit
#

docker commit提交容器副本使之称为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" [containername/id] [imagename]:[tag]

Push
#

阿里云
#

1、进入容器镜像服务、个人实例

image-20220303170630074

2、创建命名空间

image-20220303170740741

3、创建镜像仓库,选择本地仓库

image-20220303170932389

4、然后根据提示登录、推送、拉取镜像即可

#登录
docker login --username=[username] registry.cn-hangzhou.aliyuncs.com
#推送
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yhgh/yhgh:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/yhgh/yhgh:[镜像版本号]
#拉取
docker pull registry.cn-hangzhou.aliyuncs.com/yhgh/yhgh:[镜像版本号]

私有库
#

搭建私有仓库
#

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

1、拉取最新版registry

docker pull registry

2、运行容器

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry --privileged=true --name=registregistry

3、访问http://ip:5000/v2/_catalog,可以查看到当前仓库的镜像

4、将本地的镜像文件改名为符合registry要求的名字和tag

docker tag [localimagename/id] [ip:5000/name:tag]

5、取消docker对http推送镜像的限制,修改/etc/docker/daemon.json,如果不生效需要重启docker

{
	"registry-mirrors":["http:..."],
	"insecure-registries":["ip:5000"]
}

6、推送镜像

docker push ip:5000/name:tag

7、拉取镜像

docker pull ip:5000/name:tag

自定义镜像
#

自定义构建镜像:Dockerfile
#

  • 镜像的来源,一般可以有3种途径:从平台上获取,容器逆向生成镜像,以及DockerFile文件构建镜像
  • 需要注意的是,我们并不是真正"创建"新镜像,而是基于一个已有的基础镜像,如 centos 或 ubuntu 等,构建新镜像而已
  • 在构建Docker镜像时,需要使用一个文件,文件的名固定为:Dockerfile
  • DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需要的指令和参数构成的脚本

Dockerfile四部分
#

  • Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

基础镜像信息
#

#设置基础镜像
FROM centos

维护者信息
#

MAINTAINER 929880282@qq.com

镜像操作指令
#

#复制压缩包到镜像中,并进行解压
ADD ./jdk-8u11-linux-x64.tar.gz /usr/local/java
ADD ./apache-tomcat-8.5.20.tar.gz /usr/local/tomcat
#set environment variable
ENV JAVA_HOME /usr/local/java/jdk1.8.0_11
ENV JRE_HOME $JAVA_HOME/jre  
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib  
ENV PATH $PATH:$JAVA_HOME/bin
#EXPOSE 映射端口
EXPOSE 8080

容器启动时执行指令
#

#ENTRYPOINT:配置容器启动时,需要执行的文件
ENTRYPOINT /usr/local/tomcat/apache-tomcat-8.5.20/bin/startup.sh && tail -F /usr/local/tomcat/apache-tomcat-8.5.20/logs/catalina.out

Dockerfile的详细命令
#

  • FROM : 指定基础镜像,要在哪个镜像建立:FROM centos

  • MAINTAINER:指定维护者信息:MAINTAINER 565599455@qq.com

  • RUN:容器构建的时候在镜像中要执行的Linux命令

  • ADD: 相当于 COPY,但是比 COPY 功能更强大(如果是压缩包,会自动解压,如果是URL会自动下载)

  • **COPY **:复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的

  • ENV:定义环境变量

  • WORKDIR:指定当前工作目录,相当于 cd ,为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录,也是容器默认目录

  • EXPOSE:指定容器要打开的端口

  • VOLUME:挂载目录,创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。格式为VOLUME [“/data”]

  • ENTRYPOINT:指定容器启动后,需要执行的文件,或者需要命令的操作的文件,如果和CMD一起使用,CMD会变成给ENTRYPOINT传参,而不是执行命令,例如

    • ENTRYPOINT ["nginx","-c"]
      CMD ["/etc/nginx/nginx.conf"]
      #相当于执行
      nginx -c /etc/nginx/nginx.conf
      
  • CMD:指定容器启动后,需要运行的命令,一个dockerfile中只会生效最后一个cmd,也会被docker run命令后的command替换

  • USER:指定该镜像使用什么用户,默认为root

执行Dockerfile构建镜像
#

此命令需要在Dockerfile的目录中执行

#注意!!!后面需要有个点 .
docker build -t [name:tag] .
docker build -t [name:tag] --file dockerFilePath .
-t [name:tag] #指定构建的镜像名字和tag
--file或-f #指定dockerfile文件路径

Dockerfile的示例
#

构建centosjava8
#

tar包内部结构

image-20220304205109424

#设置基础镜像
FROM centos
#指定维护者信息
MAINTAINER yhgh 929880282@qq.com
#复制jdk压缩包到镜像中,并进行解压
ADD ./jdk-8u202-linux-x64.tar.gz /usr/local/java
#配置JDK环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre  
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib  
ENV PATH $PATH:$JAVA_HOME/bin

构建Tomcat
#

#设置基础镜像
FROM centos
MAINTAINER 929880282@qq.com
#复制压缩包到镜像中,并进行解压
ADD ./jdk-8u11-linux-x64.tar.gz /usr/local/java
ADD ./apache-tomcat-8.5.20.tar.gz /usr/local/tomcat
#set environment variable
ENV JAVA_HOME /usr/local/java/jdk1.8.0_11
ENV JRE_HOME $JAVA_HOME/jre  
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib  
ENV PATH $PATH:$JAVA_HOME/bin
#EXPOSE 映射端口
EXPOSE 8080
#ENTRYPOINT 配置容器启动时,需要执行的文件
ENTRYPOINT /usr/local/tomcat/apache-tomcat-8.5.20/bin/startup.sh && tail -F /usr/local/tomcat/apache-tomcat-8.5.20/logs/catalina.out

构建Nginx
#

# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER 929880282@qq.com 
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  
#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]

构建自己的Tomcat
#

1、Linux中选择一个目录/root/docker/,将JDK以及Tomcat的压缩包上传至该目录
#

img

2、创建Dockerfile文件
#

img

3、编写Dockerfile内容
#
#设置基础镜像
FROM centos
MAINTAINER 929880282@qq.com
#复制压缩包到镜像中,并进行解压
ADD ./jdk-8u271-linux-x64.tar.gz /usr/local/java
ADD ./apache-tomcat-8.5.61.tar.gz /usr/local/tomcat
#u
ENV JAVA_HOME /usr/local/java/jdk1.8.0_271
ENV JRE_HOME $JAVA_HOME/jre  
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib  
ENV PATH $PATH:$JAVA_HOME/bin
#EXPOSE 映射端口
EXPOSE 8080
#ENTRYPOINT 配置容器启动时,需要执行的文件
ENTRYPOINT /usr/local/tomcat/apache-tomcat-8.5.61/bin/startup.sh && tail -F /usr/local/tomcat/apache-tomcat-8.5.61/logs/catalina.out
4、执行该文件,构建一个Tomcat镜像出来
#
  • Dockerfile在哪个目录下,就在哪个目录执行如下命令:
    • docker build -t ygang/tomcat:latest .
5、运行容器
#
docker run -d -p 8080:8080 --name ygangtomcat ygang/tomcat:latest
6、在浏览器,即可查看效果
#
Docker基础 - 点击查看当前系列文章
§ 3、镜像 「 当前文章 」