话不多说上干货:

一、安装mysql数据库,并且建立相关表

在本地主机上安装mysql数据库,并且建立一个名为docker的数据库,在数据库中建立两个数据表分别为container_auto和container_user,分别代表自动生成的秘钥和用户自己输入的秘钥,两个表的字段都为id和passphrase,如下

mysql> create table container_auto(
> id char(20) not null primary key,
> passphrase char(40) not null);

container_user和container_auto结构一样

二、搭建docker编译环境

搭建教程,并在/go/src/github.com/docker/docker下修改源码,最后编译

三、修改源码

在/go/src/github.com/docker/docker修改

mkdir crypt

vi crypt/mysql.go

package cryptimport ("database/sql"_ "github.com/go-sql-driver/mysql"
)func InsertUser(id string, passphrase string) {db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")checkErr(err)stmt, err := db.Prepare(`INSERT container_user (id,passphrase) values (?,?)`)checkErr(err)_, err = stmt.Exec(id, passphrase)checkErr(err)
}func InsertAuto(id string, passphrase string) {db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")checkErr(err)stmt, err := db.Prepare(`INSERT container_auto (id,passphrase) values (?,?)`)checkErr(err)_, err = stmt.Exec(id, passphrase)checkErr(err)
}func Remove(id string) {db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")checkErr(err)stmt_auto, err := db.Prepare(`DELETE FROM container_auto WHERE id=?`)checkErr(err)_, err = stmt_auto.Exec(id)checkErr(err)stmt_user, err := db.Prepare(`DELETE FROM container_user WHERE id=?`)checkErr(err)_, err = stmt_user.Exec(id)checkErr(err)
}func QueryUser(id string) string {db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")checkErr(err)var password stringrows, err := db.Query(`SELECT passphrase FROM container_user WHERE id=?`, id)checkErr(err)for rows.Next() {err := rows.Scan(&password)checkErr(err)}return password
}func QueryAuto(id string) string {db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")checkErr(err)var password stringrows, err := db.Query(`SELECT passphrase FROM container_auto WHERE id=?`, id)checkErr(err)for rows.Next() {err := rows.Scan(&password)checkErr(err)}return password
}func checkErr(err error) {if err != nil {panic(err)}
}

vi crypt/crypt.go

package cryptimport ("math/rand""time"
)func init() {rand.Seed(time.Now().UnixNano())
}func RandStringBytes(n int) string {const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"b := make([]byte, n)for i := range b {b[i] = letterBytes[rand.Intn(len(letterBytes))]}return string(b)
}func SubstrId(str string) string {return string([]byte(str)[:12])
}/*func SetCrypt() string {var password, verify_password stringfor {fmt.Println("Enter passphrase:")fmt.Scanln(&password)fmt.Println("Verify passphrase:")fmt.Scanln(&verify_password)if password == verify_password {fmt.Println("Success!")return password} else {fmt.Println("The passwords do not match,please enter angin!")}}
}*//*
func SelectMode(id string) {var num stringfor {fmt.Println("Please select mode,enter the number:")fmt.Println("1.User input mode")fmt.Println("2.Automatic generation")fmt.Scanln(&num)if num == "1" || num == "2" {break} else {fmt.Println("Enter error,please enter the number!")}}switch num {case "1":fmt.Println("Welcome user input mode!")InsertMysql(SubstrId(id), SetCrypt())case "2":fmt.Println("Welcome automatic generation mode!")InsertMysql(SubstrId(id), RandStringBytes(12))}
}func Test() {fmt.Println("this is a test")
}
*/

vi cli/command/container/run.go

12
"github.com/docker/docker/crypt"
32
crypt string
61
flags.StringVar(&opts.crypt,"crypt","","Set a password for your docker storage encryption")
146
if opts.crypt != "" {crypt.InsertUser(crypt.SubstrId(createResponse.ID), opts.crypt)
}else{crypt.InsertAuto(crypt.SubstrId(createResponse.ID), crypt.RandStringBytes(12))
}

vi cli/command/container/rm.go

6
"github.com/docker/docker/crypt"
53
for _, container := range opts.containers {password_user:=crypt.QueryUser(crypt.SubstrId(container))password_auto:=crypt.QueryAuto(crypt.SubstrId(container))if password_auto == "" && password_user == ""{return errors.New("Please use the container id instead of the container name")}
}

vi client/container_remove.go

6
"github.com/docker/docker/crypt"
27
crypt.Remove(containerID)

vi cli/command/container/start.go

11
"github.com/docker/docker/crypt"
25
crypt string
52
flags.StringVar(&opts.crypt,"crypt","","Start your container need your password")
73
password_user:=crypt.QueryUser(crypt.SubstrId(container))
password_auto:=crypt.QueryAuto(crypt.SubstrId(container))
if password_auto == "" && password_user == ""{return errors.New("Please use the container id instead of the container name")}
if opts.crypt == "" && opts.crypt != password_user{return errors.New("You should enter the password you used to set")
}else if opts.crypt != "" && opts.crypt != password_user{return errors.New("Your password is wrong")
}
172
for _,container := range opts.containers{password_user:=crypt.QueryUser(crypt.SubstrId(container))password_auto:=crypt.QueryAuto(crypt.SubstrId(container))if password_auto == "" && password_user == ""{return errors.New("Please use the container id instead of the container name")}if opts.crypt == "" && opts.crypt != password_user{return errors.New("You should enter the password you used to set")}else if opts.crypt != "" && opts.crypt != password_user{return errors.New("Your password is wrong")}
}

vi cli/command/container/restart.go

9
"github.com/docker/docker/crypt"
18
crypt string
39
flags.StringVar(&opts.crypt,"crypt","","Start your container need your password")
53
for _,name := range opts.containers {password_user:=crypt.QueryUser(crypt.SubstrId(name))password_auto:=crypt.QueryAuto(crypt.SubstrId(name))if password_auto == "" && password_user == ""{return errors.New("Please use the container id instead of the container name")}if opts.crypt == "" && opts.crypt != password_user{return errors.New("You should enter the password you used to set")}else if opts.crypt != "" && opts.crypt != password_user{return errors.New("Your password is wrong")}
}

四、缺陷

增加了对docker run,docker start,docker restart,docker rm的修改,但是所有都是对于容器id操作,缘由是数据库的字段是id,不能对容器name进行操作,观察容器name的代码比较复杂,没有深入修改,望后期能健全

Docker源码修改工作总结(三)相关推荐

  1. Docker源码分析(三):Docker Daemon启动

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part3 1 前言 Docker诞生以来,便引领了轻量级虚拟化容器领域的技术 ...

  2. grbl控制3轴机械臂 原理 实现 (四) 之GRBL源码修改驱动三轴机械臂

    往期回顾: 第一篇:grbl控制3轴机械臂 原理 实现 (一) 之2D机械臂模拟及实现 第二篇:grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现 第三篇:grbl控制3轴机械臂 原理 ...

  3. Docker源码分析(十):Docker镜像下载

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part10 1.前言 说Docker Image是Docker体系的价值所在 ...

  4. Docker源码分析(六):Docker Daemon网络

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part6 1. 前言 Docker作为一个开源的轻量级虚拟化容器引擎技术,已 ...

  5. Docker源码分析(四):Docker Daemon之NewDaemon实现

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part4 1. 前言 Docker的生态系统日趋完善,开发者群体也在日趋庞大 ...

  6. Docker源码分析(二):Docker Client创建与命令执行

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part2 1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引 ...

  7. 我的docker随笔12:docker源码编译

    因工作需要从源码编译docker,本文对此进行介绍. 一.环境搭建 docker的编译,需要在宿主机预先安装docker软件.因为编译docker的源码时,会构建一个docker镜像并运行,在这个容器 ...

  8. Docker源码分析(一):Docker架构

    1 背景 1.1 Docker简介 Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议.目前,Docker可以在容器内 ...

  9. Docker源码编译(二)

    这是根据自己项目修改而记录的过程,对他人不具有参考性 一.按照以下教程,搭建docker编译环境:Docker源码编译和开发环境搭建 二.由于我对docker源码的修改导入了mysql数据库的包,如下 ...

最新文章

  1. nagios 监控NFS
  2. C#判断文件是否存在方法
  3. redis学习及实践5---redis相关资料参考文献
  4. 没学过编程可以学python吗_没编程基础可以学python吗
  5. PgSQL · 应用案例 · 逻辑订阅给业务架构带来了什么?
  6. 扩展Reporting Services和SQL Server 2016中的更改
  7. win7误删计算机,Win7系统下文件数据被误删了怎么办
  8. bzoj 4260: Codechef REBXOR(01字典树)
  9. 基于Attention Model的Aspect level文本情感分类---用Python+Keras实现
  10. MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
  11. win11 edge怎么卸载?win11 edge浏览器彻底卸载的方法教程
  12. 限定通配符和非限定通配符_什么是通配符?
  13. Cfree-5各种抽风解决办法
  14. 线代——余子式和代数余子式
  15. 如何关闭计算机触摸鼠标,怎么关闭笔记本键盘-笔记本电脑如何禁用触摸板
  16. 读 L. S. Stavrianos 之 《全球通史:从史前到21世纪》
  17. python中的./与../
  18. 外汇天眼:如何交易外汇缺口?
  19. Volley 登录注册
  20. excel 数据读出

热门文章

  1. python基本语法语句-python基本语法
  2. python处理excel大数据-当Excel遇到大数据问题,是时候用Python来拯救了
  3. python在日常工作处理中的应用-记 Python 在实际工作中的第一次应用
  4. python打不开文件-python文件打不开如何解决
  5. python读取csv文件制图-python读取CSV文件
  6. 大学python和vb哪个简单-python和vb哪个简单
  7. python小游戏编程实例-Python实现的弹球小游戏示例
  8. 大学计算机基础课程报告python-大学计算机基础
  9. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
  10. Opengl-光照-基本光照-冯氏(千万好好理解后面所有的延伸基本都是基于这个的)