【docker】基于阿里云docker镜像服务的docker镜像构建、托管保姆级教程(全网最详细教程)
1. 概述
1.1 什么是docker?
docker是一种开源的容器化平台,它允许开发人员将应用程序及其所有依赖项(如库、环境变量、配置文件等)打包成一个容器,从而实现应用程序在不同环境中的快速部署、可移植性和可复制性。docker利用linux内核提供的容器技术,将应用程序和其依赖项隔离在一个容器中,使得应用程序能够在不同的计算机、虚拟机或云平台上进行高效地部署和运行。
1.2 docker能干嘛?
docker的应用场景包括但不限于:
-
应用程序打包和部署:开发人员可以将应用程序以及其所有依赖项打包成一个容器,从而实现一次构建,到处运行的部署方式。
-
微服务架构:docker容器适合部署微服务架构,每个微服务可以打包成一个独立的容器,实现高度的模块化和可扩展性。
-
环境一致性:docker容器提供了一种可靠的环境隔离方式,能够确保应用程序在不同环境中的一致性,从开发到测试再到生产环境的部署都能保持一致。
-
快速开发和测试:开发人员可以在本地环境中快速地启动、停止、删除容器,进行开发和测试,从而提高开发效率。
-
持续集成和持续部署:docker容器可以与持续集成/持续部署工具集成,实现自动化构建、测试和部署流程,加快软件交付速度。
在嵌入式开发领域,docker一般用于快速部署开发环境,保证所有服务器,所有开发人员的开发环境一致性,避免因环境差异带来各种各样的问题。
1.3 从哪里获取docker镜像
1.3.1 docker hub
docker官方镜像平台提供了很多基础镜像,可以访问https://hub.docker.com/来查找。
1.3.2 其它docker镜像服务平台
除了docker hub之外,国内外也有大量的平台提供了镜像搭建和维护服务,比如阿里云的容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances。
1.3.3 线下分发
他人构建好的镜像,可以打包后进行线下分发,他人获取后可以直接导入。
举例子:
可以使用docker save
命令将myubuntu镜像导出为myubuntu.tar
sudo docker save -o myubuntu.tar myubuntu
myubuntu.tar镜像可以自由分发,另外一个人拿到myubuntu.tar后就可以使用docker load
导入到自己的机器上,然后就可以使用该镜像创建并启动容器了。
sudo docker load -i myubuntu.tar
2. ubuntu如何安装docker
要在ubuntu上安装docker,可以按照以下步骤进行:
-
更新apt软件包索引:
sudo apt update
-
安装依赖包,以允许apt软件包在https上使用存储库:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
-
添加docker的官方gpg密钥:
curl -fssl https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
添加docker apt存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
再次更新apt软件包索引:
sudo apt update
-
确保从docker存储库而不是默认存储库中安装:
apt-cache policy docker-ce
-
最后,安装docker:
sudo apt install docker-ce
-
验证docker是否正确安装:
sudo systemctl status docker
通过这些步骤,可以在ubuntu上成功安装docker,并可以开始使用docker引擎了。
3. 如何构建docker镜像
要构建docker镜像,需要编辑一个dockerfile文件,来描述镜像的构建过程。现以更新java版本为例,讲述整个更新过程。
3.1 组装基础dockerfile
新建一个空目录,然后创建一个名为dockerfile的文本文件,将如下内容拷贝进去
from ubuntu:1604
maintainer alex <guoyong.lei@163.com>
workdir /home/admin/workspace
entrypoint ["/bin/bash"]
3.2 按需修改dockerfile
将下载好的java运行环境压缩包拷贝到dockerfile同一目录下。然后我们使用dockerfile的add
命令将本地当前目录下的openjdk11u-jdk_x64_linux_11.0.12_7.tar.gz
解压并拷贝到/opt/
目录下,然后用过env
命令修改path
环境变量,追加新的java执行目录即可。
对应代码如下所示:
from ubuntu:1604
maintainer alex <guoyong.lei@163.com>
add ./openjdk11u-jdk_x64_linux_11.0.12_7.tar.gz /opt/
env path /opt/openjdk-11.0.12_7/bin:$path
workdir /home/admin/workspace
entrypoint ["/bin/bash"]
3.3 编译镜像
dockerfile编写完成后,使用docker build
命令在dockerfile所在的目录中构建镜像:
$ sudo docker build -f dockerfile -t ubuntu1604_update_java .
sending build context to docker daemon 203 mb
step 1 : from ubuntu:1604
---> 961496ae44f2
step 2 : maintainer alex <guoyong.lei@163.com>
---> using cache
---> ae3210afff6e
step 3 : add ./openjdk11u-jdk_x64_linux_11.0.12_7.tar.gz /opt/
---> 7ea4f23aa58e
removing intermediate container 66d7e8d08a31
step 4 : env path /opt/openjdk-11.0.12_7/bin:$path
---> running in 9681ee611e2d
---> 4de8fc80f273
removing intermediate container 9681ee611e2d
step 5 : workdir /home/admin/workspace
---> running in 015127eea321
---> 12d61d78f3fb
removing intermediate container 015127eea321
step 6 : entrypoint /bin/bash
---> running in cd95f1c5a241
---> 586de0560544
removing intermediate container cd95f1c5a241
successfully built 586de0560544
上述命令中,
-f dockerfile
表示使用dockerfile描述文件来构建镜像-t ubuntu1604_update_java
表示为新镜像指定一个名称(在此示例中为ubuntu1604_update_java).
表示dockerfile在当前目录下。
3.4 查看镜像列表和镜像id
镜像编译成功后,就可以通过docker images
命令查看镜像列表了。如下所示,第一个就是我们钢构件成的镜像:
$ sudo docker images
repository tag image id created size
ubuntu1604_update_java latest 586de0560544 7 minutes ago 1.701 gb
dev_x86_backup_20211227 latest 12173815dc73 9 weeks ago 90.53 gb
dev_x86_backup_20211226 latest 14a64e5c857c 9 weeks ago 144.5 gb
ubuntu_1604_build_20211014 latest 961496ae44f2 4 months ago 1.376 gb
ubuntu18.04_sifeng latest 4bb2e57d175c 13 months ago 915.7 mb
ubuntu16.04_x64 latest 6a7a6103b47d 3 years ago 14.87 gb
3.5 验证镜像
镜像编译成功之后,可以用个docker run
命令来验证。如下所示,执行docker run
命令之后,会进入docker环境,之后自行查看改动是否生效即可。确认完成之后,执行exit命令退出docker环境。
$ sudo docker run -it --rm ubuntu1604_update_java:latest
admin@1d7377478901:~/workspace$
admin@1d7377478901:~/workspace$ ls /opt/
openjdk-11.0.12_7
admin@1d7377478901:~/workspace$
admin@c66458d193aa:~/workspace$ type java
java is /opt/openjdk-11.0.12_7/bin/java
admin@1d7377478901:~/workspace$
admin@1d7377478901:~/workspace$ java --version
openjdk 11.0.12 2021-07-20
openjdk runtime environment 18.9 (build 11.0.12+7)
openjdk 64-bit server vm 18.9 (build 11.0.12+7, mixed mode)
admin@1d7377478901:~/workspace$
admin@69bd748cfdc4:~/workspace$ exit
exit
构建镜像的过程中,docker将执行dockerfile中指定的每个步骤,包括基础镜像的拉取、文件的复制、环境变量的设置等。最终,我们会获得一个包含指定应用程序和配置的docker镜像,可以将其推送到docker hub或阿里云等镜像仓库中,也可以在本地使用。
4. 如何使用阿里云docker镜像服务
本章,我们以阿里云的docker镜像服务为例,讲述如何其使用方法,包括平台初始化和镜像创建等操作。
待云端初始化完成并创建镜像之后,我们就可以将上一章中创建的docker镜像上传到阿里云存储下来,以备其它机器拉取使用了。
4.1 创建实例
打开阿里云容器镜像服务制台,新建实例。可按需选择企业版和个人版。下文都以个人版为例进行演示。
4.1.1 创建个人实例
4.1.2 确认风险
按照页面提示,个人版实例不提供sla保障且有数量、安全性等限制,不保障安全和稳定,不建议生产业务中使用,以避免影响线上业务。如有需要可选择企业版实例或者其它方案进行存储分发。
4.1.3 设置密码
该密码在docker login
命令登录阿里云docker服务器时输入,用于docker pull
命令下载私有镜像和docker push
命令上传镜像时鉴权使用,请务必谨记。
4.2 创建命名空间
个人实例创建成功之后,需要先继续创建命名空间,命名空间用来管理镜像仓库,所以必须先创建命名空间,才能创建镜像。
点击左侧的命名空间
,点击创建命名空间
按钮,填入命名空间的名字之后,点击确定
按钮保存即可。
4.3 创建镜像仓库
命名空间创建成功后,就可以创建镜像仓库了。
4.3.1 填写仓库基本信息
点击左侧的镜像仓库
,点击创建镜像仓库
,依次选择命名空间
,填入仓库名称
,选择仓库类型
,填入摘要
之后,点击下一步
按钮。
4.3.2 设置代码源
我们最终是要将本地创建好的镜像上传到该镜像仓库,因此代码源选择本地仓库
即可,最后点击创建镜像仓库
按钮即可。
到此为止,镜像仓库就创建成功了,如下图所示,可以查看到相关信息以及操作指南。
5. docker镜像上传到阿里云
在第三章中,我们已经把docker镜像编译完成并验证ok,也已在阿里云镜像平台创建好了镜像仓库,接下来就可以将本地的镜像上传阿里云docker镜像服务器了。
5.1 镜像打tag
先对本地镜像打tag,标记本地镜像,将其归入某一仓库。
如下所示,我们将586de0560544(ubuntu1604_update_java的image id,docker image命令可以查看到
)这个镜像归入registry.cn-hangzhou.aliyuncs.com/android_product/ubuntu16.04_android仓库。
sudo docker tag 586de0560544 registry.cn-hangzhou.aliyuncs.com/android_product/ubuntu16.04_android:latest
5.2 登录授权
$ docker login --username=<修改为自己的阿里云账号> registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为创建实例时设置的密码。
5.3 推送到服务器
镜像准备就绪,即可使用docker push
命令推送到docker镜像服务器了。
sudo docker push reg.docker.alibaba-inc.com/tmjl_service/ubuntu-1604-build:latest
6. 总结
通过本文的探索,我们更深入地了解了docker技术,并对其在软件开发和部署中的价值有了更清晰的认识。docker的出现为应用程序的开发、部署和管理带来了革命性的变化,相信在未来,它将继续发挥重要作用,推动软件开发和部署的进步。
发表评论