我们可以通过公共仓库拉取镜像使用,但是,有些时候公共仓库的拉取的镜像并不符合我们的要求,尽管已经从繁琐的部署工作中释放出来,但实际开发时,我们可能希望镜像包含整个完整环境,在其他机器上拉取打包完整的镜像,直接运行即可。
docker支持自己构建镜像还支持将自己构建的镜像上传至公共仓库,镜像构建可以通过以下两种方式实现:
- docker commit :从容器构建一个新的镜像
- docker build : 配合Dockerfile文件创建镜像
docker commit 实现镜像的构建
通过基础镜像centos:7,在镜像中安装jdk和tomcat 以后制作一个新的镜像 mycentos
1.获取基础镜像centos:7,并创建容器
docker pull centos:7
docker run -id --name centos7 centos:7
2.拷贝jdk和tomcat包到容器内
3.进入容器配置环境
4.构建镜像
docker commit -a="myname" -m="jdk11 and tomcat9" centos7 mycentos:7
docker commit 构建镜像命令 -a 镜像作者 -m构建镜像提交的信息 centos7容器名 mycentos:7构建的镜像名
5.查看镜像
docker images
6.基于构建的镜像创建容器
docker run -di --name mycentos7 -p 8080:8080 mycentos:7
7.浏览器访问tomcat
Dockerfile构建镜像
常用指令
FROM
构建于来自哪个基础镜像,如果没有选择tag,那么默认值为latest
如果不以任何镜像为基础,写法为FROM scratch ,scratch为一个空镜像
FROM centos:7
LABEL
为镜像指定标签。也可以使用LABEL来指定镜像作者
LABEL maintainer=“fenghahaha”
RUN
构建镜像时运行的shell命令,比如构建镜像时创建目录
RUN mkdir -p /tmp/fenghahaha/nginx
ADD
拷贝文件或目录到镜像中,src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压,可以是一个url,如果把src写成一个url,那么ADD就类似于wget命令,然后自动下载解压。
ADD nginx.tar.gz /tnp/fenghahaha/nginx
COPY
拷贝文件或目录,用法同ADD,只是不支持自动下载与解压。
COPY nginx.tar.gz /tnp/fenghahaha/nginx
EXPOSE
暴露容器运行时的监听端口给外部,可以指定端口是监听TCP还是UDP,如果未指定协议,则默认为TCP
EXPOSE 80 443 8080/tcp
如果使得容器与宿主机的端口有映射关系,必须在启动容器时加上-p参数。
ENV
设置容器环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
CMD
启动容器时执行的shell命令,在Dockerfile中只能有一条CMD指令,如果设置了多条CMD,只有最后一条CMD生效
CMD echo $JAVA_HOME
如果创建容器的时候指定了命令,则CMD命令会被替代。
ENTRYPOINT
启动容器时执行的shell命令,同CMD类似,不会被docker run 命令行指定的参数所覆盖,在Dockerfile中只能有一条ENTRYPOINT命名,如果设置多条,只有最后一条会生效。
WORKDIR
为RUN、CMD、ECTRPOINT以及COPY和ADD设置工作目录(启动容器后进入的目录)
WORKDIR /usr/local
VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器,一般的使用场景为需要持久化存储数据时。
一般不会再Dockerfile中使用,最常见的实在docker run的时候通过-v指定数据卷。
Dockerfile实战
docker build -f Dockerfile -t mycentos:7
-t 构建的镜像位置
#构建镜像来自centos:7基础镜像
FROM centos:7
#通过镜像标签声明作者信息
LABEL maintainer="fenghahaha"
#设置工作目录
WORKDIR /usr/local
#新镜像构建成功后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
#拷贝文件到镜像中并解压
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
#暴露容器运行时的8080端口给外部
EXPOSE 8080
#设置容器内JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
ENV PATH $PATH:$JAVA_HOME/bin
#启动容器时启动tomcat
CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh","run"]
推送镜像到仓库
docker login 登陆账号
docker tag 打标签
docker push mycentos7镜像名
docker logout 退出账号
搭建私有仓库
1.拉取私有仓库镜像
docker pull registry
2.修改配置文件vim /etc/docker/daemon.json
配置文件中间用,号隔开否则服务起不来
"insecure-registries": ["192.168.199.128:5000"]
3.重新加载某个服务的配置文件并重新启动docker
systemctl daemon-reload 重新加载配置文件
systemctl restart docker 重启docker
4.创建私有仓库容器
docker run -id --name registry -p 5000:5000 -v /mydocker/mydata/:/var/lib/registry registry
打开浏览器输入:http://192.168.199.128:5000/v2/_catalog看到{“repositories”:[]}表示私有仓库搭建成功并且为空
5.推送镜像至私有仓库
docker tag nginx:1.8 192.168.199.128:5000/mynginx:1.8 为镜像打标签
192.168.199.128:5000私有仓库服务端地址
docker push 192.168.199.128:5000/mynginx 上传镜像
6.私有仓库认证
1.创建证书存储目录
mkdir -p /mydocker/mydata/docker/registry/certs
2.生成自签名证书命令
3.生成鉴权密码文件
mkdir -p /mydocker/mydata/docker/registry/auth 生成存储密码文件目录
4.创建容器,指定用户名密码
5.登录私有仓库,登陆时加上私有仓库的IP地址和端口号
docker login 192.168.199.128:5000
5.推送镜像到私有仓库