转了云方向,代码都少写了

1. 为什么出现Docker

以前开发项目有开发的环境、测试的环境、还有生产的环境,每经过一阶段就要迁移项目。不同的环境有不同的配置,可能导致不可预估的错误,运维要经常性的改动

世界陷入了混乱,于是上帝说,让Docker来吧,于是一切光明。Dokcer 把初始的环境一模一样地复制过来,那么就消除了协作编码时,我的机器能运行,而其他机器不能运行的困境

Docker是基于Go语言的开源项目,Docker可实现应用层的隔离,共享宿主机内核、而虚拟机是隔离系统,连内核,硬件都是各自模拟的

2. Docker的结构

Docker_Host (宿主机):安装了Docker程序的主机,形式为一个守护进程

Client (客户端):连接docker主机进行操作(与守护进程通信)

Registry (仓库):保存各种打包好的镜像(类似Github)

Images (镜像):软件打包好的镜像,放进仓库中(笔者理解为类,可以派生对象)

Containers (容器):镜像启动后的实例成为容器(笔者理解按照类创建的对象)

3. 卸载、安装

3.1 卸载

# 卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engin # 卸载新版本
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd
$ yum remove docker-ce docker-ce-cli containerd.io

主机上的镜像、容器、卷、自定义配置是不会自动删除的需要手动

3.2 配置Docker库

$ yum install -y yum-utils
$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装yum工具包,里面包含yum-config-manager,用来设置yum配置

首次安装Docker需在yum中设置的Docker存储库,之后就可从Docker存储库中安装和更新

3.3 安装

$ yum install docker-ce docker-ce-cli containerd.io

docker-ce引擎(社区免费版)、cli(可远程连接守护进程)、containerd(提供容器管理服务)

3.4 启动

$ systemctl start docker
$ systemctl enable docker
$ docker version # 查看版本

3.5 设置镜像加速

$ vim /etc/docker/daemon.json

# 去阿里云开发平台查看自己的仓库地址
{
"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]
} $ systemctl daemon-reload
$ systemctl restart docker

梯子加速你懂的 —_—

4. 启动案例

下面举几个例子,现在看不懂没关系,看看使用Docker有多快速

4.1 Hello-World

# 输入命令并执行
$ docker run hello-world

阅读运行之后的说明,里面有步骤与相关信息,对理解其原理有很大的帮助

4.2 启动Tomcat

以前运行Tomcat,要安装设置启动jdk、tomcat,期间还需到weget、tar等命令

现在使用了Docker,只需几个命令

# 拉取镜像,不加后面的标签默认拉取最新版
$ docker pull tomcat # 启动容器
$ docker run -d -p 8080:8080 --name mytomcat -v /root/aria2-downloads:/usr/local/tomcat/webapps tomcat # 访问
# 访问结果是404,因为镜像的webapps空的,意思是没有html页面给我们访问
# 其实最新的镜像将wepapps改名为webapps.dist,那么我们只需复制内容过去就可
# 不怕有解决方法,还是按着下面步骤输入:
$ docker exec -it mytomcat /bin/bash
$ cp -r webapps.dist/* webapps
$ exit # 再次访问即可

4.3 启动MySQL

去Docker官网搜索MySQL,跟着其步骤走 MySQL的Docker地址,下面的密码设置官网也都有详细介绍

因为使用Navicat连接时会发生身份验证器错误,所以我们得进去容器修改验证器插件

# 启动并设置密码
$ docker run -d -p 3306:3306 --name howlmysql -e MYSQL_ROOT_PASSWORD=123456 mysql # 进入容器内部
docker exec -it containerId /bin/bash # 登录容器内的MySQL
mysql -uroot -p 123456 # 修改身份验证插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 刷新权限
flush privileges;

4.4 启动Aria2

一个基于命令行的下载工具

# Aria2本体
$ docker run -d \
--name aria2-pro \
--restart unless-stopped \
--log-opt max-size=1m \
-e PUID=$UID \
-e PGID=$GID \
-e UMASK_SET=022 \
-e RPC_SECRET=<secret> \
-e RPC_PORT=6800 \
-p 6800:6800 \
-e LISTEN_PORT=6888 \
-p 6888:6888 \
-p 6888:6888/udp \
-v $PWD/aria2-config:/config \
-v $PWD/aria2-downloads:/downloads \
p3terx/aria2-pro # Web界面
$ docker run -d \
--name ariang \
--log-opt max-size=1m \
--restart unless-stopped \
-p 6880:6880 \
p3terx/ariang

5. 常用命令

5.1 帮助命令

$ docker version
$ docker info # 更详细信息,客户端,服务器运行状况
$ docker [命令] --help # 帮助命令

5.2 镜像命令

$ docker pull name[:tag]     # 拉镜像
$ docker rmi name|id # 删镜像
$ docker images # 列出本地镜像
$ docker search # 官网查找镜像

5.3 容器命令

# 新建并启动容器
$ docker run [可选参数] image
--name # 重命名
-d # 守护容器后台
-p # 端口映射
-v # 文件挂载
-i # 交互模式
-t # 分配一个伪终端,后面跟分配的终端 /bin/bash
-e # 环境配置
--rm # 用完就删包括卷,测试用(docker run --rm -it -p 80:80 nginx)
--restart=always # docker重启,容器也会跟着启动 # 列出正在运行的容器
$ docker ps [可选参数]
-a # 显示包括未运行的
-l # 显示最近创建的容器
-n # 显示最近创建的n个容器
-q # 只显示id # 生命周期命令
$ docker start name|id
$ docker restart
$ docker stop
$ docker kill
$ docker rm [-f] # 强制删除运行中的容器 # 容器交互命令
$ docker exec # 在运行的容器里执行命令
$ docker exec -it id /bin/bash # 进入容器开一个新的终端,exit后不会停止容器运行
$ docker attach id # 进入正在执行的终端
$ ctrl + P + Q # 交互中容器不停止退出
$ docker exit # 交互中停止容器并退出 # 快捷操作
$ docker container prune 删除所有容器
$ docker rmi $(docker images -q) 删除所有镜像
$ docker rm $(docker ps -aq)

5.4 其他命令

$ docker logs id		# 查看容器的日志
$ docker top id # 查看容器里运行的进程
$ docker inspect id # 查看镜像详细信息(层、挂载目录)
$ docker cp id:容器路径 宿主机路径 # 拷贝容器文件到宿主机
$ docker cp 宿主机路径 id:容器路径 # 拷贝宿主机文件到容器
$ docker volume create|inspect|ls|prue|rm # 数据卷操作
$ docker build id # 由dockerfile生成镜像
$ docker history id # 查看镜像如何构建
$ docker save id # 备份镜像成.tar文件
$ docker load id # 加载备份镜像.tar文件,建议上传仓库

6. Dockers和虚拟机的区别

6.1 虚拟机

模拟出完整的计算机系统(Guest OS),模拟的系统都是完全隔离的,且运行在监视器(Hypervisor)中,这个监视器是软件、硬件或固件

Infrastructure (基础设施):是硬件设施,理解为主机,即笔记本,云服务器

Host Operating System (主机操作系统):是主机的物理操作系统,即日常说的操作系统,Linxu、Windows

Hypervisor (虚拟机监视器):是运行在基础物理服务器和虚拟操作系统间的中间软件层,各应用和虚拟系统可共享硬件

Guest OS (宿主系统):虚拟的操作系统,虚拟机内部运行的操作系统,有完整的硬件和内核(Docker是共享)

Bins/Libs (命令/资源):二进制命令和资源库

APP (应用程序):用户安装的程序

缺点:要运行几个隔离的应用,就要监视器启动几个宿主系统,也就是几个虚拟机。虚拟机模拟了多个隔离的系统,占用了很多的硬盘、CPU、内存,所以启动也很缓慢。

6.2 Docker

Docker是运行容器的引擎,我们将 操作系统的基础库文件、应用程序、所需的依赖等打包到镜像中,然后通过镜像创建容器(类和对象),而容器就在Docker中运行

Docker Daemon (守护进程):守护进程取代Hypervisor,是个进程,负责管理Docker容器

守护进程与宿主机通信,为容器分配资源

使用宿主机的硬件资源,无需虚拟化硬件资源,所以容器无需加载内核,因此是秒级

Docker使用了cgroup + namespace,前者限制资源集,后者限制可访问权限

Docker是Client-Server结构,守护进程在宿主机上,客户端socket连接进程管理运行在主机上的容器

6.3 对比

虚拟机:彻底隔离整个运行环境,每个运行的虚拟系统都是完全隔离的

Docker:隔离不同的应用程序,比如数据库,后端,前端等

比对项 Container(容器) VM(虚拟机)
启动速度 秒级 分钟级
运行性能 接近原生 有所损失
磁盘占用 MB GB
数量 成百上千 一般几十台
隔离性 进程级别 系统级别
操作系统 只支持Linux 几乎所有
封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统

7. 图形化界面

笔者了解到的图形化管理工具是Portainer,也是在Docker上运行的程序,建议跟着仓库文档走

# 必须挂载
$ docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

具体各位去摸索一下把~

8. 镜像 image

镜像一种轻量级、可执行的独立软件包,用来打包软件的运行环境和基于运行环境开发的技术。它包含运行某个软件需要的所有内容(包括代码、运行库、环境变量和配置文件)

8.1 联合文件系统

联合文件系统(UnionFS):是一个分层的、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加(类似Git),同时可以将不同目录挂载到同一虚拟文件系统下(-v 文件挂载)

UnionFS是Docker镜像的基础,镜像可以通过分层来进行继承(分层可以共用),基于基础镜像可以制作各种具体的应用镜像

一次同时加载多个文件系统,但从外面看只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层文件和目录

8.2 镜像加载原理

Docker使用UnionFS进行分层,底层是bootfs文件系统(bootloader加载最基础的内核、kernvel)

bootfs的上一层是rootfs,也就是 /dev,/bin,/etc等标准目录和文件

不同的镜像中有相同的分层,那宿主机只需在磁盘、内存中保存一份,这些镜像共享这些分层

8.3 镜像层的叠加

假如我们在Docker上安装tomcat,首先底层是bootfs层,然后在上面安装centos (rootfs),意思是修改了文件系统,那就会叠加一层文件系统、依次类推,还有jdk8层、tomcat层。最终打包成tomcat这个镜像,对外则是一个整体

镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部(容器层,之下叫镜像层)

若我们在容器层删除了文件,那么会生成一个wihteout文件,将对应的下层文件隐藏掉

8.4 提交生成镜像

上面tomcat的案例我们已经修改过webapps的内容,因修改了联合文件系统,所以可作为一次提交来层层叠加

# 提交到本地仓库,没有add行为了
# name[:tag] 是 自己命名的 镜像名[tag] 作为镜像名
$ docker commit -m "提交信息" -a "作者" id name[:tag]
# eg:
$ docker commit -m "add webapps files" -a "Howl" 9c8524bxxxx mytomcat:1.0 # 然后就可看到自己打包的镜像了
$ docker images

9. 数据卷

数据卷(volume)是由docker挂载到容器(不属于UFS)存在于一个或多个容器中的目录或文件,因此能绕过UFS一些用于持续存储或共享数据的特性

卷的出现是为了数据的持久化和同步操作,其完全独立于容器的生存周期,因此在删除容器时其挂载的数据卷不会被删除。简单来说:使容器和宿主机共享独立于docker生命周期的数据、亦或者:独立于docker生命周期的目录挂载

特点:

  • 数据卷可以容器之间共享或重用
  • 卷中的更改直接生效
  • 卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期持续到没有容器使用为止

9.1 具名、匿名挂载

数据卷的默认地址 /var/lib/docker/volumes/xxx

$ docker run -v /宿主机绝对路径:/容器内目录 name[tag]	# 具名挂载(不加"/",在默认地址下起个名字而已)
$ docker run -v /容器内目录 name[tag] # 匿名挂载,宿主机用默认地址(会生成唯一的32位id) # 还有只读,读写权限
$ docker run -v /宿主机绝对路径:/容器内目录:ro|rw name[tag] # 还有先创建数据卷,后面再挂载
$ docker volume create mysql_data
$ docker run -d -p 3306:3360 -v mysql_data:/root/mysql_data

9.2 Dockerfile挂载

这里说明有这种挂载方式,什么是dockerfile下面会讲

$ FROM centos

# 没有"/",是匿名挂载,宿主机的默认地址
# 容器内直接在根目录下
$ VOLUME ["volume01","volume02"] $ CMD echo "----Howl write dockerfile----" $ CMD /bin/bash

9.3 容器数据卷

容器数据卷是用于容器间的数据共享,操作方式还是命令行: --volume-from

# centos01就叫数据卷容器
$ docker run -d --name centos01 howl/centos:1.0 $ docker run -d --name centos02 --volume-from centos01 howl/centos:1.0

这是数据卷,不和容器同生命周期,所以哪怕父容器删了,其余容器也能访问同步

10. Dockerfile

Dockerfile是有一系列命令和参数的脚本,通过这个脚本我们可以构建一个镜像

10.1 Dockerfile指令

指令必须都是大写,从上往下执行,且每个指令都会创建一层(可用&&将命令连起来只生成一层)

命令 语法 解释
FROM FROM image[:tag] 指定基础镜像,必须第一条。FROM scratch表示不以任何镜像为基础
MAINTAINER 维护者信息
RUN 镜像构建时需要执行的命令
ADD 复制本地压缩文件,会自动解压
WORKDIR 镜像工作目录
VOLUME 设置容器卷
EXPOSE 指定堆外端口
CMD 指定容器运行中的命令,会被覆盖
ENTRYPOINT 指定容器启动时运行的命令,可以追加命令
ONBUILD 当构建一个被继承Dockerfile时会运行该指令
COPY COPY 宿主文件地址 容器文件地址 将文件拷贝到镜像中
ENV 构建时设置环境变量

10.1 编写Dockerfile

举例做个tomcat镜像,需要准备tomcat压缩包、jdk压缩包、readme文件

$ FROM centos
$ MAINTAINER howl $ COPY readme.txt /usr/local/readme.txt
$ ADD jdk-8u291-linux-x64.tar.gz /usr/local
$ ADD apache-tomcat-8.5.68.tar.gz /usr/local $ RUN yum -y install vim $ ENV MYPATH /usr/local
$ WORKDIR $MYPATH # JAVA_HOME 目录安装之后才知道
$ ENV JAVA_HOME /usr/local/jdk1.8.0_291
$ ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
$ ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.68
$ ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.68
$ ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib $ EXPOSE 8080 $ CMD /usr/local/apache-tomcat-8.5.68/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.68/bin/logs/catalina.out

每条指令都会创建一个新的镜像层,并对镜像进行提交

若构建名为Dockerfile那么就会自动查找,不用-f去指定了

Docker运行得有前台应用在运行,不然会自动结束,tail就是为了前台运行,比如top等命令

注意:根据linux位数,arm,aarch64来安装jdk,笔者安装错了,走了很多弯路

10.2 Build制作镜像

# -f 指定dockerfile的路径
# -t 生成的镜像名字[:tag] 生成镜像的地址
# . 表示当前目录
$ docker build -t howl/tomcat .

10.3 运行制作的镜像

$ docker run -d -p 8080:8080 howl/tomcat

有个注意的地方,webapps下要新建目录才能访问的,不能放入已有文件夹内,也不能直接放入webapps里面

10.4 发布镜像

镜像的发布有两种途径,分别是:

  • DockerHub
# 首先需要登录
$ docker login -u loadingkiller
$ Password: "输入密码" # 推送名字得是自己DockerHub上的账号名,所以得先改标签
# 本来 howl/centos 改成 loadingkiller/tomcat
$ docker tag howl/tomcat:latest loadingkiller/tomcat:1.0 # 推送,速度慢等吧
$ docker push loadingkiller/centos:1.0
  • 阿里云镜像仓库

进入阿里云镜像管理可以创建镜像仓库,然后跟着里面的提示走

# 登录
docker login -u=XXX registry.cn-hongkong.aliyuncs.com # 选择分支对应关系
docker tag [ImageId] registry.cn-hongkong.aliyuncs.com/howlet/mytomcat:[镜像版本号] # 推送上去
docker push registry.cn-hongkong.aliyuncs.com/howlet/mytomcat:[镜像版本号] # 拉取
docker pull registry.cn-hongkong.aliyuncs.com/howlet/mytomcat:[镜像版本号]

重学Docker的更多相关文章

  1. 重学hadoop技术

    最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...

  2. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  3. 重学OpenGL(一)----工具篇

    最近想开发一个小工具,需要用到3D,果断上OpenGL,借这个过程把OpenGL重学一遍. 工欲善其事,必先利其器,先把工具都搞好. [开发语言] 果断C+OpenGL,不解释. [开发环境] Min ...

  4. 重学C++ (1)

    写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...

  5. 推翻自己和过往,重学自定义View

    http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...

  6. 重学C语言---01概述

    1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...

  7. 小白学Docker之Compose

    承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 概念 Compose是一个编排和运行多容器Docker应用的工具,主要是 ...

  8. 小白学Docker之Swarm

    承接上篇文章:小白学Docker之Compose,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之基础篇 小白学Docker之Co ...

  9. 【重学计算机】操作系统D3章:存储管理

    1. 存储管理的基本概念 逻辑地址:用户地址,从零开始编号 一维逻辑地址:(地址) 二维逻辑地址:(段号: 段内地址) 主存储器的复用方式 按分区:主存划分为多个固定/可变分区,一个程序占一个分区 按 ...

随机推荐

  1. Android开发Activity全局切换的动画效果

    切换动画 slide_left_in.xml 从左边进 --> 退出的时候使用 <?xml version="1.0" encoding="utf-8&quo ...

  2. Step By Step(Lua表达式和语句)

    Step By Step(Lua表达式和语句) 一.表达式:    1. 算术操作符:    Lua支持常规算术操作符有:二元的"+"."-"."*& ...

  3. Yolov3 的 OneFlow 实现

    Yolov3 的 OneFlow 实现 1.简介 YOLO 系列的算法(经典的v1~v3),是单阶段目标检测网络的开山鼻祖,YOLO-You only look once,表明其单阶段的特征,正是由于 ...

  4. 目标检测数据集The Object Detection Dataset

    目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...

  5. 5G和AI机器人平台为工业4.0和无人机提供服务

    5G和AI机器人平台为工业4.0和无人机提供服务 Qualcomm 5G and AI robotics platform delivers for Industry 4.0 and drones 高 ...

  6. thymeleaf——th:each、th:if的使用

    一.th:each 作用:用于遍历controller层发送过来的集合. 例: Controller代码: @Controller public class HelloController { @Re ...

  7. 九、配置Tomcat集群

    配置Tomcat集群所需服务器三台:192.168.1.5(调度服务器).192.168.1.10(WEB1),192.168.1.20(WEB2) 1.调度服务器设置 [root@proxy ~]# ...

  8. 【NX二次开发】Block UI 双精度表

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  9. lsnrctl start 报错

    lsnrctl start报错: TNS-12541:TNS:no listener TNS-12560:TNS:protocol adapter error TNS-00511:No listene ...

  10. Android一个炫酷的树状图组织架构图开源控件实现过程

    Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...