运维脚手架之docker

Posted 明码实架

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维脚手架之docker相关的知识,希望对你有一定的参考价值。

以前有句玩笑话,JAVA是跨平台的,一次编写,到处编译!诚然,java的程序在部署方面是比较复杂和难以调试的,如果是多地部署要考虑的东西很多,而打包成一个镜像,连操作系统都是完全统一的,这样在99%的情况下是可以做到一次编译到处运行的,用法简单、非常的爽

一、什么是docker

简单讲就是,Docker让基础设施像应用程序般轻松管理方便快速进行集成、测试和封装,极大的减少交付的延误

Docker原理

前面该吹的都吹了,这边不讲深奥原理(主要也没翻过源代码,讲不出来),docker其实也是一个虚拟机的变种,类似更高级的程序,用java术语讲,封装、抽象更具体,操作系统层面的文件能共用的都共用了,所以整体容量更小,占用更少资源。

下图是容器化和虚拟化的结构对比图,docker的运行单位是容器,运行在docker引擎上,主要依赖linux内核特性,可以部署很多平台上,但docker engine上只能跑 linux容器!

为什么使用 Docker

从商业角度来说,主要是快,天下武功唯快不破,这可以解决(忽略)很多问题!

另外,docker的设计思想是一个容器一个应用,最好是无状态的,这样在削峰填谷的时候可以全自动的伸缩!

完全微服务的理念,所以几乎是标配!当然,超密集应用还有更大生态圈,不是仅仅一个docker能解决的!

应在何时使用 Docker

如果开始考虑上微服务、迭代非常迅速,甚至一日多更,完全建议上docker!大不了最终交付改传统模式即可。

二、怎么安装docker

上文讲解了docker的设计和使用理念,这边补充下docker的使用结构

docker结构再分析

借用一下官方的图,中间是docker引擎和上面的容器应用,左边是cli客户端、同样位于宿主机上,右边是远程仓库(或局域网仓库)

这里有几个概念要补充下:

  • 容器是docker运行的最小单位,资源来自于镜像,与镜像的区别在于有差异化文件,如程序jar、配置信息等,是有运行时态的数据沉淀,当容器删除时,内在数据被删除!
  • 镜像来源于仓库,分层存储(复用、减少容量、不深究),最原始的镜像只是个小型化的OS,常见的镜像在这上面增加应用,形成新的镜像,如搭载nginx的web应用镜像
  • 仓库,中央公共仓库来自于官方,因网络质量和数据安全等原因,可在局域网搭建私有化仓库,常见有官方的Registry和Vmware公司的Harbor等产品。
  • 数据卷,前面说了docker的设计理念,希望容器是无状态的,这些有状态的数据文件就通过数据卷挂载到容器中,容器的销毁、克隆不影响也可复用!

docker安装

  • 准备好centos服务器/虚拟机后,这里更新系统和docker的源为阿里云的官方源,并安装docker-ce、设置开机自启、关闭防火墙等一系列操作!
cd /etc/yum.repos.d/  
rename .repo .repbak ./*  

wget -O /etc/yum.repos.d/aliyun-centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo  

wget -O /etc/yum.repos.d/aliyun-centos-docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  

yum clean all  
yum makecache fast  
yum update -y  
yum repolist  

yum install -y yum-utils device-mapper-persistent-data lvm2  
yum install -y docker-ce  

systemctl stop firewalld  
systemctl disable firewalld  
systemctl enable docker  
systemctl start docker
mkdir -p /etc/docker  
tee /etc/docker/daemon.json <<-EOF  
  
"registry-mirrors": ["https://XXXXXXX.mirror.aliyuncs.com"]  
  
EOF  
systemctl daemon-reload  
systemctl restart docker  
docker --version
  • docker-compose安装
    docker compose主要用来稍大一些应用的组合使用,比如web+mysql组合应用,一个文件搞定所有配置,并方便更新和卸载老应用
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

三、拉个web应用玩玩

这边将做三个不同的场景演示:

  • 传统拉镜像、挂载html文件目录、启动应用并访问
  • 使用docker file脚本,打成镜像,存放在本地仓库,并拉取执行,这是制作自己专属产品镜像的方法
  • 使用compose脚本,组合使用,方便后期更换版本、调整配置,更高级的做法!
  • 最后补充了dockerFile和compose的组合使用!

    总算到了翻代码的时候了,坚持住!

场景1:hello world

docker pull nginx:stable
docker run -it --rm -d -p 8081:80 --name web -d nginx:stable

mkdir -p /usr/local/docker/nginx_docker/html
echo "<center>风里雨里,我们在厦门等你!</center>" > /usr/local/docker/nginx_docker/html/index.html

docker run -it --rm --name web\\
       -v /usr/local/docker/nginx_docker/html:/usr/share/nginx/html \\
       -p 8081:80 \\
       -d nginx:stable

docker stop web

场景2:dockerFile

# prepare
docker pull nginx:stable

mkdir -p /usr/local/docker/nginx_docker/html
cd /usr/local/docker/nginx_docker/
echo "<center>hello world</center>" > /usr/local/docker/nginx_docker/html/index.html

tee Dockerfile <<-EOF
FROM nginx:stable
MAINTAINER linzhihui <linzhihui@hotmail.com>
COPY ./html/index.html /usr/share/nginx/html
EOF

docker build -t mynginx:v1.0.1 .
docker tag mynginx:v1.0.1 mynginx:latest

docker run -it --rm --name web\\
       -p 8081:80 \\
       -d mynginx:latest

docker stop web

场景3:compose

mkdir -p /usr/local/docker/nginx_docker/html

echo "<center>hello linbaba2</center>" > /usr/local/docker/nginx_docker/html/index.html

tee /usr/local/docker/nginx_docker/docker-compose.yml <<-EOF
version: "3.1"
services:
  nginx:
    image: nginx
    volumes:
      - ./html:/usr/share/nginx/html
    ports:
      - "8082:80"
    environment:
      - NGINX_HOST=foobar.com
      - NGINX_PORT=80
    container_name: nginx
EOF

cd /usr/local/docker/nginx_docker/

docker-compose up -d  # -d后台启动
docker-compose down # 停止容器并移除

docker-compose stop  # 停止
docker-compose start # 启动
docker-compose restart # 重启

场景4:Dockerfile和compose组合使用

这里用到了非markdown标准语法,主要是好看,自用,所以截了个图,供参考!

写在最后

好的工具、稳定的开发环境可以大幅提高工作效率,作者将自己日常积累的经验分享出来希望能帮助更多的朋友!

【求评论、求点赞、求收藏】

以上是关于运维脚手架之docker的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——Docker三剑客之Docker Machine

新IT运维时代 | Docker运维之最佳实践-下篇

新IT运维时代 | Docker运维之最佳实践-下篇

Linux企业运维——Docker三剑客之Docker Swarm

Linux企业运维——Docker三剑客之docker-compose

企业运维容器之 docker 网络