docker介绍

  • 什么是容器
    • linux vserver
    • chroot,namespaces 命名空间,通过Cgroups控制每个namespace中的资源分配
      • 通过比较复杂的代码开发过程,调用以上三项技术,实现容器的创建—-管理—-销毁
  • 容器的今生

    • 实现隔离能力
    • LXC(linux container)
      • 对于原有的常用功能进行了封装,方便我们做容器的生命周期管理
    • —-> Docker(dotcloud)
      • 社区版ce,企业版ee
    • 去中心化

      Docker容器实质上是宿主机上的进程。Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制实现了高效的文件操作。 linux内核实现namespace的一个主要目的,就是实现轻量级虚拟化服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛置身于一个独立的系统环境中,以达到独立和隔离的目的。

  • 参考

    docker的安装

  • yum源准备

    • curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
    • curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    • curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 安装依赖包

    • yum -y install yum-utils device-mapper-persistent-data lvm2
    • yum list docker-ce.x86_64 --showduplicates | sort -r
  • 安装docker-ce

    • yum -y install --setopt=obsoletes=0 \docker-ce-17.03.2.ce-1.e17.centos.x86_64 \docker-ce-selinu-xxxx.centos.noarch
      • 上面是安装指定版本的包,需写上完整的包名
    • 当然可以直接安装最新版本的包,无需加上包名,yum -y install docker-ce
  • 启动docker服务
    • systemctl daemon-reload
    • systemctl restart docker
    • docker version
    • docker info
  • 配置镜像加速

    1. 镜像都保存在这里,https://hub.docker.com/
    2. 阿里云Docker-hub
    3. https://cr.console.aliyun.com/cn-hangzhou/mirrors
    4. mkdir -p /etc/docker
    5. tee /etc/docker/daemon.json << -'EOF'
    6. {
    7. "registry-mirrors":["https://uoggbppok.mirror.aliyuncs.com"]
    8. }
    9. EOF #意思就是向json文件中添加上面三行的内容
    10. ########################################################
    11. 这个东西是可以去阿里云获取的,
    12. 首先登录 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,会获取专属的镜像地址
    13. systemctl daemon-reload
    14. systemctl restart docker
  • docker体系结构

    docker的镜像基础管理

  • 获取镜像

    • docker search centos
    • docker pull centos:6.9
    • docker pull centos:7.5.1804
    • docker pull nginx
  • 镜像基本查看
    • docker image ls

image.png

  • 标识镜像唯一性的方法:
    • REPOSITORY:TAG centos:7.5.1804
    • IMAGE ID(sha256:64的号码,默认只截取12位) 82f3b5f3c58
    • 查看更详细的信息,docker image ls --no-trunc
  • 镜像详细信息查看
    • docker image inspect ubuntu:latest
    • docker image inspect 82f3b5f3c58
  • 只查看镜像ID,docker image ls -q
  • 镜像的导入和导出
    • docker image save nginx > /opt/nginx.tar.gz 然后分发给别人,更方便进行镜像分发
    • docker image rm 82f3b5f3c58
    • docker image load -i /opt/nginx.tar.gz
      • docker image tag 82f3b5f3c58 nginx:latest 给添加个标签
      • 每添加一个标签,查看image就会新增一行,但是IMAGE_ID都是一样的
    • 全部删除了,docker image rm -f docker image ls -q 这样,后面的命令用反引号弄起来

image.png

容器的管理

运行第一个容器:

  1. 交互式容器
  • docker image ls 获取image的唯一标识
  • docker container run -it 82f3b5f3c58 交互式;并且每登录一个窗口就会有一个tty(新的终端)
    • cat /etc/redhat-release 查看下容器的版本
    • 后面加上,/bin/bash 因为有的image提供商,在你启动时并不会调用/bin/bash
  • docker container ls -a 查看容器状态
    • container_id:容器的唯一号码(自动生成的)
    • names:容器的名字(可以自动,也可以手动指定)
    • status:容器的
  • docker container run -it --name="xiaobai_centos" 82f3b5f3c58
    • 退出去后,再次进入交互式容器, docker exec -it 82f3b5f3c58 bash
    • docker attach 82f3b5f3c58
  • 删除容器, docker rm -f 82f3b5f3c58 -f 强制,kill也可, docker --help
  • ^AA^
  1. 守护式容器
  • docker run -d --name="xiaobai_nginx" nginx:1.14 若本地没有,就自动先从registory上pull下来
  • docker container ls -a
  • docker container inspect xiaobai_nginx ,查询容器的详细信息
    • curl -I 172.17.0.3 检查下是否可用
  1. 容器的应用场景
  • 交互式:
    • 在启动时,docker container run -it --name="xiaobai_centos" --rm 82f3b5f3c58
    • 当容器退出时,就自动删除,不用手动删了,需要stop
    • 一般用作工具类的:开发、测试、临时性任务
  • 守护式:服务
    • docker run -d -p 8080:80 --name="xiaobai_nginx_80" nginx:1.14 容器内80端口映射到宿主机8080,实现容器对外提供服务了
  1. 容器的启动/关闭/连接
  • 启动一个容器,交互式,启动完了直接登进去,container start -i 82f3b5f3c58 interactive
    • stop 关闭
    • 不加 -i,就是后台启动了,适用于守护式容器的启动和关闭
  • docker container attach xiaobai_centos6.9 连接到一个容器
    • docker container exec -it xiaobai_centos6.9 /bin/bash 以子进程的方式登录,
    • 在已有工作容器中生成子进程,可以进行容器的调试,退出时也不会影响到当前容器
  1. 容器的后台及前台运行:
  • ctrl+P,Q 会退出到宿主机,而容器内的终端还是在的(实现了交互式会话一直不断)
    • 会提示, [root@30eaf8262d6b /]# read escape sequence
    • attach重新连接回容器, docker container attach testcc
  • 让程序前台一直运行(夯在前台),类似tail -f(可见下图)
    • 在制作守护式容器时,常用的方法
    • 还可以写上死循环
    • ssh -D(夯在前台)
    • docker container run -d -it --name="xiaobai_test" 2199b8eb8390
  • 同样可以删除所有的容器,docker container rm -f docker container ls -aq 后面是反引号

image.png

容器的网络访问

  • docker run -d --name="xiaobai_n1" nginx:1.14
    • docker run -d --name="xiaobai_n2" nginx:1.14
    • docker container exec -it xiaobai_n1 /bin/bash
    • docker container exec -it xiaobai_n2 /bin/bash
      或是启动两个centos容器,方便测试两个容器间能否通信
  • 指定映射(docker会自动添加一条iptables规则来实现端口映射)
    • -p hostPort:containerPort
    • -p ip:hostPort:containerPort
      • docker container run -d -p 10.0.0.100:8081:80 --name="n2" nginx:1.14
    • -p ip::containerPort(随机端口32768-60999)
      • docker container run -d -p 172.16.1.200::80 --name="n3" nginx:1.14
    • -p hostPort:containerPort/udp
    • -p 81:80 -p 443:443 将多个端口映射出来,适用于多服务
  • 随机映射

    • docker run -p 80 (随机端口)

      容器的其他管理

  • docker container ls -a -q 显示出来所有容器的ID

    • 也就是docker ps -a -q -l 老的
  • docker container top 82f3b5f3c58 一般,一个docker就跑一个应用服务
  • docker container logs 82f3b5f3c58 ,不登录,查看日志,-f 参数,-tf 参数更详细

    • —tail 10,倒数10行
    • 日志收集的一些平台

      数据卷实现持久化存储

  • docker run -d --name="n1" -p 80:80 nginx

  • docker image ls
  • docker container exec -it n1 /bin/bash 登录到容器
  1. 手工交互数据:
  • docker container cp index.html n1:/usr/share/nginx/html/ ,将网站文件拷贝进去,了解
    • docker container cp --help
  1. volume实现宿主机和容器的数据共享
  • docker run -d --name="n2" -p 81:80 -v /opt/html:/usr/share/nginx/html nginx
  • docker container exec -it n2 /bin/bash 在宿主机改动,在容器的对应目录上会同步改动
  • 作用:实现数据持久化
  • -v /opt/volume/a:/opt/a -v /opt/volume/b:/opt/b 实现多个数据卷
  1. 使用数据卷容器:
  • touch /opt/volume/a/a.txt touch /opt/volume/b/b.txt 拷贝数据到数据卷中,宿主机模拟数据目录
  • 启动数据卷容器
    • docker run -it --name="centos_volumes" -v /opt/volue/a:/opt/a -v /opt/volume/b:/opt/b centos:6.9 /bin/bash
    • CTRL+p q 只一次就可
  • 使用数据卷容器,进行挂载到容器。适用于集群化的时候
    • docker run -d -p 8085:80 --volumes-from nginx_volumes --name "http8085" nginx
    • docker run -d -p 8086:80 --volumes-from nginx_volumes --name "http8086" nginx
    • docker container exec -it http8085 /bin/bash 检查目录文件
  • 作用:在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理

    • 避免重复劳动,和操作的复杂度

      制作本地局域网yum源

  • 搭建本地yum仓库,并定期同步阿里云源,参考

  • 安装vsftpd,yum -y install vsftpd
    • systemctl enable vsftpd systemctl start vsftpd
  • 上传系统镜像到虚拟机,
    • mount -o loop /mnt/CentOS-6.9xxxx.iso /var/ftp/centos6.9
    • windows验证:ftp://10.0.0.100/centos6.9/
    • mount -o loop /mnt/CentOS-7.5xxxx.iso /var/ftp/centos7.5
  • 配置yum仓库文件
    • mkdir -p /var/ftp/centos6.9
    • mkdir -p /var/ftp/centos7.5
    • cat >/etc/yum.repos.d/ftp_6.repo <[ftp]
      name=ftpbase
      baseurl=ftp://172.17.0.1/centos6.9
      enabled=1
      gpgcheck=0
      EOF
    • cat >/etc/yum.repos.d/ftp_7.repo <[ftp]
      name=ftpbase
      baseurl=ftp://172.17.0.1/centos7.5
      enabled=1
      gpgcheck=0
      e

      镜像制作

      基于容器的镜像制作(Aliyun ECS)

  1. 启动基础镜像
  • docker run -it --name="xiaobai_centos" 82f3b5f3c58
  • mv *.repo /tmp 然后,按上面步骤,配置yum仓库文件
    • 生产时,应该把aliyun的软件包同步过来,在本地准备好
  1. 安装所需要的软件包
  • yum makecache fast && yum -y install openssh-server
    • 然后可以从宿主机ssh到容器内,但是一旦从连接上的容器退出,也就ssh不上去了
    • docker container top xiaobai_centos inspect查看容器的详细信息IP等
    • 容器内运行,/etc/init.d/sshd start
    • /etc/init.d/sshd stop
  1. 镜像的制作
  • docker commit xiaobai_centos xiaobai/centos6.9_sshd:v1 ,基于容器去制作镜像(静态资源)
    • docker image ls
  1. 基于新镜像启动容器
  • docker container run -d --name=sshd 7c0ddaff04aa /usr/sbin/sshd -D
    • 如果指定启动时执行的第一条命令是 /etc/init.d/sshd start,那查看容器状态是 exited,因为执行完第一条指令就退出了。
    • /usr/sbin/sshd -D ,sshd服务前台运行,相当于一直夯那儿
    • 也就是说,云服务提供商提供给用户的云服务器后,用户无需去登录到服务器启动服务,即可以实现ssh连接,一个道理

image.png

构建企业网站定制镜像(Centos6.9_SSHD_LAMP_BBS)

  1. 启动基础镜像
  • docker image ls
  • mkdir -p /opt/vol/mysql /opt/vol/html ,宿主机创建目录
  • docker container run -it --name="xiaobai_centos_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9
    • 测试一下数据卷可用性
  1. 优化yum源,安装所需要的软件
  • mv /etc/yum.repos.d/*.repo /tmp
  • echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" > /etc/yum.repos.d/ftp.repo
  • yum makecache fast && yum -y install openssh-server httpd mysql mysql-server php php-mysql
  1. 软件的初始化
  • etc/init.d/sshd start etc/init.d/sshd stop
  • echo "123456" | passwd root --stdin
  • /etc/init.d/mysqld start ,检查下宿主机数据卷下是否同步过去了
    • grant all on *.* to root@'%' identified by '123';
    • grant all on *.* to discuz@'%' identified by '123';
    • create database discuz charset utf8;

image.png

  • /etc/init.d/httpd start /etc/init.d/httpd restart
  • 注意退出来的操作,ctrl+p q
  1. 制作LAMP第一版镜像
  • docker container ls -a
  • docker commit c3fd597ec194 xiaobai/centos_lamp:v1
  • 根据第一版镜像,启动新容器, docker container run -it --name="xiaobai_centos_bbs_v3" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 xiaobai/centos_lamp:v1
  • 测试php功能, echo "<?php\nphpinfo();\n?>" >/var/www/html/index.php
  • 安装bbs论坛,
    • 将下载下来的bbs包上传到宿主机网站目录内,解压,然后浏览器访问
    • 能够按照步骤正常安装就可以了
  1. 制作LAMP+bbs第二版镜像
  • docker container ls -a
  • docker commit xiaobai_centos_bbs_v3 xiaobai/centos6.9_sshd_lamp_bbs:v1
  1. 创建启动脚本,(能且只能启动一个主进程,并且夯住,类似linux启动时先是init,然后同样调用脚本)
    1. vim /opt/vol/html/init.sh 宿主机创建就可
    2. #!/bin/bash
    3. /etc/init.d/mysqld start
    4. /etc/init.d/httpd start
    5. /usr/sbin/sshd -D
  • chmod 777 init.sh
  1. 启动容器,映射端口,挂载数据卷,自动启多服务
  • docker limage ls -a
  • docker container run -d --name="xiaobaiyun_lamp_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 22222:22 -p 8888:80 -p 33060:3306 xiaobai/centos6.9_sshd_lamp_bbs:v1 /var/www/html/init.sh
    • 脚本路径写容器里的路径
    • 如果上面脚本写错了没关系,docker container rm -f docker ps -a -q ,删除重复上一条

image.png

centos:7.5.1804_sshd

  1. 启动基础容器
  • ~~docker run -it --name=c75sshd centos:7.5.1804 ~~
  • docker run --privileged -it --name=c75sshd -v /sys/fs/cgroup:/sys/fs/cgroup centos:7.5.1804 /usr/sbin/init
  1. 手动执行sshd的启动
  • mkdir -p /var/run/sshd
  • echo 'UseDNS no' >> /etc/ssh/sshd_config
  • sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
  • echo 'root:123456' | chpasswd
  • /usr/bin/ssh-keygen -A
  • docker commit xiaobai_c75sshd c75sshd
  • 制作镜像,docker commit c75sshd xiaobai_c75sshd
    • docker image ls -a
  • 启动镜像,docker container run --rm -d --name=sshd_2222 -p 222:22 xiaobai_c75sshd /usr/sbin/sshd -D

image.png

  • 如果按照上图的来,就是 docker container run -d --name=sshd_2222 -p 222:22 xiaobai/centos7:v1 /usr/sbin/sshd -D
  1. 注意!!
  • 如果涉及到 systemctl start zabbix-agent 或者 systemctl restart network 这种的,就需要权限
  • docker run -itd --privileged=true --name=zabbix_agent02 agent /usr/sbin/init
  • 注意一定是 /usr/sbin/init 运行
  • 参考,三个重要权限operation not permitted

    通过dockerfile定制企业镜像

  • 在下一篇…