|
什么是docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化要docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
那什么又是lxc呢?
lxc容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。说白了就是所有的设备都是完全寄宿与宿主机
先安装lxc
环境CentOS 6.5 x64
1、安装LXC
yum -y install epel* #安装epel库
yum install libcgroup lxc lxc-templates --enablerepo=epel #安装lxc
/etc/init.d/cgconfig start
2、检查环境
lxc-checkconfig #检查CPU是否支持lxc虚拟化,输出如下即是ok的
Kernel configuration not found at /proc/config.gz; searching…
Kernel configuration found at /boot/config-2.6.32-431.1.2.0.1.el6.x86_64
— Namespaces —
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/ptsinstances: enabled
— Control groups—
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
— Misc —
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config/usr/bin/lxc-checkconfig
lxc的默认安装模板
/usr/share/lxc/templates/ 下有好几个模板可供选择,这是自带的模板
lxc的默认安装位置
/var/lib/lxc/
lxc的主配置文件
vi /etc/lxc/default.conf #一般要是指定lxc的网络配置参数,此处还需要一个知识点就是宿主机的虚拟网卡,就不再做详细介绍
lxc.network.type = veth #网卡类型 veth只是桥接网卡的一个类型,可以与任何机器(宿主机,其他虚拟机,局域网其他机器)通讯。
lxc.network.link = br0 #桥接宿主机网卡名
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.ipv4 = 192.168.1.61/24 #此处为虚拟机的网卡ip
lxc.network.ipv4.gateway = 192.168.1.254
3、lxc的一些常用的命令
lxc-attach lxc-checkconfig lxc-console lxc-execute lxc-ls lxc-start lxc-unfreeze lxc-wait
lxc-autostart lxc-clone lxc-create lxc-freeze lxc-monitor lxc-stop lxc-unshare
lxc-cgroup lxc-config lxc-destroy lxc-info lxc-snapshot lxc-top lxc-usernsexec
此处我借用软件自带的centos模板创建一个虚拟机
lxc-create -n centos1 -t centos #创建的名字叫centos1
lxc-start -n centos1 #启动centos1
启动后就可以进行操作我们的虚拟机了
centos6.5
下面我们说说docker的安装和使用
1、禁用selinux
由于Selinux和LXC有冲突,所以需要禁用selinux。编辑/etc/selinux/config,设置两个关键变量
vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
2、配置Fedora EPEL源
yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
3、添加hop5.repo源
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
4、安装Docker
yum install docker-io
此处已经是安装完成了,可是使用docker命令进行测试了
5、手动挂载cgroup
CentOS环境中运行docker、lxc,需要手动重新挂载cgroup。
service cgconfig stop # 关闭服务
chkconfig cgconfig off # 取消开机启动
vi /etc/fstab
none /cgroup cgroup defaults 0 0 # 添加此行,开机后自动挂载
6、启动docker服务
service docker start
chkconfig docker on
7、docker的一些常用命令
docker pull <镜像名:tag> #从官网拉取镜像
docker search <镜像名> #搜索在线可用镜像名
docker top <container> #显示容器内运行的进程
docker images #查询所有的镜像,默认是最近创建的排在最上。
docker ps #查看正在运行的容器
docker ps -l #查看最后退出的容器的ID
docker ps -a #查看所有的容器,包括退出的。
docker logs {容器ID|容器名称} #查询某个容器的所有操作记录。
docker logs -f {容器ID|容器名称} #实时查看容易的操作记录。
docker rm$(docker ps -a -q) #删除所有容器
docker rm <容器名or ID> #删除单个容器
docker rmi <ID> #删除单个镜像
docker rmi$(docker images | grep none | awk '{print $3}' | sort -r) #删除所有镜像
docker stop <容器名or ID> #停止某个容器
docker start <容器名or ID> #启动某个容器
docker kill <容器名or ID> #杀掉某个容器
8、docker search centos7 #列出官网可用centos7的所有镜像,根据自身需求拉取
docker pull oogatta/centos7_64_vagrant #拉取一个镜像
docker images #查看所有的镜像
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
oogatta/centos7_64_vagrant latest e415131e31fb 9 weeks ago 898 MB
docker run -i -t docker pull oogatta/centos7_64_vagrant /bin/bash #运行docker pull oogatta/centos7_64_vagrant 服务器
做MySQL镜像
制作镜像依靠docker的Dockerfile文件
我们首先下载centos的镜像
1、docker pull centos
[root@lan56 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos5 5a1ebaa356ff 2 weeks ago 484 MB
centos centos7 70214e5d0a90 3 weeks ago 224 MB
centos latest 70214e5d0a90 3 weeks ago 224 MB
centos centos6 68eb857ffb51 3 weeks ago 212.7 MB
2、制作一个MySQL的容器,
首先创建一个目录并在目录下创建一个Dockerfile,文件内容如下
vim Dockerfile
FROM centos:centos6 #利用我们的centos:centos6为镜像模板
MAINTAINER Fanbin Kong "kongxx@hotmail.com"
RUN yum install -y mysql:server mysql #yum安装
RUN /etc/init.d/mysqld start &&\ #启动
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'letmein';"&&\ # 授权
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'letmein';"&&\
mysql -u root -pletmein -e "show databases;" #指定用户名和密码
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
3、在Dockerfile所在目录下运行build命令来生成image文件,这里使用mysql:mysql-server作为image文件名
docker build -t mysql:mysql-server .
4、再次查看镜像
[root@lan56 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mysql mysql-server 134b2876c7fd 45 minutes ago 625.1 MB
centos centos5 5a1ebaa356ff 2 weeks ago 484 MB
centos centos7 70214e5d0a90 3 weeks ago 224 MB
centos latest 70214e5d0a90 3 weeks ago 224 MB
centos centos6 68eb857ffb51 3 weeks ago 212.7 MB
已经做好MySQL的镜像
5、启动容器
docker run --name=mysqlserver -d -P mysql:mysql-server
启动完容器后,可以使用“sudo docker ps”来查看,此时可以看PORTS列内容为“0.0.0.0:49153->3306/tcp”,容器的3306端口会被映射到宿主机器的49153端口,这样我们就可以通过宿主机器的49153端口来连接了
备注:
mysql -h <宿主机器> -u root -pletmein -P 49153
另外在运行容器的时候也可以通过下面的命令来修改端口映射
docker run --name=mysqlserver -d -p 3306:3306 mysql:mysql-server
此时容器的3306端口会被映射到宿主机器的3306端口,这样我们就可以通过宿主机器的3306端口访问mysql了
还有一种情况就是为了安全考虑,我只希望当前的宿主机器可以访问mysql服务,此时我们可以
docker run --name=mysqlserver -d -p 127.0.0.1:3306:3306 mysql_server
安装ssh和Apache
[root@lan51 httpd]# vim Dockerfile
sshd
#
VERSION 0.0.1
FROM centos:latest
MAINTAINER Fisher via "sudops.com"
RUN yum install -y --nogpgcheck openssh openssh-server httpd net-tools
RUN echo 'root:mypwd' |chpasswd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN sed -i "/ServerName www.example.com:80/a\ServerName 0.0.0.0:80" /etc/httpd/conf/httpd.conf
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D |
|
|
|
|
|
|