docker通过模板创建镜像以及容器、仓库和数据管理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

1.既然是通过模板创建镜像,那么首先肯定得先下载一个模板,地址如下:

http://openvz.org/Download/templates/precreated

打开以上网址选择一个模板进行下载,我这里下载的是centos-6-x86-minimal.tar.gz (signature),可以复制下载链接到LInux上下载,也可以直接通过windows下载,下载完之后上传到Linux上就可以了,由于是国外的网站如果没有加速器的话可能会下载得比较慢。

2.我是在windows上下载的,我下载完之后上传到了Linux的用户家目录下,接着就是导入该镜像,命令如下:

[root@server ~]# cat centos-6-x86-minimal.tar.gz|docker import - centos6
sha256:fbd320988956aa1d558e10966acead019d6d8df3f8118027b290d52c97b33e6e
[root@server ~]# 

3.导入完成后可以使用以下命令查看导入的镜像:

[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              fbd320988956        22 seconds ago      512MB
test_centos         latest              0749459e3be3        3 days ago          359MB
centos              latest              ff426288ea90        4 weeks ago         207MB
[root@server ~]# 

将该镜像启动为容器,并进入到容器中,查看内核信息:

[root@server ~]# docker run -itd centos6 bash  # 启动镜像
bd2556ce65b2b43d7901b37f3c02ee5c71334f8f960012fcc89995d59cba32ac 
[root@server ~]# docker exec -it bd2556c bash  # 进入容器
[root@bd2556ce65b2 /]# cat /etc/issue  # 查看系统版本信息
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@bd2556ce65b2 /]# 
[root@bd2556ce65b2 /]# uname -a  # 在容器内查看内核信息
Linux bd2556ce65b2 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@bd2556ce65b2 /]# exit
[root@server ~]# uname -a  # 在宿主机上查看内核信息
Linux server 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@server ~]# 

如上,可以看到两者使用的Linux内核其实是同一个,除了主机名不同之外都是一样的,所以说docker是基于Linux内核的原因就在这。

4.既然能够将文件导入为镜像,那么也就能把现有的镜像,导出为一个文件,命令如下:

[root@server ~]# docker save -o test_centos.tar test_centos

test_centos.tar是导出来的文件名称,test_centos则是镜像名称。

5.我们还可以用该文件恢复本地镜像,可以使用以下两个命令:

[root@server ~]# docker load --input test_centos.tar  或者  docker load < test_centos.tar

6.使用以下命令可以把自己的镜像上传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧:

[root@server ~]# docker push image_name

25.6 容器管理

1.使用以下命令可以创建一个容器,但该容器并没有启动,就好比在VMware里新建了一个虚拟机一样:

[root@server ~]# docker create -it centos6 bash
22a470459fbe15f25377aa3f97bfbaba90b425ecba10c9a8c4e16906bce3bca7
[root@server ~]# 

2.启动该容器:

[root@server ~]# docker start 22a47045
22a47045
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
22a470459fbe        centos6             "bash"              About a minute ago   Up 5 seconds                            romantic_golick
bd2556ce65b2        centos6             "bash"              42 minutes ago       Up 42 minutes                           affectionate_joliot
[root@server ~]# 

启动容器后,可以使用 docker ps 查看到,有start 就有stop以及restart,之前我们使用的docker run 相当于先create再start。

3.当我们使用run时不加-d选项也可以进入一个虚拟终端里面:

[root@server ~]# docker run -it centos bash

我们依然可以里面运行一些命令,使用命令exit或者ctrl + d 也可以退出该bash,但是当退出后这个容器也会进入停止状态,这就是不加-d的效果。

4.docker run -d可以让容器在后台运行,例如:

[root@server ~]# docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

5.--name 选项可以给容器自定义名字,如果不指定该选项则是一个随机字符串:

[root@server ~]# docker run --name centos6_01_ -itd centos6 bash
a0944f7e4682edfbb39577e4b23729d18f649461767a3a372c05b745d301105a
[root@server ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a0944f7e4682        centos6             "bash"              31 seconds ago      Up 30 seconds                           centos6_01_
22a470459fbe        centos6             "bash"              10 minutes ago      Up 8 minutes                            romantic_golick
bd2556ce65b2        centos6             "bash"              About an hour ago   Up About an hour                        affectionate_joliot
[root@server ~]# docker exec -it centos6_01_ bash  # 使用名称也可以进入到容器的终端
[root@a0944f7e4682 /]# 

6.--rm 选项可以让容器退出后直接删除,在这里命令执行完容器就会退出:

[root@server ~]# docker run --rm -it centos bash -c "sleep 30"

7.docker logs 可以获取到容器的运行历史信息,用法如下:

[root@server ~]# docker run -d centos bash -c "echo 123"  # 在容器里运行一条命令
1203ade543e3afcb9bae9f021dc7327018181915236f170acabc9f4be1c1cc34
[root@server ~]# docker logs 1203ade  # 使用docker logs 就可以获取到这个输出信息
123
[root@server ~]# 

8.docker attach 可以进入一个后台运行的容器,命令格式如下:

[root@server ~]# docker exec -it container_id  bash

9.但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法,命令格式如下:

[root@server ~]# docker exec -it container_id  bash

以上命令可以临时打开一个虚拟终端,并且exit后,容器依然运行着,这个命令之前我们已经使用过多次了。

10.删除容器命令:

[root@server ~]# docker rm container_id

container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f,例如:

[root@server ~]# docker rm -f a0944f7e4682
a0944f7e4682
[root@server ~]# 

11.我们可以导出某个容器,然后将该容器迁移到其他机器上,命令格式如下:

[root@server ~]# docker  export  container_id  > filename.tar

12.导入命令如下,其实就是将文件导入为镜像,一开始我们就使用过了:

[root@server ~]# cat filename.tar |docker import - centos_test

25.7 仓库管理

我们pull镜像时都是从docker的公共上pull的,push也是如此。但是企业中不可能都将自己的镜像都放到公共仓库上,所以我们需要建立一个自己的私有仓库。

1.下载registry 镜像,registy是docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库:

[root@server ~]# docker pull registry

2.然后将 registry 镜像启动为容器:

[root@server ~]# docker run -d -p 5000:5000 registry
a79fd8992501e74d53fc06e9ddd29b171ba4015078f50b7c65ee8362f5b4a986
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a79fd8992501        registry            "/entrypoint.sh /etc…"   5 seconds ago       Up 4 seconds        0.0.0.0:5000->5000/tcp   fervent_volhard
22a470459fbe        centos6             "bash"                   41 minutes ago      Up 40 minutes                                romantic_golick
bd2556ce65b2        centos6             "bash"                   About an hour ago   Up About an hour                             affectionate_joliot
[root@server ~]# 

命令说明:将registry镜像启动容器,-p会把容器的端口映射到宿主机上,如果不映射到宿主机上的话,外部是无法直接访问容器的端口的,: 左边为宿主机监听端口,: 右边为容器监听端口,这个端口可以自定义。

3.使用telnet可以访问该端口:

[root@server ~]# telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
[root@server ~]# 

4.使用curl也可以访问该端口:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
[root@server ~]# 

由于我们还没有上传镜像,所以返回的数据是空的。

5.下面我们来把其中一个镜像上传到这个私有仓库:

[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              fbd320988956        2 hours ago         512MB
test_centos         latest              0749459e3be3        3 days ago          359MB
registry            latest              d1fd7d86a825        3 weeks ago         33.3MB
centos              latest              ff426288ea90        4 weeks ago         207MB
[root@server ~]# docker tag centos6 192.168.77.130:5000/centos6  # 标记一下tag,必须要带有私有仓库的ip:port
[root@server ~]# docker push 192.168.77.130:5000/centos6  # 没有成功,提示需要https协议
The push refers to repository [192.168.77.130:5000/centos6]
Get https://192.168.77.130:5000/v2/: http: server gave HTTP response to HTTPS client
[root@server ~]# 

没有使用https的协议下,只能修改docker的配置文件:

[root@server ~]# vim /etc/docker/daemon.json # 增加内容如下
{
  "insecure-registries":["192.168.77.130:5000"]
}
[root@server ~]# systemctl restart docker.service 
[root@server ~]# 注意,docker启动之后记得把容器也一并启动,不然会push失败

修改完成后继续push:

[root@server ~]# docker push 192.168.77.130:5000/centos6
The push refers to repository [192.168.77.130:5000/centos6]
0a2f11f7b1ef: Pushed 
latest: digest: sha256:ec672fbc4e4eb0976c0082c7de09bad65c883890fe3ad21bdafc1f7108d9013d size: 529
[root@server ~]# 

输出结果如上,push成功。

6.使用curl命令可以查看私有仓库里的镜像:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6"]}
[root@server ~]# 

然后我又上传了一个镜像,这时候私有仓库里就有两个镜像了:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos","centos6"]}
[root@server ~]# 

7.如果要拉取镜像则使用以下命令:

[root@server ~]# docker pull 192.168.77.130:5000/centos6

也就是把push换成pull就可以了,所以打标签那一步很关键,如果你ip或端口写错了的话,是无法进行pull的。


25.8 数据管理

容器是由镜像启动的,那容器里面产生的数据存储在了哪里?容器关闭、删除时数据都会被如何处理?容器里面产生的数据都存储在docker的数据目录下,我这里的数据目录路径为:/var/lib/docker/containers/,containers下的目录都以容器ID命名,其中包含这个容器的所有配置文件。 config.json文件中最后几个Volumes属性即为容器数据文件的存储目录。而当容器关闭、删除时,容器的数据都会一并的删除掉。这就意味着数据不具有持久性,如果一些重要的数据也被删除则会带来一定的损失,要解决这个问题就是把容器的数据写入到宿主机的磁盘上,这样不管是容器被停止或删除,数据都不会丢失。

1.挂载本地宿主机的目录到容器里,这将会让这个容器成为一个数据卷容器:

[root@server ~]# docker run -tid -v /data/:/data centos bash
f7774d6447ca550335e225faddc02c0677b095273dd0055e48559834cfda8c0b
[root@server ~]# 

命令说明:-v 用来指定挂载目录,: 前面的/data/为宿主机本地目录,: 后面的/data/为容器里的目录,如果容器里没有data目录,会在容器中自动创建。

然后来测试一下是否能够正常写入到宿主机的磁盘上:

[root@server ~]# docker exec -it f7774d6447 bash
[root@f7774d6447ca /]# ls /data/  # data目录下是没有东西的
[root@f7774d6447ca /]# mkdir /data/test  # 在data目录下创建一个test目录
[root@f7774d6447ca /]# ls /data/
test
[root@f7774d6447ca /]# exit
[root@server ~]# ls /data/  # 在宿主机上看看data下是否也有这个test目录,有的话则代表挂载成功
test
[root@server ~]# 

2.挂载数据卷:

其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为lucid_kilby,这个名字可以使用命令 docker ps 命令看 NAMES 那一列:
docker通过模板创建镜像以及容器、仓库和数据管理

挂载数据卷:

[root@server ~]# docker run -itd --volumes-from lucid_kilby centos6 bash
9aee52df082a8ca7110965e5dc8e7a6eddce4c1f2cb7c76a168c188ddb1ede04
[root@server ~]# 

这样,我们使用centos6镜像创建了新的容器,并且使用了 lucid_kilby 容器的数据卷

我们可以进入这个新容器里查看data目录:

[root@server ~]# docker exec -it 9aee52df bash
[root@9aee52df082a /]# ls /data/
test
[root@9aee52df082a /]#

如上,可以看到,这个新容器的data目录里也有我们之前创建的test目录,这是因为我们创建这个容器时挂载了数据卷,所以现在 lucid_kilby 就是作为一个数据卷容器存在。

3.另一种定义数据卷容器的方式,这种方式不会挂载本地宿主机的目录,而是让多个容器之间相互共享数据:

有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以我们就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

首先建立一个数据卷容器:

[root@9aee52df082a /]# docker run -itd -v /data/ --name testvol centos  bash 

注意:这里的/data/是容器的data目录,并非本地宿主机的data目录。

然后让其他容器挂载该数据卷:

[root@9aee52df082a /]# docker run -itd  --volumes-from testvol test_centos  bash

如果数据卷容器共享的是data目录,而普通容器想要共享的是home目录或其他目录,可以把原本的目录更名,然后软链接data目录即可,例如:

[root@9aee52df082a /]# mv /home/ /home-bak/  # 把原本的目录更名

[root@9aee52df082a /]# ln -s /data/ /home # 然后软链接data目录





本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2069220,如需转载请自行联系原作者

相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
7天前
|
存储 JSON 数据格式
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
102 82
|
8天前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
84 30
|
7天前
|
存储 虚拟化 Docker
|
8天前
|
SQL Linux 数据库
YashanDB Docker镜像制作
本文介绍了使用Docker部署YashanDB数据库的方法及其优势。相比传统部署方式,Docker简化了环境配置,实现一键部署,确保软件在不同环境中一致运行。文章详细讲解了数据库镜像与容器的概念、Dockerfile的构建流程,以及如何通过Dockerfile定制YashanDB镜像。此外,还演示了镜像的发布过程,包括推送至阿里云容器镜像服务(ACR)。最后,探讨了容器启动时的初始化脚本设置和数据文件复用方法,满足客户对数据库自动化初始化和数据持久化的需求。
|
7天前
|
开发工具 虚拟化 git
自学软硬件第755 docker容器虚拟化技术youtube视频下载工具
docker容器虚拟化技术有什么用?怎么使用?TubeTube 项目使用youtube视频下载工具
|
26天前
|
存储 运维 应用服务中间件
Docker Image即Docker镜像
Docker 镜像是 Docker 容器的基础,包含了运行应用程序所需的一切。通过 Dockerfile 可以方便地创建自定义镜像,并且利用 Docker 提供的命令可以轻松管理和使用这些镜像。掌握 Docker 镜像的创建、管理和使用,是进行容器化应用开发和部署的基础技能。希望本文能帮助读者更好地理解 Docker 镜像的概念和操作,提高开发和运维效率。
92 13
|
1月前
|
消息中间件 Kafka 流计算
docker环境安装kafka/Flink/clickhouse镜像
通过上述步骤和示例,您可以系统地了解如何使用Docker Compose安装和配置Kafka、Flink和ClickHouse,并进行基本的验证操作。希望这些内容对您的学习和工作有所帮助。
198 28
|
21天前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
25天前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
114 2
|
1月前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
398 15