docker
简介
Docker三件套
镜像(image):相当于类,容器的模板。
容器(container):运行实例
仓库(repository):放各种镜像的地方 https://hub.docker.com/
安装
官网
https://docs.docker.com/engine/install/centos/
yum安装gcc
yum -y install gcc
yum -y install gcc-c++
安装需要的软件包
yum install -y yum-utils
设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装DockerCE
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动docker
systemctl start docker
测试
docker version
阿里云镜像加速!!!这个必做,不然pull镜像都下不下来
阿里云的容器镜像服务,没有可以申请一个
镜像工具下的镜像加速器
使用指令
sudo mkdir -p /etc/docker # 建文件夹
sudo tee /etc/docker/daemon.json <<-'EOF' # 新建配置文件并写入配置
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload # 重启配置文件和docker
sudo systemctl restart docker
帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
补充常用Linux知识
Cat 是查某个文件的具体内容
Vi就是要进入某个文件
I 是要修改文件
W 保存文件
先按esc键,:wq 保存并离开
Q 离开 或者 shit+zz
离开之后记得cat一下看看文件修改成功没有
Pwd 查看当前目录
touch a.txt 新建文本文件
返回上一层 cd ..
rm -r webapps -r 目录下面的逐一删除
docker常用指令
1、docker images 列出本地主机上的镜像
2、docker search 某个XXX镜像名字
3、docker pull 某个XXX镜像名字
4、docker system df 查看镜像/容器/数据卷所占的空间
5、docker rmi 某个XXX镜像名字ID
docker rmi a3b6608898d6 删除某个镜像
如果已经实例化无法删除,需要强制删除,加-f
docker rmi -f feb5d9fea6a5
docker rmi -f $(docker images -qa) 删除全部镜像
6、docker run -it (i 交互式 t 提供终端)
docker run -it ubuntu /bin/bash
Ps -ef 查看当前进程
后台守护式启动
docker run -d redis:6.0.8
7、 docker ps 查看所有实例
-a 全部实例包括已删除
-l 最新创建的容器
-n 最近n个创建的容器
-q 只显示容器编号
示例:
docker ps -n 2
Status是up 实例才是开着的状态
从容器中退出+关闭容器exit
从容器中退出+不关闭容器 ctrl+pq
8、docker start 0d2c6c6c906c 重启之前关闭的容器
面试题:谈谈docker虚悬镜像是什么?
仓库名、标签都是none的镜像,俗称虚悬镜像dangling image
9、查看相关
查看日志
docker logs 164a42419790
查看容器内运行的进程 docker top 164a42419790
查看容器内部的细节 docker inspect 容器id
docker exec -it 7e9d50557af4 /bin/bash 重新进入某个实例
10、容器挂载文件
docker cp 401be0ecce7a:/tmp/a.txt(赋值的文件目录) /home/vagrant/copyubuntu(新目录)
新的目录必须得有才能赋值进去
11、把容器打包成一个新镜像,再导入
docker export 401be0ecce7a > abcd.tar 把整个容器导成一个tar包
cat abcd.tar | docker import - atguigu/ubuntu:3.7 再把整个容器搞成一个镜像放回去
可以达到数据备份的效果
总结
本地镜像发布到阿里云
因为docker下的都是最小的内核,很多命令就去掉了
如果想用,怎么加回来
apt-get update 更新包管理工具
apt-get -y install vim 更新我们想要安装的命令
此时就是我们想要功能的ubuntu
将加好功能的镜像发布上去
docker commit -m="vim cmd add ok" -a="li" f9233c10013a atguigu/myubuntu:1.3
将自己加好功能的镜像发布到阿里云
docker login --username=电力知库 registry.cn-qingdao.aliyuncs.com
Password:
docker tag e827fefbab08 registry.cn-qingdao.aliyuncs.com/atguigubj_1/myubuntu:1.3
docker push registry.cn-qingdao.aliyuncs.com/atguigubj_1/myubuntu:1.3
搭建私服版本的放镜像的仓库
docker pull registry
docker run -d -p 5000:5000 -v/zzyyuse/myregistry/:/tmp/registry --privileged=true registry
可以查看本地是否有镜像
curl -XGET http://localhost:5000/v2/_catalog
目前私服库没有任何镜像
打包成镜像
docker commit -m="ifconfig cmd add" -a="li" db19f74af087 liubuntu:1.2
Docker 默认不允许http方式推送镜像,取消这个限制
遇到的问题:
问题:在本地搭建私服这个是没问题的,但是在使用
curl -XGET http://localhost:5000/v2/_catalog这个命令的时候。
Localhost如果换成本地ip地址是访问不成功的,不是请求超时就是拒绝访问。
原因:ip地址没写对。使用ifconfig就可以知道当前的ip地址,然后就可以访问到了。
curl -XGET http://localhost:5000/v2/_catalog
从本地仓库拉下来镜像
docker pull localhost:5000/li:1.2
如果ifconfig查不到网络请求
sudo yum install net-tools
在容器内产生的数据同步到宿主机上
docker run -it --privileged=true -v /tmp/hos_data:/tmp/docker_data --name=u3 ubuntu
在验证宿主机的目录下面有没有文件的时候,如果一下子进不去,可以一层一层的进去。
以json串儿的形式展示容器的全部信息,包括数据卷的映射关系。
docker inspect 30dbded75d00
默认是rw,双向可读写
docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name u5 ubuntu
容器的继承
docker run -it --privileged=true --volumes-from u6 --name u7 ubuntu
继承之后,不管实例开着还是关着,对主机的容器操作之后,实例的数据也会同步过去,继承之后,所有的配置和数据都会同步过去。
安装mysql
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 不加容器卷版本
查看linux服务器本身有没有mysql
ps -ef|grep mysql
补充点关于mysql的操作命令
mysql -uroot -p 以root身份进入mysql
show databases
create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,'z3');
select * from t1
安装mysql有个问题 默认字符集是拉丁
可以显示当前字符集的配置
SHOW VARIABLES LIKE 'character%'
安装mysql包含数据卷版本
docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
解决中文乱码问题
cd /zzyyuse/mysql/conf
vi my.cnf
新建 my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重启一下docker restart mysql
有数据卷的好处就是就算是删除了容器,再次新建一模一样的容器,里面的数据还在。
安装redis
安装redis
docker run -d -p 6379:6379 redis:6.0.8
docker exec -it 9c92691b881a /bin/bash
redis-cli
set k1 v1
get k1
关于配置redis
mkdir -p /app/redis
cd /app/redis
vi redis.conf
把redis.conf的基本配置粘过来
新建一个带有容器数据卷的redis
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
docker exec -it myr3 /bin/bash
mysql主从配置
在配置mysql主从配置的时候出现问题
查看虚拟机的地址
Ip addr
所以网络地址不对导致mysql主从复制docker失败
进入节点后查看集群的情况
查看节点的主从关系
Master slave
1 6
2 4
3 5
3主3从集群环境,在进入redis实例的时候,这样数据是分布存储到整个集群上的
退出实例用exit
主宕机之后,从会变成主机工作
1号机宕机之后6号从机变主机 1号机再重启 start之后,还是slave
现在主从关系
Master slave
1 6
2 4
3 5
给三主三从的集群扩容到四主四从
查看集群节点情况
redis-cli --cluster reshard 192.168.56.10:6381
重新分配槽位
把6388挂成6387的slave
把四主四从所容成三主三从
删掉从机
重新分配槽号
最后将6387从主机中删除