docker容器当做虚拟机使用,一劳永逸
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是 PaaS 最理想的状态。容器的本质是进程,容器就是未来云计算系统中的进程。
云计算服务类型
基础设施即服务IaaS
平台即服务(PaaS)
软件即服务(SaaS)
docker容器和虚拟机的对比
docker容器当做虚拟机使用的痛点
1、docker原生容器基础命令ip a 、ss、ssh、等没有
2、docker原生容器systemctl命令没有
3、docker启动命令太长,不好记
解决方案
用dockerfile构建镜像,先把能想到的基础命令需要的包安装一下,解决问题1,用特权模式构建容器,解决问题2,docker启动命令用alias设置别名,解决问题3。做完上面的步骤,恭喜你,虚拟机任你开,全程无痛
具体做法
1、先利用dockerfile构建自定义的基础镜像
[root@sun ~]# cd /mnt
[root@sun mnt]# mkdir centos7
[root@sun mnt]# cd centos7/
[root@sun centos7]# vim Dockerfile
[root@sun centos7]# cat Dockerfile
FROM centos:7
RUN yum install -y \
vim bash-com* openssh-clients openssh-server iproute cronie;\
yum group install -y "Development Tools";yum clean all;\
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8
构建自定义的docker镜像,名字自定义
[root@sun centos7]# docker build . -t base-centos
出现下面语句,表示构建成功
Successfully built 325f14a33587
Successfully tagged base-centos:latest
[root@sun centos7]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
base-centos latest 325f14a33587 3 minutes ago 522MB
sunlizhen-ng latest 380f3ce262e9 4 days ago 843MB
centos 7 7e6257c9f8d8 2 months ago 203MB
hello-world latest bf756fb1ae65 9 months ago 13.3kB
可以看到base-centos基础镜像已经在我们的自己的镜像仓库里面
现在已经拥有了一个支持基本命令和支持中文的镜像了。
2、以特权模式进入可以使用systemctl命令
docker run -it --name mydocker1 --rm --privileged=true base-centos /usr/sbin/init
–name 容器命名
–rm 退出自动删除容器
–privileged 特权模式
/usr/sbin/init 系统的1号进程命令
遇到的一个问题,可能是我的系统环境问题:
docker run -it --name mydocker1 --rm --privileged=true base-centos /usr/sbin/init
执行这一条命令之后,导致我centos7真机系统重启
个人水平有限解决不了,不知道什么原因,只能换一种方式
先后台运行docker,然后与exec进入
docker run -itd --name mydocker1 --rm --privileged=true base-centos /usr/sbin/init
docker exec -it mydocker1 bash
3、启动docker命令、参数太长。设置命令别名
首先说明:个人习惯在构建容器的时候给容器起一个便于记忆和区别的名字,好处是便于管理。所以在设置别名的时候设置一个位置变量$1,用作容器命名。
[root@sun ~]# vim /etc/profile.d/docker.sh
function mydocker(){
docker run -it --name $1 --rm --privileged=true base-centos /usr/sbin/init
}
alias ops='mydocker'
[root@sun ~]# source /etc/profile.d/docker.sh
测试示例:
如果还想更改容器主机名加一个–hostname参数
[root@sun ~]# vim /etc/profile.d/docker.sh
function mydocker(){
docker run -it --name $1 --hostname $2 --rm base-centos
}
alias ops='mydocker'
[root@sun ~]# source /etc/profile.d/docker.sh
也就是执行命令的话需要传递两个位置变量
容器名称和容器主机名称
测试示例
至此,可以很简单拥有一台新的虚拟机
补充一:如果直接run构建并且进入容器导致系统重启就这样
[root@sun ~]# vim /etc/profile.d/docker.sh
function mydocker(){
docker run -itd --name $1 --rm --privileged=true base-centos /usr/sbin/init
docker exec -it $1 bash
}
alias ops='mydocker'
[root@sun ~]# source /etc/profile.d/docker.sh
补充二:容器的导出和导入
使用场景:在一个容器里安装了mysql等服务,想再次构建一个容器里面同样有mysql等服务
可以先将当前容器导出为一个任意命名的压缩包:
docker export 容器名/id > centos7-mysql.tar
然后拷贝压缩包给需要的服务器,本机需要就直接导入
将容器压缩包导入为本地镜像
docker import centos7-mysql.tar
注意,import命令是将容器快照导入为的镜像
docker images
需要重新定义镜像标签
docker tag 镜像id centos:7
tag加的镜像ID,给新import的镜像加上仓库名和标签,重复操作不会覆盖,会新建
(docker tag centos:7 sun:8)
docker run -it --rm sunlizhen bash 自己导入的镜像,run后面需要跟一个命令