前言

  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. i++ 和 ++i 区别

    i++:是先把i拿出来使用,然后再+1: ++i :是先把i+1,然后再拿出来使用:

  2. Layui table 学习笔记

    templet:'<div>{{createrFormat(d.accounts.name)}}</div>' function createrFormat(o){ retur ...

  3. react 网址导航

    项目搭建 使用webpack.babel.react.antdesign配置单页面应用开发环境

  4. vue2.0与vue3.0项目创建

    脚手架安装与卸载 安装 npm install -g vue-cli //or npm install -g @vue/cli 卸载 npm uninstall -g vue-cli //or npm ...

  5. windows下过安全狗

    最近想着把过waf相关的整理一下,本次主要以安全狗4.0为例进行演示 准备工作 安全狗官网:http://free.safedog.cn/install_desc_website.html环境:Win ...

  6. redis的bind误区

    对于Redis中bind的正确的理解是:bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址.如果指定了bi ...

  7. Python多环境管理神器(pipenv)

    pipenv 参考官网:https://pipenv.pypa.io/ pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通 ...

  8. RHCSA 第八天

    1.查询ip的几种方式: ip, ifconfig, nmcli,nmtui 2.nmcli命令使用: a.在ens160网卡上新建连接static_con,并配置静态ip b.在ens160网卡上新 ...

  9. Golang 记录

    Golang 笔记 1. hello Golang 新建项目,推荐GoLand工具 GOPATH目录:D:\go\awesomeProject 三个标准目录:bin,pkg,src MAIN目录:D: ...

  10. golang中goroutine池的使用

    1. 概念本质上是生产者.消费者模型可以有效的控制goroutine数量,防止暴涨案例:生成一个随机数,计算该随机数每一个数字相加的和,例如:123:1+2+3=6主协程负责生产数据发送到待处理通道中 ...