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

一、什么是docker

引用官方说明:Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

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

Docker原理

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

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

为什么使用 Docker

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

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

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

应在何时使用 Docker

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

二、怎么安装docker

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

docker结构再分析

借用一下官方的图,中间是docker引擎和上面的容器应用,左边是cli客户端、同样位于宿主机上,右边是远程仓库(或局域网仓库)
【运维脚手架】之docker
这里有几个概念要补充下:

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

docker安装

Docker发行版有CE社区和EE商业两种版本,CE免费支持周期是7个月,建议采用stable稳定版。
要求宿主机内核最低应不小于3.10版本,这边采用CentOS7最新版示例。

  • 准备好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组合应用,一个文件搞定所有配置,并方便更新和卸载老应用

因网络问题,目前的主流都是使用daocloud的加速方案,DaoCloud/docker-mirror: docker hub mirror, Docker镜像加速器 (github.com)

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的组合使用!
    【运维脚手架】之docker
    总算到了翻代码的时候了,坚持住!

场景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

image-20211015114029297

场景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

写在最后

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

【运维脚手架】之docker

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