制作docker镜像(制作docker镜像文件)
本篇文章给大家谈谈制作docker镜像,以及制作docker镜像文件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、nexus搭建docker镜像仓库
- 2、docker基础镜像包制作
- 3、制作镜像(含centos上docker安装)
- 4、将Linux的系统制作成Docker镜像
- 5、Python项目打包为docker镜像并迁移
- 6、使用新版Golang1.18多段构建制作docker镜像的踩坑经历
nexus搭建docker镜像仓库
1 从docker拉取Nexus3镜像,这里使用的是3.30.0版本
2 创建nexus数据挂载目录
这里会宿主机目录权限问题,简单粗暴解决就是直接给我挂载的目录777权限,哈哈。要么就是在启动容器的时候给容器root权限。
3 运行nexus容器
接着重启docker 重启nexus就可以了。
等待了一段时间发现访问nexus还是没有起起来,通过 docker logs -f nexus3 看了一下日志,发现报错了,原因就是上面挂载了目录,目录的权限用户是root,nexus在容器内部中启动的时候是以nexus用户启动的,逗裤早uid 是200,操作系统root用户的uid是1000,所以必然没有写入权限,启动报错。可以通过启动时添加 --privileged=true 赋予root权限解决这个问题,但是给一个容器赋予一个root权限是有点不安全。网上有些博客通过 chown 200 -R /opt/nexus-data 我没试成功,只能先这么搞了。
PS:这里给了两个山雀端口,8081和8082,8081是nexus的默认端口,8082预留给docker私有仓库使用。
4 创建私有docker仓库
4.1 访问界面并登录
账号是admin,密码记录在挂载目录下的/admin.password文件里面,在登陆一波。
4.2 创建仓库
4.3 安全设置
4.4 测试
因为我们的仓库开放的是http的端口,而docker要纯橡求使用的是https,所以这里还要添加一下信任仓库。
再次登录成功了。
4.5 制作镜像并向私有仓库推送镜像
推送成功后到nexus页面查询我们是否推送成功。
可以看到已经看到了我们用于测试的nginx镜像了。
额外用一张图补充 docker tag 命令的用法
[img]docker基础镜像包制作
通过docker镜像发布服务已经是很多厂商的共识,本文并不阐述docker的优势,而是介绍发布docker镜像时可以优化的部分
每个公司都有一些规范,要求系统运行的环境版本、配置尘尘等,这些既是规范又是每个工程的共性,如果放任工程师各自为战就会导致规范不能落地,还会引来调测复杂度及他人接手的门槛,而通过制作统一的基础镜像来实现规范落地就简单而有效的解决了上面的管理难题。
制作基础镜像只需要下面两个步骤:
如果需要引入汉字库,也可以将派雀禅字库压缩包放到fonts目录中,当然也可以通过多次基础镜像包依赖来扩充你的基础镜像。
其他工程就可以基于你制作的镜像去构建各自项目的岁启镜像了
制作镜像(含centos上docker安装)
------------------------------------预备:安装docker-ce------------------------------------------------------
1、安装依赖
docker依赖于系统的一些必要的工具,可以提前安装。
yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加软件源
yum-config-manager --add-repo
3、安装docker-ce
yum clean all
yum makecache fast
yum -y install docker-ce
4、启动槐迹卖服务
通过systemctl启动服务
systemctl start docker
------------------------------------开始制作镜像------------------------------------------------------
docker pull percona:5.7-centos
然后 创建 Dockerfile:
加上USER root以后,
继续build又报错:
只好重新把docker的deamon配置改了,放在新的磁盘上。这不是重点,这里掠过。
把以下配置放在铅逗docker-compose.yml中:(注意缩进和分隔,冒号后面必须有空格)
然后启动容器:(这句话要在compose文件所在的目录下执行)
直到有一步骤报错: Failed to get D-Bus connection: Operation not permitted
就是在systemctl 或 service 对mysql进行启停的时候,报的.
网上查到的解决方案是要重新用一种方式run:
然后一直报错说找不到州知systemctl,没有systemctl就不能方便得在docker内部启停mysql.百度基本上是如下方案:
1.启动(run)镜像时候 -v /sys/fs/cgroup:/sys/fs/cgroup:ro /usr/sbin/init
2.在dockerfile中添加cmd ["/usr/sbin/init"]
但各种尝试,都报错.最常见的是这个错误:
Failed to mount tmpfs at /run: Operation not permitted
[!!!!!!] Failed to mount API filesystems, freezing.
无数次尝试以后,终于得知在启动的时候,不用-it,改用-d成功.:
用下面的语句重新生成镜像:
将Linux的系统制作成Docker镜像
DockerHub 上有很多的镜像,可以满足大部分的需求。这种如氏中情况我们就可以直接通过 docker pull ** 从DockerHub上获取对应的镜像。
当然还有一些情况,我们需要的镜像DockerHub上不存在,例如:Linux信创的环境,在DockerHub上就很难知道对应的镜像,如果需要这种镜核卜像的话就需要通过运行的系统来制作镜像了。
/proc 、 /sys 、 /run 、 /dev 这几个目录都是系统启动时自动生成的,虽然也属于文件系统一部分,但是他们每次开机都会有变化,所以打包的时候就应该忽略它们
参数说明:
-c或--create 建立新的备份文件
-f备份文件或--file=备份文件 指定备份文件
-p或--same-permissions 用原来的文件权限还原文件
-v或--verbose 显示指令执行过程
z或--gzip或--ungzip 通过gzip指令处理备份文件
--numeric-owner 以渣山用户识别码及群组识别码取代用户名称和群组名称
tar 命令更多参数可参考:
Linux tar 命令
Linux tar.gz、tar、bz2、zip 等解压缩、压缩命令详解
导入docker之前,最好修改下docker的默认存储路径。
具体修改方法可参考: Linux 下修改Docker默认存储路径
tips: 运行导入的镜像的时候必须带command,否则启动报如下错误. 最后的/bin/bash 不能少
提示: 制作的镜像文件太大,会导致启动容器时候失败: Getting the final child's pid from pipe caused "EOF"
参考文章:
[Docker 镜像导出和导入]
Python项目打包为docker镜像并迁移
1.安装docker服务:
centos 下直接yum安装
yum install docker
2.修改docker仓库地址为国内:
略
3.编写Dockerfile, 如下:
4.制作镜像:
docker build -f Dockerfile -t blogapp:1.0 .
ps:
最后一个参数是.号,别忘了加
制作镜像可能是一个漫长的过程。。。
途中有问题会中止,需虚樱要检查问题并橡颤修改Dockerfile,然后重新开始。。。
5.查看制作的镜像:
docker images
6.运行镜像,创建镜差如丛像实例,即运行容器:
docker run -it -p 192.168.5.109:8080:8888 blogapp:1.0
可以看到,项目已经正常开启,浏览器可以正常访问:
7.导出镜像为tar包:
docker image save -o blogapp.tar blogapp:1.0
8.在新机导入tar包为镜像:
docker load blogapp.tar
9.查看新导入的镜像:
10.在新机运行镜像,后台开启容器:
docker run -it -p 192.168.5.110:8080:8888 blogapp:1.0
可以看到后台开启成功,浏览器访问新址:
使用新版Golang1.18多段构建制作docker镜像的踩坑经历
使用多段构建制作docker镜像时,我原先嫌皮的dockerfile如下:
结果构建时报错了,报错如下,看信息是拉取源码中的第三方依赖包glog报错:
go: go.mod file not found in current directory or any parent directory.
'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest '
For more information, see
or run 'go help get' or 'go help install'.
查了相关的错误信息,说是go get已经在golang的1.17版本停用了,必须使用go install。其实这里有个坑,看官方文档如下:
Starting in Go 1.17, installing executables with go get is deprecated. go install may be used instead.
In Go 1.18, go get will no longer build packages; it will only be used to add, update, or remove dependencies in go.mod. Specifically, go get will always act as if the -d flag were enabled.
httpServer.go:12:2: no required module provides package github.com/golang/glog : go.mod file not found in current directory or any parent directory; see 'go help modules'
其肆者手实说的是go get只是不用来build了,他只能在go.mod中做依赖包相关的操作。go install是直接安装package,这里使用go install明显不对。
掌握了了以上信息,就可以针对性的解决了。我之前的dockerfile中可以添加一下裂嫌go.mod的初始化操作,新的file如下:
问题解决,构建镜像成功了。
关于制作docker镜像和制作docker镜像文件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。