自动化----docker
1.Docker简介和KVM区别 1.1 历史简介 Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker 是通过内核虚拟化技术(namespaces及cgroups等,这里的内核技术指的是Linux内核哦)来提供容器的资源隔离与安全保证等。由于docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(Virtual Machine Monitor),以及hyperisor)支持,他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求很低。最本质特征docker是通过隔离来进行创建容器,而KVM等均为通过模拟方式创建虚拟机 1.2 优势说明 更快的交付和部署使用docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后, 测试和原味人员可以直接使用完全相同的环境来部署代码,只要开发测试过的代码,就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间 更高效的资源利用 docker 容器不需要二外的徐牛啊管理程序支持,他是内核级的虚拟化,可以实现更高级的性能,同事对资源的额外需求很低 更轻松的迁移和扩展docker容器几乎可以再任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同事支持主流的操作系统发行版本。这种兼容性让用户可以再不同平台之间轻松地迁移应用 1.3 对比KVM docker容器很快,启动和停止可以再秒级实现,而传统的虚拟机需要数分钟,docker容器对系统资源需求很少,一台主机上可以同时运行数百甚至上千个docker容器,docker 通过类似于git的设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新,docker通过dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化 1.4 docker的特性 Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。(一次构建多处运行,像不像JAVA呢)。docker是传统的CS架构分为docker client和docker server,主要分为三大组件镜像(image)、容器(container)、仓库(Repository)。那么docker和我们之前接触的openstack又有什么区别呢?他们的区别如下所示。
2.安装与配置
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm ####配置yum源 yum install docker -y ########安装DOCKER systemctl enable docker ############开机启动 vim /usr/lib/systemd/system/docker.service ####编辑配置文件 ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com\ ####### 修改加速器 ####ystemctl start docker ########开启DOCKER ####systemctl status docker ######## 看DOCKER 状态是否成功 ###################################################################docker镜像搜索,下载,查看,导出,导入操作######################################### #### docker search nginx ###搜索想下载的镜像 ### ####docker pull nginx ########下载nginx镜像 ### #### docker images ########查看下载镜像 ### #### docker save nginx >/tmp/nginx.tar.gz ######导出本地镜像 ### ####docker rmi nginx #########删除镜像 ### ####docker load < /tmp/nginx.tar.gz ####导入本地镜像 ### ##############/var/lib/docker/image/overlay2/layerdb ############默认镜像位置 可以 /usr/lib/systemd/system/docker.service 来设置位置 ### ####日常 --graph=/opt/docker 更换存储目录 dns服务 默认docker是才用宿主机的dns 可以才用 --dns=xxxx的方式制定 docker daemon --help 查看需求帮助 ### ################################################################################################################################################ #####docker run -it --name mynginx nginx sh ####启动一个镜像 可以指定名字 分配个终端 #####docker ps -a ####查看已经启动的镜像和所以镜像 #########小技巧 按住ctrl不放手p q 退出一个容器,容易不会关闭 #####docker rm 62244e6d4104 ####删除一个容器,根据CONTAINER ID来删除,不能删除已经运行的容器,如果要删,只能先停止,,强制删除加 f docker rm -f e2a901f136d9 ##创建在退出的时候删除,生产环境不用docker run -it --rm --name mynginx nginx ####docker inspect mynginx #### 查看容器的详细信息 ####docker exec -it mynginx bash ### 指定进入一个容器 用bash解释器来运行 ####yum install util-linux -y ###可以用脚本进入容器 #!/bin/bash pid=`docker inspect --format "{{.State.Pid}}" $1` nsenter -t $pid -m -u -i -n -p ####docker logs mynginx ####可以查看容器的日志
3.镜像制作
# https://hub.docker.com ########docker 官方下载镜像
# docker pull centos ######下载centos 以centos作为基础
# docker run -it centos bash ########运行一个容器终端
# yum install wget -y ####安装wget 默认没有装
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ####下载yum源做优化
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo ####安装epel源 #yum install nginx -y #####做nginx镜像 #vi /etc/nginx/nginx.conf daemon off; ####前台运行
#docker commit -m 'add nginx images' 源镜像名或者ID mynginx:v1 ####### 根据那个镜像来创建nginx镜像 :v1是根据实际情况来打版本号用 #docker run -d --name mynginx zhaobin/my_nginx nginx ###启动一个容器,名字为mynginx 指定镜像为zhaobin/my_nginx 命令是nginx ########## 网docker官网上传镜像 # docker login ###登录 # docker images ####显示镜像 REPOSITORY TAG IMAGE ID CREATED SIZE zhaobin/my_nginx v1 b554b7de7aba 56 minutes ago 12.2 MB docker.io/mystatus/my_nginx latest 52a45a2aa161 57 minutes ago 12.2 MB zhaobin/my_nginx latest 52a45a2aa161 57 minutes ago 12.2 MB docker.io/nginx latest ae513a47849c 9 days ago 109 MB docker.io/centos latest e934aafc2206 4 weeks ago 199 MB docker.io/bash latest 59507b30b48a 3 months ago 12.2 MB docker.io/alpine latest 3fd9065eaf02 4 months ago 4.15 MB # docker tag 52a45a2aa161 docker.io/mystatus/my_nginx ###把镜像ID打个tag # docker push docker.io/mystatus/my_nginx ####传到仓库 #####docker run -d --name my_nginx -P nginx 端口映射 把nginx镜像端口映射
4.dock 端口映射以及网络管理
######################## # docker commit -m 'add nginx images' 73b798fa70f7 mynginx ######通过 # docker run --name mynginx -d -p 80:80 mynginx nginx ########指定端口映射 想指定UDP 在端口后面加 # docker run --name mynginx -d -p 127.0.0.1:80:80 mynginx nginx #####通过指定IP 或者端口来访问 # docker run --name web1 -d -p 80:80 mynginx nginx ###########建立一个web1容器 # docker run --name web2 --link web1 -d -p 8080:80 mynginx nginx ##建立一个web2容器和web1互通 # docker run -d --name web2 --link web1:shop_web -p 8080:80 mynginx nginx ### 可以指定个show_web别名 # docker run -it --rm --net=host nginx ##########可以指定网络模式为host,默认bridge模式 # vim /usr/lib/systemd/system/docker.service #######可以更改默认的网段 --bip=172.18.42.1/16 加上这个 # systemctl daemon-reload # systemctl restart docker ##############2个主机之间的docker互通 需要加一条路由来指定 例如 rout add -net 192.168.2.0/24 -gw 192.168.1.1 意思我要访问2.0这个网段走1.1这个网关
5.docker数据管理
1.分为数据卷 # docker run -it --name web1 --rm -v /data centos bash #把系统/目录挂载到容器的/data目录 区别是使用/分区 # docker run -it --name web1 --rm -v /opt/:/opt/ centos bash ####意思是创建一个web1容器 退出的时候删除容器 -v指定 把宿主机的opt目录挂载到容器的opt目录 使用centos镜像 bash解释器 ###在生产环境里例如web,宿主机跟新文件了 docker容器也跟新可以被访问 # docker run -it --name web1 --rm -v /etc/hosts:/opt/hosts centos bash ####也可以挂载文件 # docker run -it --name web1 --rm -v /etc/hosts:/opt/hosts:ro centos bash ### 也可以设置为只读 默认权限是可读可写 ,这样的话在容器里不可以卸载 2.数据容器 # docker run -it --name web1 -v /opt/:/opt/ centos bash #### # docker run -it --name web2 --volumes-from web1 centos bash ###意思是数据容器指定为 web1的挂载共用 , 这样可以把web1容器关了或者删除也不影响web2容器使用数据分区 # docker rm -fv web2 #####如果使用了数据容器的方式 要记得删除的时候+v把磁盘释放,否则会把数据盘堆满
6.docker-file 编写
#this is dockerfile for nginx #基础镜像,基于centos做的镜像 FROM centos #维护者信息 MAINTAINER zhao zhao@163.com #相关操作 RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum install nginx -y #添加文件 ADD index.html /usr/share/nginx/html/index.html #参数 RUN echo "daemon off;" >> /etc/nginx/nginx.conf #设置开放端口 EXPOSE 80 #执行命令 CMD ["nginx"] ###docker build -t zhao/nginx /root/ ##执行命令 指定相关信息 以及Dockerfile文件所在路径
7. docker私库搭建
#cd opt #mkdir auth #docker run --entrypoint htpasswd registry:2 -Bbn zhaosir 123456 > auth/htpasswd ##创建一个加密的密码 #docker run -d -p 5000:5000 --restart=always --name registry1 \ -v `pwd`/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry #docker ps # docker login 127.0.0.1:5000 #docker tag d71a151b2c01 127.0.0.1:5000/zhaobin/mynginx ##打包要上传的镜像 #docker push 127.0.0.1:5000/zhaobin/mynginx ##上传
# docker pull 127.0.0.1:5000/zhaobin/mynginx ####下次用到镜像的话 可以从上面下载
8.docker的编排
# yum install python-pip -y #pip install docker-compose #docker-compost version #mkdir /root/comose/ cd /root/comose/ vim docker-compose.yml web1: image: nginx expose: - 80 web2: image: nginx expose: - 80 haproxy: image: haproxy volumes: - /opt/haproxy.cfg:/usr/local/etc/haproxy/haproxy.conf links: - web1 - web2 ports: - "7777:1080" - "80:80" #docker-compose -d up
使用docker安装mysql服务 使用docker官方镜像安装mysql服务 1 拉取mysql镜像,采用网易加速地址 docker pull hub.c.163.com/library/mysql:5.7 2 重命名镜像名 docker tag hub.c.163.com/library/mysql:5.7 mysql:5.7 3 创建用于挂载的目录 sudo mkdir /my/mysql/datadir #用于挂载mysql数据文件 sudo mkdir /my/mysql/conf.d #用于挂载mysql配置文件 sudo chown yaoren:docker /my #修改/my目录拥有者 4 使用镜像创建容器 docker run --name mysql5.7 -p 3306:3306 -v /my/mysql/datadir:/var/lib/mysql -v /my/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 命令解析: --name:容器名 --p:映射宿主主机端口 -v:挂载宿主目录到容器目录 -e:设置环境变量,此处指定root密码 -d:后台运行容器 5 测试是否成功 mysql -h192.168.2.102 -p3306 -uroot -p 参考链接 https://itbilu.com/linux/docker/EyP7QP86M.html