[TOC]
2 Docker
一:概念
Docker-------容器虚拟化技术

从0到1(从无到有)
从1到1.5(提升)<---------Docker
从1到2(2迭代1)
1)云计算服务模式
IAAS:基础设施即服务
PAAS:平台即服务
IAAS--->虚拟机--->运行安装脚本--->用户访问环境
IAAS--->虚拟机--->运行封装好环境的镜像--->用户访问环境采用docker提供的环境
SAAS:软件即服务
2)Docker诞生:
1、2010年dotcloud公司诞生dotcloud产品
2、2013年10月dotcloud改名Docker
3)Docker发展历程:
1、Linux container 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
2、Docker是PAAS提供商dotcloud开源的一个基于LXC(Linux container)的高级容器引擎
-
开发语言分类
低级、高级语言分类:
低级语言:接近硬件
高级语言:接近用户
编译、解释语言分类:
编译型语言:golang、C、C++
源码--->编译器--->可执行程序
解释型语言:shell、PHP
源码--->解释器(边解释,边运行)
-
Docker版本
企业版(类似RedHat)(美国实体清单制裁)
社区版(类似CentOS)
-
Golang语言
google开发的高级语言,编译型语言
-
开发语言单核、多核调用能力排序
单核心调用能力:
C > Golang > java > Python
多核心调用能力:
Golang > C - java > Python
3、Docker------类比--------海运
集装箱(运行环境)---------------类比-----------ESXI的OVF模板
系统环境、应用环境
-
Docker与传统虚拟化对比
| 对比项 | 容器级虚拟化 | 传统虚拟化 |
|---|---|---|
| 代价 | 低 | 高 |
| 安全性 | 安全性不及传统虚拟化,但安全性处于及格状态 | 安全 |
| 资源消耗率 | 低 | 高 |
| 生命周期 | 部署代价低,生命周期低 | 部署代价高,生命周期高 |

4)Docker三要素
容器的内核共享与物理机
1、容器
(类比传统虚拟化的虚拟机)
部署代价低,生命周期低
2、镜像
(类比传统虚拟化的操作系统镜像)
封装:
系统环境
应用环境
只有系统环境(称为基础镜像)
3、仓库
(类比传统虚拟化,CentOS官方的镜像下载服务器)
hub.docker.com
-
Linux发行版
Linux kernel一样
拓展:魔改内核
(额外内核相关功能)BBR + Linux kernel = 魔改内核
BBR:谷歌开发的一种TCP拥堵算法,高并发情况下,能提高当前网络吞吐量
5)Docker运行环境
CentOS服务器
C7系统
内核:大于等于4.x(学习阶段3.x足够)
Kubernets阶段采用4.x
Ubuntu 图形化(正常运行Docker)
6)耦合性与解耦性
软件开发采用微服务(为了解耦性)
耦合性:相互之间产生影响


UFS:squid (Unix file system)
UFS:Union file system (Docker 联合文件系统)
上层优先级大于下层
-
容器的镜像也是通过联合文件系统,进行使用的
容器在运行时,会在顶部添加一个可写层

-
面试题
docker images 显示当前物理机拥有的所有镜像
镜像名 版本号 镜像 ID 创建时间 总大小
nginx v1 xxxx xxxx 500MB
tomcat v1 xxxx xxxx 800MB
xmysql v1 xxxx xxxx 200MB
实际当前所有的镜像占用物理存储的空间有多少,下面是多选哪些答案存在可能(CDEFG)
A、100MB B、200MB C、800MB D、900MB E、1000MB F、1100MB G、1500MB H、1600MB
解题:
UFS:镜像的重用性
极值:
最小可为800MB
最大可为1500MB
二:安装
1)三种安装方式
(本质:都是二进制包安装,golang可执行文件自包含运行环境)
# 1、脚本安装:(利用官方脚本,安装最新版)
yum update
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker
docker run hello-world
# 2、配置yum仓库,yum安装
yum update
cat >/etc/yum.repos.d/docker.repo << EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum install docker
# 3、rpm安装:下载rpm本地安装 (√)
注意:下载的是主要rpm包,安装过程中需要配置网络源
2)安装步骤
1、前提环境:
关闭firewalld工具,启用iptables工具,防火墙规则为空
[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# systemctl status iptables
[root@localhost ~]# iptables -L
2、yum安装下载的rpm包(前提:网络源能用)
[root@localhost ~]# ls
anaconda-ks.cfg docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
[root@localhost ~]# yum -y install docker-ce-*
3、docker设置开机自启动
[root@localhost ~]# systemctl enable docker
4、重启虚拟机
[root@localhost ~]# reboot
配置docker(不用重启,即可让docker运行)
拓展:br_netfilter 内核模块
让经过网桥的流量必须经过防火墙处理(加上此模块节点不用重启,即可让docker运行)
$ modprobe br_netfilter # 加载模块
$ modprobe -r br_netfilter # 移除
5、配置docker仓库加速器(Daocloud 或 阿里云)
docker配置文件:
/etc/docker/daemon.json
/usr/lib/systemd/system/docker.service
ctrl+鼠标左键 点击 配置docker仓库加速详细步骤
原理:利用国内本地代理服务器,访问国外的docker仓库
阿里云可用的registry地址:https://kfp63jaj.mirror.aliyuncs.com
6、检查配置
[root@localhost ~]# docker info #检查配置是否成功,是否有registry项指向代理服务器
[root@localhost ~]# docker info |grep -i registry
Registry: https://index.docker.io/v1/
[root@localhost ~]# docker run hello-world #检查docker是否正常安装,是否能运行hello-world

三:Wordpress 博客系统
WordPress 运行环境需要如下软件的支持:
PHP 5.6 或更新软件
MySQL 5.6 或 更新版本
Apache 和 mod_rewrite 模块
容器运行的命令:
$ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
$ docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
命令解释:
格式: docker run 选项 值 镜像名
--name db #运行容器,将容器命名为db(若不指定容器名称,默认随机生成名称)
--env 变量名:值 #给容器内部添加环境变量(可添加多个)
-d #将容器放入,当前运行终端的后台运行
--link db:mysql #将db容器地址写入容器中,mysql表示db的别名
-p 8080:80 #将真实机的8080端口映射到容器的80端口
注意:wordpress的访问
前台:http://192.168.20.201:8080
后台:http://192.168.20.201:8080/wp-admin
-
容器如果要持续运行,必须要有前台进程
容器运行时,在真实机看来,相当于运行了一个进程
若运行容器时,没有指定的镜像,则会自动下载
-
容器改变了软件的交付方式
搭建Wordpress博客系统
#前提:搭建好docker,再运行以下两条命令即可
$ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
$ docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
#进容器、创建wordpress数据库,用户,并授权
[root@localhost ~]# docker exec -it db /bin/bash #进入db容器
root@23ce97c396dc:/# mysql -uroot -pexample #利用创建db容器的命令,登录数据库
MariaDB [(none)]> create database wordpress; #创建wordpress库
MariaDB [(none)]> grant all on *.* to 'wordpress'@'%' identified by '123456'; #授权wordpress用户
MariaDB [(none)]> flush privileges; #刷新权限
ctrl+鼠标左键 点击 浏览器安装wordpress---详细步骤
四:Docker容器管理
Docker基本概念:仓库、镜像、容器
Docker 指令的基本用法:
docker + 命令关键字(COMMAND) + 一系列的参数
1、Docker基础命令
1)基础命令
(1)docker info
$ docker info #显示docker的所有信息
Server Version: 17.03.0-ce #使用的docker版本:17.03.0-ce
Storage Driver: overlay #存储驱动为:overlay
拓展:
UFS 联合文件系统 Web服务器
(√)overlay 3.1xx nginx
DM apache
(2)docker search
$ docker search 镜像名 #查询镜像(也可用GUI图形化界面搜索)
$ docker search nginx
-
拓展:镜像的命名规则
镜像的命名规则: 镜像仓库地址/用户名(租户名)/仓库名:版本号 例:hub.c.163.com/public/centos:7.2-tools 例: nginx (完整表示: docker.io/library/nginx:latest) 若不指定仓库地址,默认使用 docker.io 若不指定用户名(租户名),默认使用 library 若不指定版本号,默认使用 latest (人为规定的最新稳定版,并非稳定版) 仓库地址: hub.docker.com #官方仓库 c.163yun.com/hub#home #网易仓库
-
图形化界面查询、下载镜像
ctrl+鼠标左键 点击 进入官方查询并下载镜像(mysql)--详细步骤
(3)docker pull
$ docker pull 地址 #下载镜像
$ docker pull hub.c.163.com/public/centos:7.2-tools #下载163的centos工具:
自带了前台进程
软件工具非常丰富
$ docker pull mysql
拓展:解释官方仓库中的官方:可以上传镜像、自定义图标等功能
docker 官方
nginx 官方
等。。
(4)docker images
$ docker images #查看本地镜像
$ docker images --no-trunc #查看本地镜像,显示完整信息
$ docker images
镜像名 版本号 id号 创建时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 3218b38490ce 12 months ago 516 MB
hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
hub.c.163.com/public/centos 7.2-tools 4a4618db62b9 5 years ago 515 M
(5)docker rmi
$ docker rmi 镜像名:版本号 #删除镜像
$ docker rmi 镜像id号 #删除镜像(可用前几位确定镜像,一般用前三位)
$ docker rmi -f 镜像id号 #强制删除镜像
(6)docker ps
$ docker ps #显示当前正在运行的容器
$ docker ps -a #显示所有容器(包括未运行的)
容器id 镜像名或镜像id 容器启动时,默认的启动命令 创建时间 当前状态 端口相关信息 当前容器名
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注意:若创建容器时,不指定容器名,则会随机生成一个容器名
$ docker ps -a --no-trunc #查看所有容器,显示完整信息
$ docker ps -a -q #简要化输出所有容器,仅列出所有容器的id
(7)docker run
$ docker run 选项 镜像名 #创建并运行容器
选项:
--name 容器名 #容器命名
-d #放入当前终端的后台运行
(8)docker stop|start
$ docker stop 容器名 #停止容器
$ docker start 容器名 #启动容器
(9)docker rm
$ docker rm 容器名 #删除容器(需要停止容器)
$ docker rm -f 容器名 #强制删除容器(不需要停止容器,即可删除,慎用)
注意:docker命令
- docker命令支持变量解析
$ docker run --name test1 -d hello-world #创建一个test1容器
01e5fc8665cc3120b19898e5c67f7155f3e6dd950162bf6c019cb6758e120b1f
$ CNAME=test1 #在当前终端定义一个CNAME变量
$ docker ps -a #检查有test1容器运行
$ docker rm -f $CNAME #使用变量删除容器
test1
$ docker ps -a #再次检查,test1容器删除成功
- docker命令支持命令嵌套
场景需求:删除所有容器
实验思路:将所有容器id截取出来,再利用 docker rm -f id号 删除
$ docker ps -a -q #列出容器的id号
$ docker rm -f $(docker ps -a -q) #命令嵌套式,强制删除所有容器
写一个脚本(方便每次直接删除所有容器)
$ vim /usr/bin/cc
$ cat /usr/bin/cc
#!/bin/bash
/usr/bin/docker rm -f $(/usr/bin/docker ps -a -q)
$ chmod a+x /usr/bin/cc
注意:批量清理临时镜像文件
# -f 表示过滤器;dangling=true 表示仅列出临时镜像
$ docker rmi $(docker images -q -f dangling=true)
2)单一容器管理
-
docker inspect
$ docker inspect 容器名或id号 #查看容器的详细信息-
拓展:init格式与json格式
init格式: [db] addr=192.168.20.201 port=3306 [web] addr=192.168.20.202 port=80 json格式: 格式工整(常用于机器之间的数据传输) { "db":" "addr":"192.168.20.201", "port":"3306" ", "web":" "addr":"192.168.20.202", "port":"80" " }
-
-
docker logs
$ docker logs 容器名或id号 #查看容器,在前台进程输出的信息(并非容器内部运行的日志信息) /usr/local/nginx/sbin/nginx (前台进程) /usr/local/nginx/sbin/nginx (后台进程) && tail -f /usr/local/nginx/logs/access.log -
docker stats
$ docker stats #实时查看所有容器资源使用量 $ docker stats 容器名 #仅查看指定容器名的资源使用量 -
docker exec
$ docker exec 容器名 命令 #让容器执行命令 #选项确定好了,就不能换了,除非删除重来 拓展:定义镜像的别名(方便调用,类似软链接的功能) 注意:仅能本地使用,在进项仓库中应该遵守镜像命名规则 $ docker tag 镜像原名 镜像新名 $ docker tag hub.c.163.com/public/centos:7.2-tools 163 #将163的centos:7.2-tools镜像 定义别名为 163 例: $ docker run --name centos -d 163 #运行163镜像为centos容器 $ docker exec centos ls -l / #让centos容器执行 "ls -l /" 命令 $ docker exec centos yum -y install httpd #让centos容器执行 "yum -y install httpd" 命令 $ docker exec centos httpd #让centos容器执行 "httpd" 命令 $ docker exec -it 容器名 /bin/bash #进入容器 -i #交互式 -t #tty接口 /bin/bash #运行的终端环境 拓展: 系统环境 ---> 运行为容器 ---> 在容器内部进行环境构建 C7与C6运行docker: CentOS 7:init-v ---> systemd systemd要想运行,必须运行D-BUS,D-BUS服务需要完整的管理员权限 总结:在容器中使用的命令 systemctl start httpd (×) /usr/sbin/httpd (√) CentOS 6:yum源很多已经关闭,不适合运行docker
3)docker run 命令基础
$ docker run 选项 镜像名 #创建并运行容器
选项:
--name #指定容器名
例: $ docker run --name test1 -d 163
--env #给容器内部添加环境变量(可添加多个)
例: $ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
--restart=always #容器自启动
注意:并不能保证一定会启动成功
启动逻辑:systemd > docker > 容器 --restart=always
例: $ docker run --name test2 -d --restart=always 163
-h 主机名 #自定义容器的主机名
例: $ docker run --name test3 -d -h www.yq.com 163
--dns DNS地址 #设置容器使用的dns服务器,若不指定会使用物理机的DNS
--dns-search #DNS搜索域设置
--add-host hostname:IP #注入hosts解析(在容器中的/etc/hosts文件中写入)
例:
$ docker exec test3 ifconfig |grep 172 #查看test3的ip
#创建test4容器,并指定主机名为www.yq1.com,并注入hosts解析
$ docker run --name test4 -d -h www.yq1.com --add-host www.yq.com:172.17.0.3 163
$ docker exec test4 cat /etc/hosts #查看test4的hosts文件
--rm #容器关闭时,自动删除(常用于容器之间的测试)
例: $ docker run --name test5 -it --rm 163 /bin/bash
解释:
-i #交互式
-t #tty接口
--rm #关闭容器自动删除
163 /bin/bash #更改容器默认启动为/bin/bash
--link #将其他容器地址写入容器
例: $ docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
解释:
--link db:mysql #将db容器地址写入MyWordPress容器中,mysql表示db的别名
-p 8080:80 #将外部的8080端口映射到容器中的80端口
-p #端口映射
$ docker run #若不指定,默认没有任何特权
--cap-add Add Linux capabilities(添加特权)
--cap-drop Drop Linux capabilities(移除特权)
--privileged Give extended privileges to this container
--device=[] Allows you to run devices inside the container without the --privileged flag.
详细查看dockerfile类命令
# [image-id]为镜像的ID或名称。执行该命令后会输出JSON格式的详细信息,包括镜像的元数据、配置信息、网络设置等。
$ docker inspect [image-id]
# [image-id]为镜像的ID或名称。执行该命令后会输出镜像的架构信息,如amd64、arm64等。
$ docker image inspect --format='{{.Architecture}}' [image-id]
# 其中[image-id]为镜像的ID或名称。执行该命令后会输出Dockerfile中的命令信息。
$ docker history --no-trunc [image-id]
# [image-id]为镜像的ID或名称。执行该命令后会输出该镜像的基础镜像名称和ID。
$ docker image inspect --format='{{.Parent}}' [image-id]
# [image-id]为镜像的ID或名称。执行该命令后会输出Linux系统版本的详细信息。
$ docker run [image-id] cat /etc/*-release
# [image-id]为镜像的ID或名称。执行该命令后会输出指定的镜像名称和标签。
$ docker image inspect --format='{{.RepoTags}}' [image-id]
## dockerfile详解
# Dockerfile是用来构建Docker镜像的脚本文件。在Dockerfile中,可以使用多个命令和指令来定义镜像构建过程中的各种操作。以下是一个简单的Dockerfile文件:
FROM ubuntu:18.04 RUN apt-get update && \ apt-get install -y nginx COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
# 该Dockerfile定义了一个基于Ubuntu 18.04镜像构建的Nginx镜像。其中,FROM指令指定了基础镜像,RUN指令用于在容器内执行命令,COPY指令用于将文件从主机复制到容器中,EXPOSE指令用于将容器的80端口暴露给外部,CMD指令指定了容器启动时要运行的命令。
2、Docker-Compose
ctrl+鼠标左键查看:Yaml 语法
ctrl+鼠标左键查看:Docker-compose 基本语法
实现多个容器依赖启动
部署复杂度:
1)环境封装在Docker镜像中,解决了环境部署问题(一个容器可以解决的问题)
2)多个容器部署的复杂度是有提升的
由于单独每次部署容器的复杂度:
定义一个yaml格式的文件,文件中定义了容器的必备选项,docker-compose实现启动
拓展:三剑客
Linux 数据流处理三剑客:
grep、awk、sed
Docker 三剑客:
docker-compose #容器编排工具
docker-swarm #整合管理各个物理机中的容器(由于docker仅适合单机化部署)
#现在已经被Kubernetes替代
docker-machine #将容器模拟成传统虚拟化
容器内部的用户并不具备完整的root权限,是一个虚拟用户
1)docker-compose安装
-
方法一:
- linux终端直接下载
$ curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose $ docker-compose versionctrl+鼠标左键查看详细步骤:linux终端下载docker-compose命令
-
方法二:
-
浏览器访问 GitHub 直接下载
-
下载后直接上传使用

[root@localhost bin]# ls docker-compose [root@localhost bin]# chmod a+x docker-compose #给docker-compose赋予可执行权限 [root@localhost bin]# docker-compose version #查看docker-compose版本 docker-compose version 1.23.1, build b02f1306 docker-py version: 3.5.0 CPython version: 3.6.7 OpenSSL version: OpenSSL 1.1.0f 25 May 2017
-
2)docker-compose命令
$ docker-compose up -d #启动项目,建议在项目路径下(其中有yaml文件)(因为yaml文件中可能会有调用当前目录下的文件)
$ docker-compose -f yaml文件路径 up -d #指定路径启动项目,
-f 指定项目路径
注意: -f 需要写在其他选项之前
注意:每个docker-compose启动的项目,都会位于一个独立的网络中
$ docker-compose -f yaml文件路径 ps #指定路径,显示项目中所有容器的详细信息
$ docker-compose pause #暂停项目中所有的容器
$ docker-compose unpause #恢复暂停项目中所有的容器
$ docker-compose start #启动项目,启动项目中所有容器(若项目中有容器未启动,则正常启动;若所有容器都启动,则自动跳过)
$ docker-compose stop #停止项目,停止项目中所有容器
$ docker-compose restart #重启项目中所有容器
$ docker-compose logs #查看项目中所有容器的所有日志
$ docker-compose config -q #检查yaml文件格式,是否正确(并不能判断内容编写是否有误)
$ docker-compose rm #删除项目(需要先停止项目,停止项目中所有容器)
五:Docker镜像管理
1、镜像特性:
1)容器创建需要镜像
镜像是分层的:Docker的镜像通过UFS,将各层文件系统叠加在一起
存储驱动:overlay
2)启动相关
bootfs:
用于系统引导的文件系统,包括bootloader、kernal,容器启动后会被卸载,以节省内存资源
rootfs:
Docker容器的根文件系统,位于bootfs之上
-
传统模式的启动: rootfs由内核,先挂载为ro,完整自检后,再挂载为rw Docker中的启动: rootfs由内核,先挂载为ro,再通过UFS挂载一个可写层 可写层的生命周期:伴随着容器创建而创建,销毁而销毁,默认容器删除后所有的修改全部消失
3)层级相关
-
已有的分层只能读,不能修改
-
上层镜像优先级大于底层镜像
-
写时即复制(尽量避免,将大文件放入底层的仅读层中):
若发生,需要写入、修改只读层中的文件时,会将只读层中文件拷贝到可写层进行写入、修改

2、查看镜像中的信息
(将下载的镜像导出为压缩包,然后解压压缩包,查看镜像中的信息)
$ docker pull wangyanglinux/myapp:new1 #下载镜像
$ docker pull wangyanglinux/myapp:v1
(1)拓展:docker 命令
docker save -o xxx.tar 镜像名:版本号 #将镜像打包
$ docker save -o hello.tar hello-world:latest #将镜像打包为hello.tar
docker load -i xxx.tar #导入打包的镜像到本地
$ docker load -i hello.tar #导入打包的镜像到本地
拓展:
Kubernets 有很多镜像在国外的仓库(比如 红帽仓库:quay、谷歌仓库:gcr),需要科学上网
可以颁发免费的证书的地址:OHTTPS官网
(2)dockertools下载、使用
有一个docker的小工具:
(可以实现批量打包、批量导入等功能)
详细请看:dockertools小工具链接
Linux下载:
$ wget https://cloudmessage.top/upload/2022/11/dockertools-de953437c3e74d978bd0562605633a72.
windows下载:
https://cloudmessage.top/upload/2022/11/dockertools-5a23e3d5761c405e82243484e144f173.exe
dockertools下载:
$ yum -y install wget #安装wget工具,使用链接下载(也可以本地上传导入)
$ wget https://cloudmessage.top/upload/2022/11/dockertools-de953437c3e74d978bd0562605633a72. --no-check-certificate
$ mv dockertools-de953437c3e74d978bd0562605633a72. /usr/local/bin/dockertools #将工具放入PATH变量中,方便命令调用
$ chmod a+x /usr/local/bin/dockertools #赋予可执行权限
dockertools使用:
$ dockertools --help #查看dockertools帮助信息
$ dockertools load --help #查看dockertools load 命令的帮助
$ dockertools save #批量导出本地镜像
选项:
-a "地址" #指定保存到远程登录的地址
-r "正则表达式" #使用正则表达式匹配对象
-s "路径" #指定导出后的保存位置
例子:
[root@localhost ~]# docker images #查看本地有哪些镜像
[root@localhost ~]# dockertools save -r ".*" -s "./images" #导出所有镜像到./images目录中
[root@localhost ~]# ls ./images/ #查看,导出成功
hello-world-latest.tar wangyanglinux-myapp-new1.tar wangyanglinux-myapp-v1.tar
$ dockertools load #批量导入本地镜像
选项:
-l "路径" #指定镜像位置
-a "地址" #指定远程登录的地址
拓展:
docker client 通过http协议发送到 dockerdaemon(docker核心程序)
例子:
[root@localhost ~]# docker rmi -f $(docker images -q) #删除本地所有镜像
[root@localhost ~]# dockertools load -l "./images" #导入./images目录中所有的镜像到本地
[root@localhost ~]# docker images #查看本地镜像,导入成功
$ dockertools searchtag #查看镜像可用标签
选项:
-i 名称 #指定名称搜索
-n 数字 #显示多少个搜索结果
-t 5 #匹配含 5 关键字的标签
例子:
#搜索含有关键名为:mysql,关键字为5,列出10个,的标签
[root@localhost ~]# dockertools searchtag -i mysql -n 10 -t 5
(3)查看镜像导出后的包
导出后的包直接用 tar -xf 解压

解压后的包内容:
VERSION: 当前的镜像标准版本
layer.tar:保存当前层相对于下层发生修改的文件
json:保存元数据信息,文件记录不了的信息(例:镜像的启动命令、环境变量)
在容器中,镜像的启动命令:
systemctl enable httpd (×)
/etc/rc.local (×)
json信息中 (√)
拓展:yum扩展源中有个工具:jq,可以识别json格式
$ yum -y install epel-release
$ yum -y install jq
$ cat json |jq
压缩包中有一个总的json文件:保存每一层的json信息,方便整体容器对所有层级的调用
压缩包中每一层都以一个json文件:单独调用层级时,方便调用(镜像的层级可以共用)
manifest.json:清单文件(标记镜像的元数据文件,镜像名,各个层级以及顺序)
repositories:记录镜像仓库信息(包含:镜像名、版本号、md5)
3、制作镜像
1)基础镜像的构建(实际上就是当前系统的打包)
下面介绍CentOS 7 的导出
(1)在新系统中使用tar导出镜像
- 卸载不必要的软件包
yum remove -y iwl* *firmware* --exclude=kernel-firmware
-
清理yum缓存
yum clean all rm -rf /var/cache/yum -
tar打包系统
tar --numeric-owner --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/var/cache --exclude=/usr/share/{foomatic,backgrounds,perl5,fonts,cups,qt4,groff,kde4,icons,pixmaps,emacs,gnome-background-properties,sounds,gnome,games,desktop-directories} --exclude=/var/log -zcvf /mnt/CentOS-7.9.2009.tar.gz / -
将压缩包导出
sz /mnt/CentOS-7.9.2009.tar.gz

(2)进入docker系统中导入
-
将压缩包导入

-
执行命令导入基础镜像
$ cat /root/CentOS-7.9.2009.tar.gz | docker import - centos-tar:7.9.2009
$ docker images #查看镜像,导入成功
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-tar 7.9.2009 75aae09319fa 6 seconds ago 834 MB
(3)使用镜像
$ docker run --name centos-test -it -d -p 80:80 centos-tar:7.9.2009 /bin/bash #启动容器
$ docker exec -it centos-test /bin/bash #进入容器
#部署网站服务
$ ls /etc/yum.repos.d/ #检查网络源为163,方便下载
163.repo back
$ yum -y install httpd
$ echo "hello YQ" > /var/www/html/index.html #写入网页
$ httpd #启动httpd
-
浏览器访问测试:

更多详细信息请点击👉基础镜像构建
2)容器保存为镜像
(1)创建容器,并保存为镜像
-
使用163镜像运行一个nginx容器
docker run --name nginx -d -p 80:80 163 -
进入容器
docker exec -it nginx /bin/bash -
安装nginx依赖
yum -y install gcc gcc-c++ zlib zlib-devel pcre pcre-devel make lrzsz -
上传nginx源码包、检查、编译、安装

tar -xf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure && make && make install -
配置nginx服务,写入网页主文件,启动nginx
$ ln -s /usr/local/nginx/sbin/* /usr/local/bin/ $ echo "hello YQ" > /usr/local/nginx/html/index.html $ nginx浏览器访问测试:

-
删除不必要的文件
cd /root/ ; rm -rf nginx* yum clean all ; rm -rf /var/cache/yum/* -
在真实机中,将容器保存为镜像:docker commit
命令格式: docker commit 容器名 镜像名:版本号
docker commit nginx nginx:v0.1
(2)使用镜像
$ docker rm -f $(docker ps -a -q) #避免冲突,删除所有容器
$ docker run --name nginx -d -p 80:80 nginx:v0.1 #运行导出的镜像
#由于docker commit封装的镜像,不能对容器的启动命令进行修改,所有要进入容器启动nginx
$ docker run --name nginx -d -p 80:80 nginx:v0.1
$ docker exec -it nginx /bin/bash
$$ nginx
浏览器访问测试:

拓展:docker commit 原理
仅能封装文件的变化,不能分装元数据信息

3)Dockerfile构建镜像
(1)Dockerfile语法:
FROM #指定基础镜像
MAINTAINER #指定镜像创建者
LABEL #将元数据添加到镜像
拓展1:根据 Dockerfile 文件生成镜像
拓展2:Dockerfile 原理
拓展3:格式化处理,筛选容器中的json信息
拓展4:继承于重写(只要是元数据,都会符合这个特性)
RUN #指定镜像中,需要执行的命令
注意:一个服务一个指令、变化的放入上层、RUN能否运行取决于镜像环境
USER #设置容器的用户
EXPOSE #指定容器重要的端口(信息级别)
ENV #设置容器中的环境变量
ARG #设置 Dockerfile 中的环境变量
注意:ARG与ENV区别(有个案例)
ARG:在 Dockerfile 中生效
ENV:容器中生效
ADD #从src复制文件到容器中的dest路径
注意:src 若是URL,则会自动下载
src 若是压缩包,则会自动解压
COPY #从src复制文件到容器中的dest路径
注意:src 不能是 URL,不支持自动解压(单纯的拷贝关系)
VOLUME #指定挂载点
WORKFIR #切换目录
注意:可结合 RUN 灵活使用
CMD #设置容器启动时,执行的操作
注意:若其正常运行的必要条件:有一个前台进程
ENTRYPOINT #设置容器启动时,执行的操作
注意:ENTRYPOINT 与 CMD 结合
都是完整命令时,谁在最后谁生效
ENTRYPOINT 调用 CMD 参数,实现不同参数启动容器(有个实验)
Dockerfile 层级限制为128
ONBUILD #在子镜像中执行
STOPSIGNAL #指令设置将发送到容器以退出的系统调用信号
SHELL #修改容器默认解释器
HEALTHCHECK #容器健康状况检查
更多详细信息请点击👉Dockerfile 语法详解
(2)commit VS build
commit (类似手动编译安装lamp)
优点:所见所得,简单
缺点:
重用性差:文件层级、步骤
元数据无法封装:不能改变启动命令、无法设置环境变量等
build: (类似写一个脚本安装lamp)
优点:
重用性高:文件层级、步骤
功能全面
缺点:复杂
总结:commit 更适合,对镜像中环境不熟悉,制作镜像
build 更适合,熟悉镜像中环境,制作镜像
两者可以组合:
在制作镜像时,对镜像中环境不熟悉,先使用 commit 制作,再在制作出的镜像中进行 build 制作镜像。
实验:模拟 commit 与 build 组合
实验步骤:
前提:需要 centos基础镜像(本次使用 centos:centos7.9.2009)
1、先用 commit 制作出:已经安装完成nignx的镜像(nginx:run)
2、在用 build 对镜像再次制作,使镜像启动就自动运行nginx
实验详细步骤请点击👉commit 与 build 组合实现nginx镜像制作
查看镜像信息:
[root@localhost ~]# docker image inspect --format "{{json .Author}}" nginx:v2 | jq
"yq \"yq@qq.com\""
[root@localhost ~]# docker image inspect --format "{{json .ContainerConfig.Labels}}" nginx:v2 | jq
{
"nginx_version": "1.18.0",
"org.label-schema.build-date": "20201113",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
拓展:查看镜像制作历史
$ docker history nginx:v2
六、镜像动态化
使用镜像时,传递不同的参数,得到不同的效果
容器的环境变量:
Dockerfile 中 ENV ENDEX_DATA xinxianghf
docker run --env INDEX_DATA=yangqin
注意:--ENV 优先级高与 ENV 即:作用域小的,优先级高
初始化脚本:
必须符合幂等性:执行多次操作后,仍然能符合预期效果
实验:制作 nginx 镜像
实现传递不同的参数时,网页显示不同内容
实验步骤:
1、编写 Dockerfile 文件
2、编写启动脚本
3、上传 nginx 压缩包
4、build 制作镜像 nginx:v1
5、使用不同参数运行镜像
6、浏览器访问测试
7、测试,实现幂等性
实验详细步骤请点击👉 镜像动态化实验-nginx
实验:制作 MySQL 镜像
实现传递不同参数时,MySQL 登录密码不同
实验要求:
若不指定密码运行容器时,默认使用 123456 为 MySQL 的 root 密码
若指定,则改 MySQL 的 root 密码
选项:MYSQL_ROOT_PASSWORD=x
实验步骤:
1、编写 Dockerfile 文件
主要内容:ENV MYSQL_ROOT_PASSWORD
CMD /root/startup.sh
2、编写启动脚本
方法1:判断是否第一次启动,第一次启动会创建 /root/yq.txt 文件
方法2:判断数据库文件是否存在
( 判断 /usr/lib/mysql/mysql 是否为空 )
实验详细步骤请点击👉 镜像动态化实验-MYSQL
七、镜像仓库
镜像的分享:
1)镜像打包物理分享:
镜像打包的时,需要打包完整部分(有可能客户端已经存在其中有的部分)
2)镜像仓库下载的方式提供镜像:
官方镜像仓库:hub.docker.com
实验:上传推送镜像到镜像仓库
拓展:
$ docker login wangyanglinux #登录仓库
$ docker push wangyanglinux/y2206:v1 #上传镜像到仓库
$ docker logout wangyanglinux #退出登录
**注意:**登录仓库以后,会生成一个文件,保存登录信息
[root@localhost ~]# cat .docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "eWFuZ3FpbmxpbnV4OnlxaXNAbGludXg="
}
}
}
实验详细步骤请点击👉 上传镜像到官方仓库
八、私有仓库----harbor
docker 的贡献:
规范:
镜像运行时
容器运行时
后来提供了仓库开源(仅有基本的 C/S 架构):
Docker Client HTTPS 443
Docker 开源的镜像仓库:Registry http 5000

harbor --- 企业级 Docker 私有仓库
1、安装底层需求:
Python 版本 2.7 或更高 Docker 引擎 1.10 或更高 Docker-compose 1.6.0 或更高
2、harbor安装:
harbor 官方地址:Releases · goharbor/harbor (github.com)
详细步骤:
1)安装docker
上传 docker 的 rpm 包

yum 安装:
$ yum -y install docker-ce-*
配置docker加速:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
将 docker 加入自启动,重启:
$ systemctl enable docker
$ reboot
2)上传 ,解压 harbor

$ tar -xf harbor-offline-installer-v1.2.0.tgz -C /usr/local/
3)上传 docker-compose

$ chmod a+x docker-compose
4)配置 harbor 配置文件,执行脚本
$ cd /usr/local/harbor/
$ vim harbor.cfg
hostname = harbor.yq.com #修改域名
ui_url_protocol = https #修改为https
db_password = root123 #数据库密码默认,可修改
max_job_workers = 3 #指定向官方同步镜像,同时进行的最大数,默认
ssl_cert = /data/cert/server.crt #指定证书文件位置
ssl_cert_key = /data/cert/server.key #指定私钥位置
$ mkdir -p /data/cert #创建保存私钥、证书的目录
$ cd !$ #进入
#创建私钥、证书
$ openssl genrsa -des3 -out server.key 2048 #创建私钥,需要设置密码
$ openssl req -new -key server.key -out server.csr #根据私钥创建证书(只有申请者信息),需要验证密码
$ cp server.key server.key.org #将私钥复制出来
$ openssl rsa -in server.key.org -out server.key #设置使用私钥不需要密码
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt #签发证书,设置证书有效期等信息
拓展:也可以用下面方式,直接创建未设置密码的私钥,再创建证书
$ openssl genrsa -out server.key 2048
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 165 -sha256 -in server.csr -signkey server.key -out server.crt
#到 harbor 目录下,执行脚本,等待自动安装完成
$ cd /usr/local/harbor/
$ ./install.sh

5)访问测试
在 Windows 端写入 hosts 文件: 
192.168.20.206 harbor.yq.com
浏览器访问测试:(默认用户:admin 默认密码:Harbor12345)

3、图形化管理 harbor
1)创建用户
可以选择创建普通用户,或者管理员



2)创建子空间(项目)
子空间中:可以创建多个仓库,设置管理员,普通用户
官方仓库与 harbor 私有仓库区别:

创建子空间步骤:



设置成员:

根据不同成员,选择不同角色:

3)镜像的上传与使用:
测试镜像上传:
1、配置 hosts 解析
2、信任证书(改 /etc/docker/daemon.json 文件)
注:若上传的地址为可信任,则不用此步骤
"insecure-registries": ["harbor.yq.com"]
3、登录(根据所属用户,所需镜像位于的项目,选择用户登录)
4、上传镜像
公共用户测试镜像下载:
1、配置 hosts 解析
2、信任证书(改 /etc/docker/daemon.json 文件)
3、直接下载
详细实验步骤请点击👉 harbor-私有仓库-镜像上传使用-详细步骤
4)项目中用户,使用 harbor
详细实验步骤请点击👉 harbor-图形化界面密码找回-详细步骤
4、拓展 docker-compose 命令
$ docker-compose -f /usr/local/harbor/docker-compose.yml ps #查看所有容器状态
$ docker-compose -f /usr/local/harbor/docker-compose.yml start #启动所有容器,根据yml配置文件