前言

  java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,docker就成为跨进门槛必备的技能之一。



  虽然前两年kubernetes宣布v1.20开始弃用docker直到v1.23彻底排除,但这不意味着我们就要放弃学习docker,相反,国内诸多企业尤其是中小企业和事业单位存在大量用docker部署的既有项目,一些非互联网公司更是对升级版本十分审慎,大部分甚至还停留在v1.18之前,就比如居士的公司,虽然是互联网行业,但依然使用v1.15。



  所以,学习docker依然是未来几年软件工程师躲不开的一环,成为架构师必备的核心技能之一并非掌握技术,而是强大的适应能力和学习动力。

安装

1、检查内核

查看内核:uname -r



如果不是3.10以上,升级内核版本:yum update

2、卸载旧版本

1)、列出你安装过的包

$ yum list installed | grep docker



docker-engine.x86_64



1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm

2)、删除安装包,remove后面就是上个命令查出来的。

$ sudo yum -y remove docker-engine.x86_64

3)、删除镜像/容器等

$ rm -rf /var/lib/docker

3、安装需要的软件包

$ yum install -y yum-utils \



  device-mapper-persistent-data \



  lvm2

4、设置yum源

$ yum-config-manager \

      --add-repo \

      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

PS:果这个yum源已经不存在了,可以百度一下重新找一个,这样做的目的是为了yum安装时速度更快。

阿里云yum源: http://down.wbvip.cn/huanjing/yum/Centos-7.repo



163yum源: http://down.wbvip.cn/huanjing/yum/CentOS7-Base-163.repo

5、安装最新版本

$ yum install -y docker-ce

6、安装指定版本

查询版本列表,会列出当前存在的版本。

$ yum list docker-ce --showduplicates | sort -r

指定版本安装

$ yum install -y 上面查出来的版本

如:yum install -y docker-ce-19.03.2

7、检查版本

docker -v

8、启动docker

systemctl start docker

9、开机启动docker

systemctl enable docker

10、停止docker

systemctl stop docker

11、镜像加速

vim /etc/docker/daemon.json 

{

  "registry-mirrors": ["https://registry.docker-cn.com"]

}

国内几个较快的加速源:

Docker 官方中国区: https://registry.docker-cn.com

网易: http://hub-mirror.c.163.com

中科大: https://docker.mirrors.ustc.edu.cn

阿里云:https://ou9izn87.mirror.aliyuncs.com

(PS:自己阿里云控制台上获取到的,每个人不一样,推荐使用阿里云的,更快。)

常用命令

1、更新软件包
 yum -y update
2、 安装Docker虚拟机
 yum install -y docker
3、运行、重启、关闭Docker虚拟机
 service docker start
service docker start
service docker stop
4、搜索镜像
 docker search 镜像名称
5、下载镜像
 docker pull 镜像名称
6、查看镜像
 docker images
7、删除镜像
 docker rmi 镜像名称
8、运行容器
 docker run 启动参数  镜像名称
9、查看容器列表
 docker ps -a
10、停止、挂起、恢复容器
 docker stop 容器ID
docker pause 容器ID
docker unpase 容器ID
11、 查看容器信息
 docker inspect 容器ID
12、删除容器
 docker rm 容器ID
13、查看容器日志
 docker logs 容器名称或容器ID
14、数据卷管理
 docker volume create 数据卷名称  #创建数据卷
docker volume rm 数据卷名称  #删除数据卷
docker volume inspect 数据卷名称  #查看数据卷
15、网络管理
 docker network ls 查看网络信息
docker network create --subnet=网段 网络名称
docker network rm 网络名称
16、避免VM虚拟机挂起恢复之后,Docker虚拟机断网
 1)、vi /etc/sysctl.conf
在文件中添加 net.ipv4.ip_forward=1 这个配置 2)、重启网络服务
systemctl restart network

实战案例

1、docker启动MySQL
1)、搜索MySQL
 docker search mysql
2)、拉取MySQL
 # 建议不要拉取最新版,而是加上版本号如:docker pull mysql:5.7
docker pull mysql
3)、启动MySQL

参考官网

 docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

发现启动成功了,但是通过客户端还是连接不到MySQL,这是因为没有做端口映射。

 # 停止MySQL
docker stop 容器id # 端口映射
docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
3)、可能的错误

如果报类似“authentication plugin 'caching_sha2_password'”这样的错误,这是因为通过docker pull mysql默认下载的是最新版8.0(所以前面说最好自己加版本号),已经改变了以前的密码认证方式,用的caching_sha2_password,可以use msql; 然后查select * from user表去看。

解决方法:

首先,进入docker容器MySQL:docker exec -it mysql bash

然后,登入MySQL:mysql -u root -p

接着,执行下面的命令:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

然后再连接发现就可以了!

4)、高级用法

a)、使用自定义的配置文件、数据目录、日志目录

docker run ‐‐name mysql03 ‐v /conf/mysql:/etc/mysql/conf.d -v /conf/mysql/datadir:/var/lib/mysql MYSQL_ROOT_PASSWORD=123456 ‐d mysql:tag

含义:

i、把主机的/conf/mysql文件夹下的配置文件挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面

改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

ii、把主机的/conf/mysql/datadir数据目录挂载到docker容器的/var/lib/mysql下

b)、指定mysql的一些配置参数

docker run ‐‐name some‐mysql ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql:tag ‐‐character‐set‐server=utf8mb4 ‐‐collation‐server=utf8mb4_unicode_ci

含义:指定mysql的编码为utf8m64

2、docker启动Redis
1)、搜索
 docker search redis
2)、拉取
 docker pull redis
# 带版本
docker pull redis:4.0
3)、查看容器
 docker images
4)、启动一个容器
 docker run --name redis -p 6379:6379 --restart=always -d redis

 ############ 说明
--name 命名
-p 映射端口
--restart 重启后状态,always表示重启后自动启动容器
-d 后台运行
redis 容器原名称
5)、启动容器,加载配置文件并持久化数据
 docker run -p 6379:6379 \
--name redis \
--privileged=true \
-v /data/software/redis/data:/data \
-v /data/software/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis:4.0.11 redis-server /etc/redis/redis.conf \
--requirepass "fly0228" \
--appendonly yes ############ 说明
-d -> 以守护进程的方式启动容器
-p 6379:6379 -> 绑定宿主机端口
--name myredis -> 指定容器名称
--restart always -> 开机启动
--privileged=true -> 提升容器内权限
-v /root/docker/redis/conf:/etc/redis/redis.conf -> 映射配置文件
-v /root/docker/redis/data:/data -> 映射数据目录
--appendonly yes -> 开启数据持久化

备份和迁移

1、备份和迁移docker镜像
1)、先从一个有网络的电脑下载docker镜像
 docker pull centos
2)、保存镜像到本地文件
 docker save -o centos_image.tar centos

保存mysql容器为镜像:

如:docker save -o /data/software/project/mysql5.7.tar mysql5.7(保存到/data/software/project/目录下名称为mysql5.7.tar,被保存的镜像为mysql5.7)

如果一次保存多个:

docker save -o images.tar postgres:9.6 mongo:3.4 redis3.0

3)、拷贝和加载镜像
 # 把镜像拷贝到无网络的电脑,然后通过docker加载镜像即可。
docker load -i centos_image.tar
2、备份和迁移docker容器
1)、查找正在运行的容器id
 docker ps -a
2)、导出docker容器
 docker export 70c74ebbfac4 > ubuntu_sshd.tar
3)、查看大小
 du -sh ubuntu_sshd.tar
4)、上传和导入
 # 把这个ubuntu_sshd.tar传到别的服务器上,并导入容器。
# docer export 对应导入的命令是cat xxx | docker import – name ,我这里用的是niubi:latest。
cat ubuntu_sshd.tar | sudo docker import - niubi:latest
3、save和export的区别

1)、save是针对镜像images,export是针对当前容器的快照;

2)、save可以回滚以前的配置,因为保留了历史记录;

3)、save比较大,export要小一些。

备份迁移的方式自己选,推荐用export,毕竟save太大了,对于历史也没啥用处 !

4、保存mysql容器为镜像

1、把当前mysql容器作为镜像,可通过docker images查看。

docker commit -p 4e79d91d76bb mysql_backup

2、把这个镜像保存到指定目录

docker save -o /data/software/project/mysql5.7.tar mysql5.7

3、拷贝到其他宿主机上,加载这个镜像

docker load -i mysql5.7.tar

5、备份MySQL数据,导入到另一个mysql容器。

1、使用mysqldump命令备份导出数据库中的所有表结构和数据

docker exec -it mysql01 mysqldump -uroot -proot demo > /home/bak/demo.sql

2、只导出数据不导出表结构

docker exec -it mysql01 mysqldump --opt -t -uroot -proot demo > /home/bak/demo2.sql

3、只导出表结构不导出数据

docker exec -it mysql01 mysqldump --opt -d -uroot -proot demo > /home/bak/demo1.sql

4、使用mysqldump导出特定表的结构

docker exec -it mysql01 mysqldump -uroot -proot -B demo --table playmath_user > /home/bak/playmath_user.sql

5、docker执行导入(恢复)数据库命令

docker exec -i mysql01 mysql -uroot -proot playmath_sso < /home/bak/playmath_sso.sql

总结

  根据居士本人这些年的工作经验,初中级工程师只需了解docker命令即可,因为大部分公司中是不需要你来操作的,都有专门的集成工程师来搭建和维护,但对于正在往架构师方向前进的工程师而言,熟练掌握docker的安装、命令、具体使用以及整合springboot打包、docker高级用法等都是必备的技能,需要花时间实操。



  其实不用想那么复杂,这种偏运维性质的技能,你会百度会做文档就行,在一个公司顶多也就搭建一次,之后就是做好文档留痕,以后也不会有那么麻烦了。


本人原创文章纯手打,觉得有一滴滴帮助的话,就请伸出芊芊玉手点个推荐吧~~

Java架构师必备技能:docker使用大全的更多相关文章

  1. IBM Java架构师的技能

    一天,群里飘过一个IBM招聘信息.我看过之后,也只是如此而已. 大家好!我是XXX,IBM招聘java架构师,如今还有38个名额 学历大专以上即可,英语能面试交流的.项目有非常多到时候依据您面试会详谈 ...

  2. 成为java架构师的技能

    0: 数据结构算法 数组.链表.堆.栈.队列.Hash表.二叉树等; 算法思想:递推.递归.穷举.贪心.分治.动态规划.迭代.分枝界限; 排序查找 B+/B-数.红黑树.图等; 图的深度优先搜索.图的 ...

  3. 架构师必备技能指南:SaaS(软件即服务)架构设计

    1.介绍 从计算机诞生开始,就伴随着计算机应用程序的演变.简短的回顾历史,我们可以清楚的看到应用程序发生的巨大变化.上世纪70年代中期,随着个人PC机的爆炸式增长以及程序员的崛起,让计算机的计算能力得 ...

  4. Java架构师必会的技能

    Java架构师必会的技能 我把它分为了五大专题 工程化专题 工程化专题 git git安装使用 git日常使用:fetch/pull/push/revert/rebase git分支管理git flo ...

  5. 成为一个高级java架构师所需要具备那些技能呢?

    一.什么是架构师 所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等.可能涉及到 ...

  6. 一位资深Java架构师的晋级心得

    架构师是什么? 是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物.一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清 ...

  7. Java架构师学习路线

    Java架构师,首先要是一个高级java攻城狮,熟练使用各种框架,并知道它们实现的原理.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池--   Java ...

  8. 【转载】java架构师进阶之路

    Java架构师,应该算是一些Java程序员们的一个职业目标了吧.很多码农码了五六年的代码也没能成为架构师.那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力 ...

  9. 关于JAVA架构师

    在我们行业内,我们大致把程序员分为四级 1.初级Java程序员的重心在编写代码.运用框架: 2.中级Java程序员重心在编写代码和框架: 3.高级Java程序员技术攻关.性能调优: 4.架构师 解决业 ...

随机推荐

  1. Hive的分析函数的使用

    原文: https://www.toutiao.com/i6769120000578945544/?group_id=6769120000578945544 我们先准备数据库.表和数据 开窗分析函数相 ...

  2. PAT 乙级 1003. 我要通过!(20) (C语言描述)

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...

  3. 【pwn】学pwn日记(堆结构学习)

    [pwn]学pwn日记(堆结构学习) 1.什么是堆? 堆是下图中绿色的部分,而它上面的橙色部分则是堆管理器 我们都知道栈的从高内存向低内存扩展的,而堆是相反的,它是由低内存向高内存扩展的 堆管理器的作 ...

  4. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  5. python网络爬虫-静态网页抓取(四)

    静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...

  6. Python之基本数据类型与数据结构

    一.基础数据类型 标准数据类型: ·不可变数据类型 Number(数字):int.float.bool.complex(复数) String(字符串) Tuple(元祖):不可变,无法通过下标来修改值 ...

  7. Linux 系统conda环境,pip文件的导出和安装。

    /** * 注意:1.在当前的Linux系统中,先生成yaml和requirement.txt文件.通过ssh命令连接到另一台Linux实例.需要先在新的Linux实例上安装 conda.然后再将 y ...

  8. springmvc 配置拦截器

    package com.aaa.zxf.interceptor; import org.springframework.boot.autoconfigure.SpringBootApplication ...

  9. 细说string和stringbuffer

    ========================================================================================= 在我看来,学习jav ...

  10. linux 设置connect 超时

    转载请注明来源:https://www.cnblogs.com/hookjc/ 将一个socket 设置成阻塞模式和非阻塞模式,使用fcntl方法,即: 设置成非阻塞模式: 先用fcntl的F_GET ...