文章目录
- 1.编写DockerFile
- 2.构建镜像
- 3.查看编译的镜像
- 4.启动镜像测试
- 5.创建私有仓库
- 5.1查询registry镜像
- 5.2加载镜像
- 5.3运行镜像容器
- 5.4检查容器
- 6.搭建Registry web
- 6.1首先搜索并拉取镜像
- 6.2运行一个registry web容器
- 6.3验证
- 7.推送镜像到私有仓库
- 8.服务器拉取镜像部署
- 8.1 资源限制
1.编写DockerFile
# 该镜像需要依赖的基础镜像
FROM openjdk:11
# 指定维护者的名字
MAINTAINER laker "935009066@qq.com"
# 将本地文件夹挂载到当前容器
# VOLUME ["/tmp"]
# 使用东八区时间环境
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 将指定目录下的jar包复制到docker容器的/目录下
COPY /target/*.jar /app.jar
# CMD ["--server.port=8080"]
# 声明服务运行在8080端口
EXPOSE 8080
# 切换WORKDIR
# WORKDIR /opt/web/
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
2.构建镜像
在构建前,请确保 xxx.jar 文件与DockerFile在同一个目录
# 构建镜像
docker build -f Dockerfile -t laker-java:v1 .
docker build 指令用来编译Dockerfile文件,默认的情况下 docker build 会在当前的上下文目录中查找Dockerfile文件进行编译
-f : 参数可以用来指定Dockerfile文件,如果文件名为Dockerfile,可以不加这一句
-f Dockerfile
-t : 参数用来设置镜像的名字及标签
注意:最后有一个 . ,这个表示当前的构建环境的上下文,Dockerfile中的资源文件都默认成这个上下文的目录中查找,然后拷贝到容器当中去;也可以指定目录。
如果不带上 ”.“,或者指定的上下文目录不对,在编译时则会出现错误。
3.查看编译的镜像
docker image ls 或者 docker images
4.启动镜像测试
docker run -d \
-p 8080:8080 \
--name laker-v1 \
laker-java:v1
- -d 是后台运行
- -p 8080:8080 是端口映射
- –name laker-v1 给容器取 名字
- 最后跟的 laker-java:v1 是我打包好的镜像名称。
5.创建私有仓库
官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。
但是有时候我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件Registry来达成目的。
Registry在github上有两份代码:老代码库和新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。
从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。
官方在Docker hub上提供了registry的镜像,我们可以直接使用该registry镜像来构建一个容器,搭建我们自己的私有仓库服务。
来自:https://www.cnblogs.com/leozhanggg/p/12050322.html
5.1查询registry镜像
docker search registry
5.2加载镜像
选用官方的第一个镜像,也是stars数最多的
docker pull registry
5.3运行镜像容器
docker run -d \
--name registry2 \
--restart=always \
-p 5000:5000 \
-v /laker/registry:/var/lib/registry \
registry
- -d:后台运行
- –name registry2:指定容器名
- –restart=always:设置开机自动启动
- -p 5000:5000:端口映射宿主机,通过宿主机地址访问
- -v /laker/registry:/var/lib/registry:把镜像存储目录挂载到本地,方便管理和持久化,如果不加,重启后镜像都会丢失
- -v /laker/registry/srv-config.yml:/etc/docker/registry/config.yml:把配置文件挂载到本地,方便修改和保存
5.4检查容器
docker ps
docker ps -a 是查询所有状态的容器。
检查仓库镜像信息
curl -XGET http://127.0.0.1:5000/v2/_catalog
也可以在浏览器上测试:
6.搭建Registry web
地址:https://hub.docker.com/r/hyper/docker-registry-web
6.1首先搜索并拉取镜像
docker search docker-registry-web
docker pull hyper/docker-registry-web # 这个镜像用的人较多
registry:
url: http://10.224.77.100:5000/v2
name: localhost:5000
readonly: false
auth:
enabled: false
6.2运行一个registry web容器
docker run -d \
--name registry-web \
--restart=always \
-v /laker/registry-web/web-config.yml:/conf/config.yml:ro \
-p 8000:8080 \
hyper/docker-registry-web
6.3验证
在浏览器访问:http://ip:8000
7.推送镜像到私有仓库
创建好私有仓库之后,就可以使用 docker tag
来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 10.0.0.1:5000
。
# 重新标记镜像
docker tag laker-java:v1 10.0.0.1:5000/laker-java:v1
# 推送镜像
docker push 10.0.0.1:5000/laker-java:v1
前提条件
想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 10.0.0.1:5000
这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
这是因为 Docker 默认不允许非 HTTPS
方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS
访问的私有仓库。
请在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件)
配置非https访问:
{
"registry-mirror": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries": [
"10.0.0.1:5000"
]
}
然后重启Docker
systemctl daemon-reload # 守护进程重启
systemctl restart docker # 重启docker服务
Windows系统在下图所示位置配置,注意要重启哦。
推送截图示例
可以在Registry Web上查看镜像。
8.服务器拉取镜像部署
docker pull 10.0.0.1:5000/laker-java:v1
结果如下图:
8.1 资源限制
- 内存
- cpu
- 磁盘
在生产环境中,建议每个容器都添加相应的资源限制。下面给出一些执行docker run
命令启动容器时可以传递的资源限制参数:
--cpus 限制 CPU 配额
-m, --memory 限制内存配额
--pids-limit 限制容器的 PID 个数
例如我想要启动一个 1 核 2G 的容器,并且限制在容器内最多只能创建 1000 个 PID,启动命令如下:
$ docker run -it --cpus=1 -m=2048m --pids-limit=1000 busybox sh
推荐在生产环境中限制 CPU、内存、PID 等资源,这样即便应用程序有漏洞,也不会导致主机的资源完全耗尽,最大限度降低安全风险。