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

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. Java反射机制详情(2)

    | |目录 运行环境 Java语言的反射机制 Class中的常用方法(获得类的构造方法) Class中的常用方法(获得类的属性) Class中的常用方法(获得类的方法) 反射动态调用类的成员 1.运行 ...

  2. 为Go项目编写Makefile

    为Go项目编写Makefile 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程. make介绍 make是一个构建自动化工具,会在当前目录下寻 ...

  3. Python+Selenium - 三种等待方式

    元素:存在 > 可见 > 可用 需要判断元素状态 等待方式1:强制等待  -- 辅助 设置等待几秒,就必须等待几秒 示例: from time import sleepsleep(3) 强 ...

  4. Jmeter- 笔记7 - 服务器监控(ServerAgent配置)

    文件:ServerAgent - 2.2.3.zip  放网盘了 在服务器的操作:只需要把这个文件上传到被监控服务器,然后解压,启动sh startagent.sh --udp-port 0 --tc ...

  5. 旷视MegEngine基本概念

    旷视MegEngine基本概念 MegEngine 是基于计算图的深度神经网络学习框架. 本文简要介绍计算图及其相关基本概念,以及它们在 MegEngine 中的实现. 计算图(Computation ...

  6. AI芯片体系结构目标图形处理

    AI芯片体系结构目标图形处理 AI chip architecture targets graph processing 可编程图形流处理器(GSP)能够执行"直接图形处理.片上任务图管理和 ...

  7. 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入

    什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...

  8. Redis 入门权威指北

    前言 看看业务遇到了什么问题? 我们要从互联网架构的演变之路开始说起Redis的前世今生. 在我们小的时候,网络世界好像就是只有通过大屁股台式机才能进入一样,彼时的手机只是用来打打电话,发发短信,网上 ...

  9. 04:全局解释器锁(GIL)

    1 全局解释器锁(GIL) 0 pypy(没有全局解释器锁) cpython(99.999999%)    -pypy python好多模块用不了,1 全局解释器锁,GIL锁(cpython解释器的问 ...

  10. Java学习——强调一下编程风格

    讲完了Java的基础语法,大家就可以编写简单的程序代码了,这里有必要强调一下编程风格. 代码风格虽然不影响程序的运行,但对程序的可读性却非常重要.自己编写的程序要让别人看懂,首先在排版方面要非常注意. ...