使用阿里云快速构建海外镜像实战案例 Posted 2023-06-10 尹正杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用阿里云快速构建海外镜像实战案例相关的知识,希望对你有一定的参考价值。
一.github创建项目
1.注册账号
https://github.com/signup
2.登录github账号
https://github.com/login
3.创建仓库
如上图所示,我们点击图标按钮添加一个新的仓库。
如下图所示,我们根据提示信息创建仓库即可。
4.添加一个Dockerfile文件
如上图所示,我们添加一个Dockerfile文件。
我们以Google公司开源的cadvisor容器为例,来构建镜像。
https://github.com/google/cadvisor/releases
Dockerfile内容如下:
FROM gcr.io/cadvisor/cadvisor-amd64:v0.47.0
如下图所示,指定基础镜像后,提交镜像即可。
二.登录阿里云创建镜像仓库
1.进入容器镜像服务页面
https://cr.console.aliyun.com/cn-hangzhou/instances
2.创建命名空间
https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces
3.创建镜像仓库
3.1 配置仓库信息
https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
如上图所示,根据提示配置仓库信息即可。
3.2 配置代码源
3.2.1 选择代码源
如上图所示,我们选择代码源从为github地址。但是需要绑定账号哟。
3.2.2 绑定github账号
如上图所示,点击后会弹出如下图所示的对话框,点击后会弹出新的页面,只需要登录github账号关联即可。
3.2.3 绑定成功
如上图所示,我们已经成功绑定了账号哟。
3.2.4 配置代码源
重新创建镜像仓库时,再次查看就能看到咱们的github关联长号了,建议勾选"海外机器构建"并点击"创建镜像仓库"。
3.2.5 添加规则并立即构建
如上图所示,添加构建规则,并立即构建,需要等待构建完成。
3.2.6 构建成功并尝试拉取镜像
如上图所示,海外镜像成功构建啦,接下来我们就可以去从阿里云拉取镜像了哟~
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎加入基础架构自动化运维:598432640,大数据SRE进阶之路:959042252,DevOps进阶之路:526991186
云原生 | 14Dockerfile构建镜像实战
🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师 🏅 ✒️个人主页:小鹏linux 💊个人社区:小鹏linux(个人社区) 欢迎您的加入!
为大家推荐一款刷题神奇 点击链接访问牛客网 https://www.nowcoder.com/exam/oj?page=1&tab=Python%E7%AF%87&topicId=326&fromPut=pc_csdncpt_xiaopeng_python
各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!
牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析
目录
1.使用Dockerfile创建镜像
1.1 创建工作目录
1.2 编写run.sh脚本和authorized_keys文件
1.3 编写Dockerfile
1.4 创建镜像
1.5 测试镜像,运行容器
2. 镜像的多级构建
3. Docker image Build 高级
3.1 镜像 Cache 机制
3.2 Cache 机制的注意事项
3.3 命名方式的 stage
3.4 Google 内部精简镜像
Dockerfile被认为是构建Docker镜像的标准方式。人们常常会疑惑Dockerfile对于配置管理意味着什么。读者也可能会有许多疑问(尤其是在对一些其他配置管理工具有些经验的时候),例如:
🩸如果基础镜像更改会发生什么?
🩸如果更改要安装的包然后重新构建会发生什么?
🩸它会取代Chef/Puppet/Ansible吗?
事实上,Dockerfile很简单:从给定的镜像开始,Dockerfile为Docker指定一系列的shell命令和元指令,从而产出最终所需的镜像。
Dockerfile提供了一个普通、简单和通用的语言来配置Docker镜像。使用 Dockerfile,用户可以使用任何偏好的方式来达到所期望的最终状态。用户可以调用Puppet,可以从其他脚本里复制,甚至可以从一个完整的文件系统复制!
并不推荐使用
docker commit
的方法来构建镜像。相反,推荐使用被称为Dockerfile
的定义文件和
docker build
命令来构建镜像。Dockerfile使用基本的基于DSL(Domain Specific Language))语法的指令来构建一个Docker镜像,我们推荐使用Dockerfile
方法来代替docker commit
,因为通过前者来构建镜像更具备可重复性、透明性以及幂等性。
1.使用Dockerfile创建镜像
1.1 创建工作目录
$ mkdir sshd_ubuntu
$ ls
sshd_ubuntu
在其中,创建Dockerfile和run.sh文件:
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh
$ ls
Dockerfile run.sh
1.2 编写run.sh脚本和authorized_keys文件
#!/bin/bash
/usr/sbin/sshd -D
在宿主主机上生成SSH密钥对,并创建authorized_keys文件:
$ ssh-keygen -t rsa
...
$ cat ~/.ssh/id_rsa.pub >authorized_keys
1.3 编写Dockerfile
下面是Dockerfile的内容及各部分的注释,可以对比上一节中利用docker commit命令创建镜像过程,所进行的操作基本一致:
#设置继承镜像
FROM ubuntu:14.04
#提供一些作者的信息
MAINTAINER docker_user (user@docker.com)
#下面开始运行更新命令
RUN apt-get update
#安装ssh服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
#复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#开放端口
EXPOSE 22
#设置自启动命令
CMD ["/run.sh"]
1.4 创建镜像
在sshd_ubuntu目录下,使用docker build命令来创建镜像。这里需要注意最后还有一个“.”,表示使用当前目录中的Dockerfile:
$ cd sshd_ubuntu
$ docker build -t sshd:Dockerfile .
如果大家使用Dockerfile创建自定义镜像,那么需要注意的是Docker会自动删除中间临时创建的层,还需要注意每一步的操作和编写的 Dockerfile中命令的对应关系。
命令执行完毕后,如果读者可见“Successfully built XXX”字样,则说明镜像创建成功。可以看到,以上命令生成的镜像ID是 570c26a9de68。
在本地查看sshd:Dockerfile镜像已存在:
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
sshd Dockerfile 570c26a9de68 4 minutes ago 246.5 MB
sshd ubuntu 7aef2cd95fd0 12 hours ago 255.2 MB
busybox latest e72ac664f4f0 3 weeks ago 2.433 MB
ubuntu 14.04 ba5877dc9bec 3 months ago 192.7 MB
ubuntu latest ba5877dc9bec 3 months ago 192.7 MB
1.5 测试镜像,运行容器
使用刚才创建的sshd:Dockerfile镜像来运行一个容器。
直接启动镜像,映射容器的22端口到本地的10122端口:
$ docker run -d -p 10122:22 sshd:Dockerfile 890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
890c04ff8d76 sshd:Dockerfile "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:10122->22/tcp high_albattani
$ ssh 192.168.1.200 -p 10122
root@890c04ff8d76:~#
2. 镜像的多级构建
Dockerfile > 镜像(写Dockerfile文件,然后docker build -t 镜像名 Dockerfile文件路径 =镜像)
17.09以后的版本才支持,此版本之后的Ddockerfile文件中可以添加多个FROM,多级,前几级都只是充当基础
编译型语言才能支持多级构建,如:golong语言,java语言等。解释性语言如php,ruby,python等不支持多级构建
即:如何制作镜像时将 镜像做到最小。
yum install -y yum-utils device-mapper-persistent-data lvm2 #先安装最新版docker所需的依赖及工具
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #配置yum源
yum install -y docker-ce #安装软件
mkdir /etc/docker #创建 /etc/docker 目录
cat > /etc/docker/daemon.json <<EOF
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":
"max-size": "100m"
,
"insecure-registries": ["harbor.hongfu.com"],
"registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
EOF
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload && systemctl restart docker #重启docker服务
systemctl enable docker #设为开机自启
写Dockerfile文件,在文件中可以写多个FROM调用镜像,还可以给每个被调用的镜像重命名,方便后续的FROM调用前面的FROM
例如:Dockerfile文件
FROM golang:1.7.3
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/sparkdevo/href-counter/app . #--from=0即调用第一个FROM
CMD ["./app"]
3. Docker image Build 高级
3.1 镜像 Cache 机制
Docker Daemnon 通过 Dockerfile 构建镜像时,当发现即将新构建出的镜像与已有的某镜像重复时,可以选择放弃构建新的镜像, 而是选用已有的镜像作为构建结果,也就是采取本地已经 cache 的镜像作为结果
3.2 Cache 机制的注意事项
ADD 命令与 COPY 命令:Dockerfile 没有发生任何改变,但是命令ADD run.sh / 中 Dockerfile 当前目录下的 run.sh 却发生了 变化,从而将直接导致镜像层文件系统内容的更新,原则上不应该再使用cache。那么,判断 ADD 命令或者 COPY 命令后 紧接 的文件是否发生变化,则成为是否延用cache 的重要依据。Docker 采取的策略是:获取 Dockerfile 下内容(包括文件 的部分 inode 信息),计算出一个唯一的 hash 值,若 hash 值未发生变化,则可以认为文件内容没有发生变化,可以使 用 cache 机制;反之亦然
RUN 命令存在外部依赖:一旦 RUN 命令存在外部依赖,如RUN apt-get update,那么随着时间的推移,基于同一个基础镜像, 一年的 apt-get update 和一年后的 apt-get update, 由于软件源软件的更新,从而导致产生的镜像理论上应该不同。如果继 续使用cache 机制,将存在不满足用户需求的情况。Docker 一开始的设计既考虑了外部依赖的问题,用户可以使用参数 --no-cache 确保获取最新的外部依赖,命令为docker build --no-cache -t="my_new_image" .
树状的镜像关系决定了,一次新镜像的成功构建将导致后续的 cache 机制全部失效:这一点很好理解,一旦产生一个新的镜 像,同时意味着产生一个新的镜像 ID,而当前宿主机环境中肯定不会存在一个镜像,此镜像ID的父镜像 ID 是新产生镜像 的ID。这也是为什么,书写 Dockerfile 时,应该将更多静态的安装、配置命令尽可能地放在 Dockerfile 的较前位置
3.3 命名方式的 stage
命名方式的 stage:
旧版本的 docker 是不支持 multi-stage 的,只有 17.05 以及之后的版本才开始支持
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/sparkdevo/href-counter/app .
CMD ["./app"]
3.4 Google 内部精简镜像
git clone https://github.com/GoogleContainerTools/distroless #访问不到用下方地址代理
hub.fastgit.org/GoogleContainerTools/distroless
👑👑👑结束语👑👑👑
为大家推荐一款刷题神奇 点击链接访问牛客网 https://www.nowcoder.com/exam/oj?page=1&tab=Python%E7%AF%87&topicId=326&fromPut=pc_csdncpt_xiaopeng_python
各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!
牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析
以上是关于使用阿里云快速构建海外镜像实战案例的主要内容,如果未能解决你的问题,请参考以下文章
云原生 | 14Dockerfile构建镜像实战
手动构建自己的docker容器镜像实战
智能化生产应用搭建的实战案例
Docker容器dockerfile镜像实战案例
centos7案例实战——docker仓库Harbor服务安装部署
云原生之Docker实战使用Dockerfile构建docker镜像