容器
介于虚拟化和rpm包之间,容器技术已经成为了应用程序封装和交付的核心技术,在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速。
核心有以下几个内核技术组成:
Cgroups(Control Groups)--资源管理
NameSpace--进程隔离
SELinux安全
Docker
完整的一套容器管理系统,它提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层技术
虚拟化与docker的区别
说到docker,就不得不提一下虚拟化。虚拟化需要先建立一个系统,并且并非按照应用隔离,而是按照系统隔离,管理员无法看到系统内部信息。而docker使用的是共享公共库和程序是按照应用进行隔离,管理人员可以看到系统内部的信息。
举个例子,Docker就是手机中的各种APP,只需要一个系统就可以下载自己所需的应用,简洁高效。但是虚拟化技术相当于你的苹果手机安装一个额软件,这个软件上安装安卓系统、魅族系统等,每个系统上还要安装各类应用,比较麻烦。
当然,docker也有自身的缺点:比如,隔离性就不如虚拟化强,共有一个Linux内核,安全性不足,SELinux难以驾驭,还有监控容器和容器排错也是挑战。
chroot的使用
创建一个文件夹
[root@guo ~]# mkdir /var/vroot
安装bash软件
[root@guo ~]# yum -y install --installroot=/var/vroot/ bash coreutils
执行chroot
[root@guo ~]# chroot /var/vroot
ssh 用户 chroot 测试
[root@guo ~]# adduser test
[root@guo ~]# passwd test
[root@guo ~]# cp /etc/shadow /var/vroot
[root@guo ~]# cp /etc/passwd /var/vroot
修改配置文件/etc/ssh/sshd_config
[root@guo ~]# vim /etc/ssh/sshd_config
...
Match User test
ChrootDirectory /var/vroot
重启服务
[root@guo ~]# systemctl restart sshd
远程使用 用户登录
[root@guo ~]# ssh -l test 172.40.58.253
[email protected]'s password:
-bash: /dev/null: 权限不够
/usr/bin/id: 无法找到ID 为1002 的用户的属组
/usr/bin/id: cannot find name for user ID 1002
...
-bash: /dev/null: 权限不够
-bash-4.2$
Docker部署
准备:需要64位操作系统,至少需要RHEL6.5以上的版本,关闭防火墙(不是必须),两台2台虚拟机
docker01 192.168.1.11 2cpu 2Gmem 至少20G硬盘 必须使用vbr 配置yum源
docker02 192.168.1.12 2cpu 2Gmem 至少20G硬盘 必须使用vbr 配置yum源
[root@guo ~]# systemctl stop firewalld //物理机关闭防火墙
[root@guo ~]# systemctl mask firewalld
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# bash
[root@docker01 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
[root@docker01 ~]# ping www.baidu.com
PING www.a.shifen.com (119.75.217.26) 56(84) bytes of data.
64 bytes from 119.75.217.26 (119.75.217.26): icmp_seq=1 ttl=54 time=4.70 ms
[root@docker01 ~]# yum repolist
已加载插件:fastestmirror
server | 3.6 kB 00:00
(1/2): server/group_gz | 156 kB 00:00
(2/2): server/primary_db | 5.7 MB 00:00
Determining fastest mirrors
源标识 源名称 状态
server server 9,591
repolist: 9,591
安装docker并启动(yum源没有,需要自己下载)
关于yum自定义的说明,可以把我们常用的几个软件包,放到一个文件里,然后利用命令创建一个索引在此文件中repodata,因为yum repolist默认会在repodata里面查看清单。我们这里默认只有一个两个包,拷贝过来就可以,如果多台机器,多个包,就用如下的命令,
[root@docker01 ~]# yum -y install createrepo
[root@docker01 ~]# createrepo .
[root@docker01 ~]# createrepo --update .
[root@docker01 ~]# yum -y install docker-engine-selinux-1.12.1-1.el7.centos.noarch.rpm
[root@docker01 ~]# yum -y install docker-engine-1.12.1-1.el7.centos.x86_64.rpm //这个后安装
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
...
[root@docker01 ~]# docker version
Client:
Version: 1.12.1
...
Server:
Version: 1.12.1
...
[root@docker01 ~]# systemctl enable docker
Docker镜像
Docker中容器是基于镜像启动的(镜像是启动容器的核心),镜像采用分层设计,使用cow技术,确保数据补丢失
docker images | 查看镜像 |
---|---|
docker search xxx | 搜索关于xxx的镜像 |
docker help pull | 查看下载镜像的帮助 |
docker pull 镜像文件 | 下载镜像 |
docker help push | 查看上传的帮助 |
docker push 镜像文件 | 上传镜像 |
docker local < xx.tar | 导入镜像(通过tar包导入) |
docker save image_name > xx.tar |
导出镜像(将本地镜像导出) |
docker run -it 镜像文件 bash (容器里的命令,不写默认命令启动) | 启动xx镜像生成一个容器 |
docker ps [选项] | 查看正在运行的容器信息 |
docker inspect 镜像文件 | 查看镜像底层信息(了解环境变量,存储卷,标签) |
docker history 镜像文件 | 查看镜像制作历史 |
docker rmi 镜像文件 | 删除本地镜像(启动容器时,删除会报错误) |
docker tag 镜像文件:标签 新的镜像文件:标签名 | 重命名镜像(复制,id号不变)相当于ln硬链接 |
安装镜像
[root@docker01 ~]# docker images //查看docker镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker01 ~]# docker search busybox //查询镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 1484 [OK]
...
[root@docker01 ~]# docker pull busybox //下载镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 3a093384ac30 13 days ago 1.199 MB
//镜像仓库名称 标签 ID 创建时间 大小
[root@docker01 ~]# docker save busybox:latest > busybox.tar
[root@docker01 ~]# docker load < busybox.tar
[root@docker01 ~]# yum provides unzip //查看命令的提供包
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
unzip-6.0-16.el7.x86_64 : A utility for unpacking zip files
源 :server
[root@docker01 ~]# yum -y install unzip
[root@docker01 ~]# unzip docker_images.zip //可以直接下载这些镜像
Archive: docker_images.zip
creating: docker_images/
inflating: docker_images/nginx.tar
inflating: docker_images/redis.tar
inflating: docker_images/centos.tar
inflating: docker_images/registry.tar
inflating: docker_images/ubuntu.tar
[root@docker01 ~]# ls docker_images
centos.tar nginx.tar redis.tar registry.tar ubuntu.tar
[root@docker01 docker_images]# for i in *
> do
> docker load < $i
> done
Loaded image: centos:latest
Loaded image: nginx:latest
Loaded image: redis:latest
Loaded image: registry:latest
Loaded image: ubuntu:latest
[root@docker02 ~]# docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Deleted: sha256:3a093384ac306cbac30b67f1585e12b30ab1a899374dabc3170b9bca246f1444
Deleted: sha256:683f499823be212bf04cb9540407d8353803c25d0d9eb5f2fdb62786d8b95ead
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 3a093384ac30 13 days ago 1.199 MB
...
[root@docker01 ~]# docker tag busybox:latest aa:bb
[root@docker01 ~]# docker images
//可以看出他们的id是一样的,这个就可以删除任何多余的镜像文件,但要保留至少一个镜像(相同id的)
REPOSITORY TAG IMAGE ID CREATED SIZE
aa bb 3a093384ac30 13 days ago 1.199 MB
busybox latest 3a093384ac30 13 days ago 1.199 MB
...
[root@docker01 ~]# docker rmi aa:bb
Untagged: aa:bb
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 3a093384ac30 13 days ago 1.199 MB
启动镜像生成容器
[root@docker01 ~]# docker run -it centos:latest bash //注意,这个bash是容器里面的bash
[root@74b9880fea61 /]# pwd
/
[root@74b9880fea61 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@74b9880fea61 /]# ifconfig
bash: ifconfig: command not found
[root@74b9880fea61 /]# pstree
bash: pstree: command not found
[root@74b9880fea61 yum.repos.d]# vi centos.repo
[root@74b9880fea61 yum.repos.d]# yum -y install vim-enhanced
[root@74b9880fea61 yum.repos.d]# yum -y install psmisc
[root@74b9880fea61 /]# yum -y install ifconfig
[root@74b9880fea61 yum.repos.d]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
[root@74b9880fea61 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1896 ? Ss 06:57 0:00 bash
root 83 0.0 0.0 47448 1664 ? R+ 07:24 0:00 ps aux
redhat | debian(ubuntu) |
rpm包 rpm命令 yum安装 | deb包 dpkg命令 apt-get安装 |
rpm -qa | dpkg -l 查询软件包 |
rpm -ql | dpkg -L 列出软件包安装位置和路径 |
容器相关命令
docker stop | 关闭容器 |
---|---|
docker start | 启动容器 |
docker restart | 重启容器 |
docker ps | 查看容器列表 |
docker run | 运行容器 |
docker attach| exec | 进入容器 |
docker inspect | 查看容器底层信息 |
docker top | 查看容器进程列表 |
docker rm | 删除容器 |
[root@docker01 ~]# docker run -it centos:latest //每运行一次就增加一个容器
[root@docker01 ~]# docker ps -aq
74b9880fea61
cb906ca1934a //容器的id是我们管理容器的重要参数 匹配的时候可以不用全写,保证唯一就可以,比如可以写74b或74b9...
[root@docker01 ~]# docker start 74b
74b
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb906ca1934a centos:latest "/bin/bash" 55 minutes ago Exited (0) 55 minutes ago desperate_kalam
74b9880fea61 centos:latest "bash" 2 hours ago Up 17 seconds
[root@docker01 ~]# docker stop $(docker ps -aq) //上一个命令作为本次命令的参数
cb906ca1934a
74b9880fea61
[root@docker01 ~]# docker rm $(docker ps -aq) //删除容器前需要停止容器
cb906ca1934a
74b9880fea61
[root@docker01 ~]# docker ps -a //已经全部删除
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker run [选项] 镜像:标签 命令
-d: 后台运行容器,并返回容器ID
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb": 为容器指定一个名称
[root@docker01 ~]# docker run -itd centos:latest
1b87bb364665c53dbddaeaf0a5fb9233c21d7290c3976059dd14d9eb6350451d
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b87bb364665 centos:latest "/bin/bash" 17 seconds ago Up 15 seconds compassionate_almeida
[root@docker01 ~]# docker run --name=mycentos -d centos:latest
344044e8b760cb0a37e842162b46b55fee96772997cdd69be4e2db10542c3d90
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
344044e8b760 centos:latest "/bin/bash" 6 seconds ago Exited (0) 3 seconds ago mycentos
1b87bb364665 centos:latest "/bin/bash" 3 minutes ago Up 3 minutes compassionate_almeida
[root@docker01 ~]# docker top 1b87bb364665
UID PID PPID C STIME TTY TIME CMD
root 12218 12204 0 17:23 pts/1 00:00:00 /bin/bash
docker exec 进入容器,退出时不会关闭容器,链接的不是上帝进程(编号为1),会新开一个进程,退出的时候上帝进程还在
docker attach 进入容器,退出时直接关闭容器,进去的直接就是上帝进程,按键ctrl+pq 不会关闭进程
[root@docker01 ~]# docker run -itd centos:latest /bin/bash
0ef62639a5c0aa353da898df002a08356cba3501d05bf02f2068b540ffc86163
[root@docker01 ~]# docker exec -it 0ef bash
[root@0ef62639a5c0 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1680 ? Ss+ 09:51 0:00 /bin/bash
root 13 0.0 0.0 11776 1920 ? Ss 09:54 0:00 bash
root 66 0.0 0.0 47448 1664 ? R+ 09:55 0:00 ps aux
[root@0ef62639a5c0 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ef62639a5c0 centos:latest "/bin/bash" 4 minutes ago Up 4 minutes agitated_borg
[root@docker01 ~]# docker attach 0ef
[root@0ef62639a5c0 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1884 ? Ss 09:51 0:00 /bin/bash
root 69 0.0 0.0 47448 1664 ? R+ 09:57 0:00 ps aux
[root@0ef62639a5c0 /]# [root@docker01 ~]# docker ps //ctrl+pq退出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ef62639a5c0 centos:latest "/bin/bash" 8 minutes ago Up 8 minutes agitated_borg
[root@docker01 ~]# docker attach 0ef
[root@0ef62639a5c0 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1884 ? Ss 09:51 0:00 /bin/bash
root 70 0.0 0.0 47448 1660 ? R+ 10:00 0:00 ps aux
[root@0ef62639a5c0 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker01 ~]#