前言

  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. 用一道题 来 复习 MySQL 的 复杂 sql 语句

    1.前言 太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做, 一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作. 然而... ...

  2. js获取设备内网ip

    可以直接使用,不需要导入其他配置 看代码 1 <script> 2 //获取内网ip 3 var RTCPeerConnection = window.RTCPeerConnection ...

  3. Elasticsearch打造全文搜索引擎(二)

    一.Es的文档.索引的CURD操作 1. elasticsearch概念 集群:一个或多个节点组织在一起 节点:一个节点是集群中的一个服务器,有一个名字来标识,默认是一个随机的漫画角色的名字 分片:将 ...

  4. 微服务架构攀登之路(三)之gRPC入门

    一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...

  5. iview 按需引入解决加载慢的问题

    如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...

  6. 【刷题-LeetCode】205. Isomorphic Strings

    Isomorphic Strings Given two strings *s* and *t*, determine if they are isomorphic. Two strings are ...

  7. golang中的map

    1. 声明与初始化 // map的声明与初始化 userInfo := map[string]string{"name": "马亚南", "age&q ...

  8. PyTorch 介绍 | DATSETS & DATALOADERS

    用于处理数据样本的代码可能会变得凌乱且难以维护:理想情况下,我们希望数据集代码和模型训练代码解耦(分离),以获得更好的可读性和模块性.PyTorch提供了两个data primitives:torch ...

  9. java中的数组 和 封装

    package com.aaa.zxf; /** * 一. 普通java项目 导入测试类的方法. * ideal 中 java 项目中导入测试类的方法 手动写入 * import org.junit. ...

  10. Linux 安装和 连接xshell

    一.介绍和安装 /*一.linux:? 为什么要学习它. 常见的操作系统? 1.windows, linux,mac 使用命令行进行操作 Windows cmd Linux 和Mac 中的命令行是 s ...