Docker(容器)技术(上)

容器

介于虚拟化和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 ~]# 

 

猜你喜欢

转载自blog.csdn.net/weixin_43800781/article/details/86466369