通过dockerfile定制企业镜像

  • 将exited状态的容器全部删掉,

    • docker rm $(docker ps -q -f status=exited)

      dockerfile基本使用方式(centos6.9_sshd)

  • mkdir -p /opt/dockerfile/centos6.9_sshd

  • vim Dockerfile

    1. # Centos6.9-SSHDv1.0
    2. FROM centos:6.9
    3. RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseurl=
    4. ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" > /etc/yum.repos.d/ftp.repo &&
    5. yum makecache fast && yum -y install openssh-server
    6. RUN etc/init.d/sshd start && etc/init.d/sshd stop && echo "123456" | passwd root --stdin
    7. EXPOSE 22 #暴露端口
    8. EXPOSE 80
    9. CMD ["/usr/sbin/sshd","-D"] #相当于将来用这个镜像启容器时,告诉RUN执行的第一条是sshd
  • FROM语法:基础镜像

    • centos@2199b8eb8390(IMAGE_ID,镜像的唯一代码,这样更安全)
    • centos:6.9
  • RUN语法:构建镜像过程中运行的命令
    • && 排列多条命令,RUN每运行一条命令相当于启动一个临时容器
    • [“mysqld”,”—initialize-insecure”,”—user=mysql”,”—basedir=/usr/local/mysql”] ,以mysql为例
  • EXPOSE:向外暴露的端口
  • CMD:使用镜像启动容器时运行的命令,一般是必加的
    • [“/usr/sbin/sshd”,”-D”]
  1. 通过例子学习其他指令,例dockerfile构建lamp基础环境镜像
  • docker image build -t "xiaobai/centos6.9-sshd:v1.0" ./
    • 相当于是,快速构建docker image
    • 如果上面写的Dockerfile文件没问题,那就会一步一步的执行,如下图

image.png

  • COPY:
    • 将dockerfile目录下的某个文件拷贝到容器的指定目录下,可以支持通配符。
    • 如果拷贝的是目录,就只会拷贝目录下的子文件子目录 cp xxx/* xxx/
  • ADD:比上面命令多的是,可以上传并自动解压tar类的软件包到目录,tar相关文件如.tar .bz2 .xz .tar

    • 可以将远程的文件上传至容器,这种的并不会解压
      1. vim dockfile
      2. # Centos6.9_sshd_LAMP
      3. FROM centos:6.9
      4. RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" >
      5. /etc/yum.repos.d/ftp.repo && yum makecache fast && yum -y install openssh-server httpd
      6. mysql mysql-server php php-mysql
      7. RUN /etc/init.d/sshd start && /etc/init.d/mysqld start && /etc/init.d/httpd start &&
      8. echo "123456" | passwd root --stdin
      9. #RUN mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;" #实现免交互
      10. COPY init.sh /
      11. ADD bbs.tar.gz /var/www/html/
      12. #ADD https://mirrors.aliyun.com/centos/7.6.1810/os/xxx/xxx.rpm /tmp
      13. EXPOSE 22
      14. EXPOSE 80
      15. EXPOSE 3306
      16. CMD ["/bin/bash","/init.sh"]
      17. #ENV CODEDIR /var/www/html/
      18. #ENV DATADIR /data/mysql/data
      19. #ADD bbs.tar.gz ${CODEDIR}
      20. #VOLUME ["${CODEDIR}","${DATADIR}"]
      21. #ENTRYPOINT ["/bin/bash","/init.sh"]
  • cp /init.sh ./ init.sh脚本与dockerfile在同一目录下

  • docker build -t "xiaobai/c69_sshd_lamp_bbs" ./

2.1 排错:

  • mysql -e "grant all on *.* to root@'%' identified by '123';grant all on *.* to discuz@'%' identified by '123';create database discuz charset utf8;" 此行命令,添加到/init.sh 脚本中mysqld启动后,就可
  • docker container run -d -p 80 -p 22 -p 3306 xiaobai/c69_sshd_lamp_bbs
  • dpcker ps -a 处于运行状态
  • 进行测试
  1. 继续其他命令:
  • VOLUME:[“/var/www/html”,”/data/mysql/data”] 实现数据卷的自动挂载
  • WORKDIR:
  • ENV:
  • ENTRYPOINT:防止启动容器时,dockerfile里的命令被手工输入的命令覆盖,防止容器秒起秒关
    • 还可以做传参数使用
    • 而用CMD会被替换掉
  1. 小节:
  • COPY和ADD后面文件的路径,是以dockerfile 为起点,相对路径
  • yum本地源同步阿里云

    • 下载到本地,然后制作本地的yum源

      构建私有registry

  • 启动registry,

    • docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
    • 保证重启docker或是服务器后,容器能自动重启起来
  • 浏览器访问,http://宿主机IP:5000/v2/,能看到{} 说明registry运行正常
  • 修改配置文件,

    1. vim /etc/docker/daemon.json
    2. "insecure-registries":["registry1的IP:5000"] 添加一行
  • systemctl restart docker

  1. 将镜像传到镜像服务器上,
  • 做标签,docker tag nginx:latest 10.0.0.100:5000/xiaobai/nginx:v1
  • docker push 10.0.0.100:5000/xiaobai/nginx:v1 100就是registry1IP,docker客户端为101
  • xiaobai—将来登录镜像的用户名
  • 将镜像全部删除,docker rmi -f docker image ls -a -q
  1. 异地进行pull镜像到本地 (10.0.0.101)
  • docker pull 10.0.0.100:5000/xiaobai/nginx:v1
  1. 本地仓库加安全认证
  • 生成密码,
    • yum -y install httpd-tools
    • mkdir -p /opt/registry-auth
    • htpasswd -Bbn xiaobai 123 > /opt/registry-auth/htpasswd
  1. 重启带有秘钥功能的registry容器
  • docker rm -f docker ps -aq
  • docker run -d -p 5000:5000 -v /opt/registry-auth:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
  • docker ps -a
  • 做标签,docker tag centos:6.9 10.0.0.100:5000/xiaobai/centos:v1

5.1 pull镜像,需要login

  • docker login 10.0.0.100:5000 登录完了,才能够进行push操作
  • docker push 10.0.0.100:5000/xiaobai/centos:v1
    • 上面已经打了标签了,所以就直接push到仓库中去就可以。
  1. pull到本地,不需要用户登录
  • docker pull 10.0.0.100:5000/xiaobai/centos:v1

image.png

habor实现图像化镜像仓库

  1. 安装
  • docker load -i harbor.v1.5.1.tar.gz
  • 安装docker和docker-compose,yum -y install docker-compose
  • 下载harbor-offline-installer-xxxx.tgz
  • 上传到/opt ,并解压
  • 修改harbor.cfg 配置文件,相关参数
    • hostname = 10.0.0.100
    • harbor_admin_password=123456
  • 执行install.sh
  1. 使用方法
  • 修改配置文件,

    1. vim /etc/docker/daemon.json 添加以下内容
    2. "insecure-registries":["10.0.0.100:5000,"10.0.0.100"],
    3. "live-restore":true 保证重启后,所有镜像都会重启动,因为harbor下的容器数量很多
  • systemctl restart docker

  1. 在harbor中添加项目
  2. 制作镜像并上传harbor,
    • 这次有两个registry,取决于你选择哪个来push
    • docker tag centos:6.9 10.0.0.100/xiaohei/centos:v1
    • docker login 10.0.0.100
    • docker push 10.0.0.100/xiaohei/centos:v1
    • 在harbor仓库里查看,可看到新上传的镜像
  3. 在另一台主机pull镜像,也要修改配置文件,添加上registries的ip, 这里就是10.0.0.100

图片.png

  • docker login 192.168.226.133
  • docker tag nginx:latest 192.168.226.133/projec_001/lzl_nginx:0.0.1
  • docker push 192.168.226.133/projec_001/lzl_nginx:0.0.1 之后在WEB端就能看到上传上去的镜像了
  • 另一台主机上pull测试

图片.png

docker网络类型

本地网络类型

  1. 查看支持网络类型
  • docker network ls
  1. 测试使用各类网络类型
    1. docker run network=xxx
    2. none:无网络模式
    3. bridge:容器的默认模式,相当于NAT。容器内会起一个和docker0同网段的地址,类似于网桥的一个结构。容器内需
    4. 要对外访问时,通过docker0的网桥与eth0之间进行内核,ip_forward进行自动转发出去上网。
    5. host:公用宿主机Network NameSpace,所有hostsip,端口和宿主机是共享的
    6. container:与其他容器公用Network NameSpace
  • docker run -it --name="c_bri1" --network=bridge centos:6.9 /bin/bash
  • docker run -it --name="c_host1" --network=host centos:6.9 /bin/bash

    • 和宿主机公用网络。但是隔离性不好

      跨主机网络

      macvlan实现

  • docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.254 -o parent=eth0 macvlan_1

    • 相当于创建一个通道。使用时,两台容器内的主机要指定不同的地址, —ip=10.0.0.11
  • ip link set eth0 promsic on ubuntu或其他版本需要
  • docker run -it --network macvlan_a centos:6.9 /bin/bash
  • 不能对外上网

    overlay实现

  1. 启动consul服务,实现网络的统一配置管理的功能
  • docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
  1. kc类型的存储数据库(key:value)
  • docker01、02上:
  • vim /etc/docker/daemon.json 添加如下内容
    {
    “hosts”:[“tcp://0.0.0.0:2376”,”unix:///var/run/docker.sock”],
    “cluster-store”:”consul://10.0.0.100:8500”,
    “cluster-advertise”:”10.0.0.100:2376”
    }
  1. 创建overlay网络
  • docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 ol1
  • systemctl restart docker``docker network ls
    • 可以看到,”SCOPE”类型为global全局的
  1. 两边启动容器测试
  • docker run -it --network ol1 --name xiaobai01 busybox /bin/bash
  • 每个容器有两张网卡,eth0实现容器间的通讯,eth1实现容器访问外网
  • 两个容器的eth0,一个是172.16.0.1,一个是172.16.0.2

    底层机制

    1. 存储机制

  1. 镜像的分层机制:
  • 镜像由若干个层组成,每个层就是Dckfile中的一个指令。多个镜像间可以共享基础层,以节约宿主机的存储空间
  • dockerfile里的每一个指令都是镜像当中的一层, docker history nginx/xiaobai:v1.2
  1. overlay2存储驱动
  • docker中所有文件系统都是挂载虚拟出来的,其所有的文件最终都是存储在宿主机,通过overlay2驱动进行管理

    2. 网络机制

    3. 日志机制

    4. 运行机制

补充

  1. docker架构

image.png

  1. 定义
  • client(docker客户端)
    • 是docker的用户界面,接收用户命令和配置标识,并与docker daemon通信
  • images(docker镜像)
    • 是一个只读模板,包含创建docker容器的说明。和系统安装光盘有点像,使用docker镜像可以运行docker镜像中的程序
  • container(容器)
    • 是image的可运行实例。image和container的关系有点类似于面向对象中,类和对象的关系。可通过docker API或者CLI命令来启停、移动、删除容器
  • registry
    • 注册中心。