五、制作Java镜像
1.下载JDK8
2.复制JDK8到主目录的software文件夹下
3.启动容器
docker run -i -t -v[逸虚凌辰7] /software:/mnt/software centos /bin/bash
此时进入容器中,会在mnt/software中发现我们复制的JDK
解压JDK,安装到/opt目录下
tar -zxf [逸虚凌辰8] /mnt/software/jdk-8u191-linux-x64.tar.gz -C/opt
建立jdk快捷方式
ln -s [逸虚凌辰9] /opt/jdk1.8.0_191 /opt/jdk
ll /opt/jdk
验证jdk版本
/opt/jdk/bin/java -version
4.提交镜像
另外打开一个终端,查看当前容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
583c6bbdf18e centos "/bin/bash" 19 minutes ago Up 19 minutes optimistic_chandrasekhar
docker commit 583c6bbdf18e prim/java
然后查看镜像就会看到我们生成的镜像。
5.验证镜像
docker run --rm[逸虚凌辰10] prim/java /opt/jdk/bin/java -version
六、使用Dokcerfile构建镜像
1. Dockerfile结构
Dockerfile是编写Docker镜像的脚本
设置基础镜像
FROM:centos:latest
FROM指令的固有格式“仓库名:标签名”
设置维护者信息
可以指定镜像由谁创建的,由谁维护的
MAINTAINER “Yang Rui”yangrui@xxx.com
设置需要添加到容器中的文件
ADD jdk-8u91-linux-x64.tar.gz /opt
ADD指令的第一个参数为宿主机的来源地址(可使用相对路径)第二个是容器的目标路径(必须为绝对路径)使用ADD命令,将自动解压来源路径中的压缩包,将解压后的文件复制到目标路径中。一般将Dockerfile文件和需要添加到容器的文件放在同一目录,有助于编写路径来源。
设置镜像制作过程中执行的命令
例如创建链接
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
如果要使用多条命令可以写多条RUN。但是可以将多条命令通过\命令换行符合并成一条,可以减少镜像的体积。原因是镜像每执行一条命令就会形成新的“镜像层”
设置容器启动时所需要执行的命令
我们使用docker run是,可以在命令的最后一段添加一个容器启动时需要执行的命令,在Dockerfile中也有对应的CMD指令。
CMD /opt/jdk/binjava -version
如果我们在docker run命令是指定了需要执行的命令,那么该命令将覆盖Dockerfile中的CMD命令。
Dockerfile中还有一个与CMD指令类似的ENTRYPOINT指令,它不能被覆盖。
CMD指令要么没有,要么只有一条。
2.使用Dockerfile构建镜像
进入到jdk所在的目录,然后构建Dockerfile文件
cd /software
touch [逸虚凌辰11] Dockerfile
vim Dockerfile
添加如下构建文件
FROM centos:latest
MAINTAINER "Yang Rui"
ADD /software/jdk-8u191-linux-x64.tar.gz /opt
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
CMD /opt/jdk/bin/java -version
然后执行构建镜像命令
docker build -t[逸虚凌辰12] yangrui/java .[逸虚凌辰13]
使用tag命令重命名一样的镜像
docker tag e0b70251236c prim/java:1.0
一般情况下,安装完JDK后,我们需要配置JAVA_HOME和Path环境变量才能在命令中使用Java命令。在Dockerfile中我们可以使用Env指令来设置所需的环境变量。
指定JAVA_HOME和PATH
FROM centos:latest
MAINTAINER "Yang Rui"
ADD jdk-8u191-linux-x64.tar.gz /opt
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
ENV JAVA_HOME /opt/jdk
ENV PATH JAVAHOME/bin:JAVA_HOME/bin:PATH
CMD java -version
3.Dockerfile指令汇总
Dockerfile指令
描述
FROM
设置基础镜像
MAINTAINER
设置维护者信息
ADD
设置需要添加到容器中的文件(自动解压)
COPY
设置需要复制到容器中的文件(无法解压)
USER
设置运行RUN指令的用户
ENV
设置环境变量,可在RUN指令中运用这些变量
ENTRYPOINT
设置容器启动时需要运行的命令(无法覆盖)
CMD
设置容器启动时需要执行的命令(可以被覆盖)
WORKDIR
设置进入容器时的工作目录
EXPOSE
设置壳被暴露的端口号(用于端口映射)
VOLUME
设置可被挂在的数据卷(用于目录映射)
ONBUILD
设置在构建时需要自动执行的指令
七、使用DockerRegistry管理镜像
1.使用DockerHub
使用翻墙软件(蓝灯)注册dockerhub,然后登陆创建自己的Repository。
docker login
登陆dockerhub
docker push prim/java
把本地镜像上传至自己的镜像仓库
2.搭建Docker Registry
启动Dockers Registry
如果是使用的阿里云ECS,要提前在安全组开放端口50000
docker run -d[逸虚凌辰14] -p[逸虚凌辰15] 50000:5000 -v[逸虚凌辰16] ~/[逸虚凌辰17] docker-registry:/tmp/registry registry
此时docker ps可以查看registry已经在容器运行了。
然后,浏览器输入http://59.110.142.242:50000/v2/_catalog
如果有json返回则说明仓库搭建成功。
vim /usr/lib/systemd/system/docker.service
增加 ExecStart=/usr/bin/dockerd --insecure-registry 59.110.142.242:50000
然后重启服务,加载仓库配置
systemctl daemon-reload
systemctl restart docker
重命名镜像标签
由于我们创建的镜像默认注册中心是DockerHub,使用Docker push命令推送的目的地址都是DockerHub,我们需要更改镜像的标签。添加59.110.142.242:50000/
docker tag b4401d8b4a2a 59.110.142.242:50000/prim/java
推送镜像到私有仓库
docker push 59.110.142.242:50000/prim/java
私有仓库还可以指定用户名密码,在同一局域网上可以拉取仓库的镜像。
还可以将DockerRegistry与Nginx集成将他们部署到一台稳定的服务器上,通过Nginx反响代理的方式来调用Docker Registry,并将IP绑定到一个内部域名上,比如docker-registry.xxx.com,这样局域网内部的用户可以通过该域名访问DockerRegistry。
八、Tips
1. 调整Docker内存限制
docker stats
使用-m指定内存大小
docker run -d -p 8080:8010 -m 512m 172.0.0.1:5000/demoe.msa/msa-api-hello:1.0.0
[逸虚凌辰1]Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令
$ tee file1 file2
[逸虚凌辰2]表示启动容器后,打开标准收入设备,可使用键盘进行输入。开启了input(输入)功能
[逸虚凌辰3]表示启动容器后,分配一个伪终端TTY,将与服务器建立一个会话。
[逸虚凌辰4]表示将要运行的镜像名称
[逸虚凌辰5]表示运行容器中的bash应用程序,进入到系统中
[逸虚凌辰6]以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等。
[逸虚凌辰7]把宿主的磁盘挂载到容器中,可以理解为目录映射。
[逸虚凌辰8]-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!
[逸虚凌辰9]为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件
[逸虚凌辰10]表示容器退出时可自动删除容器,也就是说在执行完我们的查看版本命令后容器自动退出。
[逸虚凌辰11]如果fileA存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;
如果fileA不存在,touch指令会在当前目录下新建一个空白文件fileA。
touch 命令详解
功能说明:改变文件或目录时间。
语 法:touch [-acfm][-d <日期时间>][-r <参考文件或目录>][-t <日期时间>][--help] [--version][文件或目录...] 或 touch [-acfm][--help][--version][日期时间][文件或目录...]
补充说明:使用touch指令可更改文件或目录的日期时间,包括存取时间和更改时间。
参 数:
-a或--time=atime或--time=access或--time=use 只更改存取时间。
-c或--no-create 不建立任何文件。
-d<时间日期> 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m或--time=mtime或--time=modify 只更改变动时间。
-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同。
-t<日期时间> 使用指定的日期时间,而非现在的时间。
--help 在线帮助。
--version 显示版本信息
[逸虚凌辰12]指定构建镜像的名字
[逸虚凌辰13]表示当前目录
[逸虚凌辰14]表示将在后台启动该容器。
[逸虚凌辰15]表示对容器中暴露的端口进行端口映射,冒号左边为宿主机端口,右边为容器内部需要暴露的端口
[逸虚凌辰16]挂在本地磁盘到容器磁盘
[逸虚凌辰17]表示当前目录