从容器转换为镜像,也就是容器和镜像之间是可以互相转换的。
容器转换镜像命令:
docker commit 容器ID -t 指定标签号
先拿官方centos 6.8镜像 来做演示
#下载一个centos 6.8镜像
[20:58:23 root@docker ~]#docker pull centos:6.8
#删除现在所有的容器
[10:13:20 root@docker ~]#docker rm -f $(docker ps -a -q)
这个centos 相当于是官方的打的镜像,这个官方centos镜像相当于底层的基础镜像。基础镜像里主要是集合了一些我们的工具以及lib 库、我们都知道在镜像里面我们需要安装一些环境,然后在环境上面部署一些应用程序,最后在将其打包。那作为最基础的宿主机内核我们去共享给容器们,但是在内核上面还有一些不同的 lib 库以及周边的工具,那这些不同的 lib 库和周边的工具我们叫他为基础镜像。基础镜像可以自己通过本身的操作系统打包得到,但是问题来了这时候我们打包到里面的镜像有很多不必要的工具,这就会造成这个基础镜像过于庞大,也就意味着最后通过docker file 制作出来的镜像也会过于庞大,所以红帽官方、docker官方、ubuntu官方都给我们提供了不同版本的基础镜像 我们就可以通过上面的方式得到,他是一个最精简的操作系统.
运行centos 6.8镜像
#通过查看镜像有一个centos 6.8的镜像
[10:14:53 root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.8 82f3b5f3c58f 16 months ago 195 MB
#运行centos 6.8镜像
[10:14:54 root@docker ~]#docker run --name test centos:6.8
--name test:起名为test测试
#在通过查看镜像就会发现Exited退出状态
[10:16:10 root@docker ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01d438ffc25a centos:6.8 "/bin/bash" 26 seconds ago Exited (0) 26 seconds ago test
原因在上图中会发现COMMAND代表这个容器在启动的时候执行的命令,这里执行的命令是/bin/bash,结果/bin/bash并没有对应的能够得到一个前台守护终端的作用,所以这个容器就会退出,因为他现在没有前台工作的进程。这点我们先往下看,因为现在还没有讲到dockerfiel,所以我们现在没办法让它能够启动一个位于前台工作的进程。所以这个镜像我们现在用不了,这时候我们就可以通过下载一些封装好的前台守护进程基础镜像。我们可以通过网易蜂巢下载。
网易蜂巢登录地址(网易云做的一个镜像仓库): https://id.163yun.com/login?h=fc&referrer=https%3A%2F%2Fc.163.com%2Flogin%2Fcallback%3Fredirect%3D
通过网易云镜像下载centos 镜像
登录进来之后点产品与服务–> 镜像仓库
点击镜像中心
搜索centos
会发现有两个版本
library:是网易云做的一个较为精简的镜像仓库。
public:是集合了一些工具的镜像仓库。
所以在生产环境中建议使用public版本,因为library和我们刚才下载的官方centos一样,他没有工作在前台的守护进程所以已启动就会退出,而public版本给我们封装了一个supervisord.conf,并且supervisord.conf是工作在前台的一个进程,所以我们一启动该容器就能够正常工作了。
点击public版本
复制网易云镜像下载地址
然后在我们的服务器上下载网易云centos:6.7镜像
[11:45:16 root@docker ~]#docker pull hub.c.163.com/public/centos:6.7-tools
通过docker images查看到已经下载好的镜像
[11:45:51 root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hub.c.163.com/public/centos 6.7-tools b2ab0ed558bb 3 years ago 602 MB
下载完了镜像之后会发现他的镜像名称很长、因为镜像会有对应的命名方式
6.7-tools:版本号
centos:镜像名
public:表示仓库名称
hub.c.163.com:代表从哪个仓库地址下载
所以将他们加在一起会得到这么一个属性。
在从网易云下载的centos镜像中运行一个mysql
[11:47:27 root@docker ~]# docker run --name mysql -d hub.c.163.com/public/centos:6.7-tools
docker run: #运行docker容器
--name mysql: #名称为mysql
-d: #放到后台运行
hub.c.163.com/public/centos:6.7-tools #使用的镜像以及版本号
通过docker ps -a查看
#通过查看会发现这里有一个mysql容器,并且状态是up状态(运行)
[11:55:14 root@docker ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
478c071138f4 hub.c.163.com/public/centos:6.7-tools "/usr/bin/supervisord" 2 minutes ago Up 2 minutes 22/tcp
接下来我们进入该镜像、并且在这里面安装一个mysql服务并且正常使用
#进入mysql这个容器
[14:16:42 root@docker ~]#docker exec -it mysql /bin/bash
docker exec: #对容器执行命令
-it: #交互操作
mysql: #指定正在运行的容器名是mysql
/bin/bash: #执行bash命令
#在mysql容器里面通过yum安装mysql
[root@478c071138f4 /]# yum install mysql-server -y
#启动mysql服务
[root@478c071138f4 /]# service mysqld start
#设置为开机启动
[root@478c071138f4 /]# chkconfig mysqld on
#初始化mysql数据库密码为123
[root@478c071138f4 /]# mysqladmin -uroot password 123
#进入mysql数据库
[root@478c071138f4 /]# mysql -uroot -p123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#创建一个zgy的数据库
mysql> create database zgy;
#查看数据库就发现有一个ZGY的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| zgy |
+--------------------+
4 rows in set (0.00 sec)
#退出数据库
mysql>exit
#退出容器
[root@478c071138f4 /]# exit
接下来我们就可以把他封装成一个mysql的镜像了。然后我们退出容器会发现这个容器还在运行。因为/usr/bin/supervisord是一个前台的守护进程,所以我们在退出容器的时候容器依然运行他不会退出,如果他没有前台守护进程的话这时候它就应该退出了。
[14:32:38 root@docker ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
478c071138f4 hub.c.163.com/public/centos:6.7-tools "/usr/bin/supervisord" 2 hours ago Up 2 hours 22/tcp mysql
现在呢我们要将这个mysql容器转换为我们的镜像了
用到的命令:
docker commit 容器名 再写我们要命名的容器名称
范例:
[14:33:41 root@docker ~]#docker commit mysql mysql:5.1
sha256:6507df97142c354ada69d83ce8908a146918ff5c4d2656e292b411839c1220ad #新容器id号
docker commit : #从容器创建一个新的镜像。
mysql: #这个是当前容器名的唯一索引使用的是当前mysql容器,当然也可以写他的容器ID号
mysql:5.1: #这是表示我们制作的新镜像名称
查看我们现在所有的镜像
通过查看所有的镜像会发现已经创建好了一个mysql:5.1的镜像
[14:41:24 root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.1 6507df97142c 31 seconds ago 789 MB
通过新建mysql:5.1镜像启动为容器
1)通过我们打包好的新镜像运行为容器。
[14:41:55 root@docker ~]#docker run --name mysql-my -d mysql:5.1
docker run: #运行容器
--name mysql-my: #容器名为mysql-my
-d: #放到后台运行
mysql:5.1: #使用的是我们的mysql:5.1镜像
2)通过docker ps -a 查看正在运行的容器。会发现 mysql-my 容器已经正常启动
[14:45:26 root@docker ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
902034167e52 mysql:5.1 "/usr/bin/supervisord" About a minute ago Up About a minute 22/tcp mysql-my
进入 mysql-my容器 验证zgy 数据库是否存在
1)通过docker exec -it 进入该容器
#进入容器
[14:46:41 root@docker ~]#docker exec -it mysql-my /bin/bash
[root@902034167e52 /]#
docker exec: #对容器执行命令
-it: #交互式执行命令
mysql-my: #指定我们要进入的容器名,这里是mysql-my
/bin/bash: #指定使用bash指令
#启动MySQL服务
[root@902034167e52 /]# service mysqld start
Starting mysqld: [ OK ]
#通过上面步骤 7 初始化的mysql 密码进入数据库
[root@902034167e52 /]# mysql -uroot -p123
#查看数据库发现zgy数据库存在
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| zgy | #步骤7中创建的zgy数据库
+--------------------+
更多文章和资料|点击下方文字直达 ↓↓↓
阿里云K8s实战手册
[阿里云CDN排坑指南]CDN
ECS运维指南
DevOps实践手册
Hadoop大数据实战手册
Knative云原生应用开发指南
OSS 运维实战手册