前言
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、卸载旧版本
# 列出你安装过的包
$ yum list installed | grep docker
docker-engine.x86_64
1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm
# 删除安装包,remove后面就是上个命令查出来的。
$ sudo yum -y remove docker-engine.x86_64
# 删除镜像/容器等
$ 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高级用法等都是必备的技能,需要花时间实操。
其实不用想那么复杂,这种偏运维性质的技能,你会百度会做文档就行,在一个公司顶多也就搭建一次,之后就是做好文档留痕,以后也不会有那么麻烦了。
本人原创文章纯手打,觉得有一滴滴帮助的话,就请伸出芊芊玉手点个推荐吧~~