镜像 #
是一种轻量级、可执行的独立软件包,它包含运行某个软件多需要的所有内容(环境),我们应把应用程序和配置依赖打包好形成一个可交付的运行环境(代码、运行时库、环境变量、配置文件等),这个打包好的运行环境就是image镜像文件
联合文件系统UnionFS #
Union文件系统是一个分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到一个虚拟文件系统下。Union文件系统就是Docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
Commit #
docker commit提交容器副本使之称为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" [containername/id] [imagename]:[tag]
Push #
阿里云 #
1、进入容器镜像服务、个人实例
2、创建命名空间
3、创建镜像仓库,选择本地仓库
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包内部结构
#设置基础镜像
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的压缩包上传至该目录
#
2、创建Dockerfile文件 #
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