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 查看镜像/容器/数据卷所占的空间

image-20240617220511373

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 查看当前进程

image-20240617220839657

image-20240617221235913

后台守护式启动

docker run -d redis:6.0.8

img

7、 docker ps 查看所有实例

-a 全部实例包括已删除

-l 最新创建的容器

-n 最近n个创建的容器

-q 只显示容器编号

示例:

docker ps -n 2

img

Status是up 实例才是开着的状态

从容器中退出+关闭容器exit

从容器中退出+不关闭容器 ctrl+pq

8、docker start 0d2c6c6c906c 重启之前关闭的容器

image-20240617221204112

面试题:谈谈docker虚悬镜像是什么?

仓库名、标签都是none的镜像,俗称虚悬镜像dangling image

9、查看相关

查看日志

docker logs 164a42419790

查看容器内运行的进程 docker top 164a42419790

img

查看容器内部的细节 docker inspect 容器id

docker exec -it 7e9d50557af4 /bin/bash 重新进入某个实例

10、容器挂载文件

docker cp 401be0ecce7a:/tmp/a.txt(赋值的文件目录) /home/vagrant/copyubuntu(新目录)

img

新的目录必须得有才能赋值进去

11、把容器打包成一个新镜像,再导入

docker export 401be0ecce7a > abcd.tar 把整个容器导成一个tar包

cat abcd.tar | docker import - atguigu/ubuntu:3.7 再把整个容器搞成一个镜像放回去

img

可以达到数据备份的效果

总结

image-20240617222011652

本地镜像发布到阿里云

img

因为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

img

搭建私服版本的放镜像的仓库

docker pull registry

docker run -d -p 5000:5000 -v/zzyyuse/myregistry/:/tmp/registry --privileged=true registry

可以查看本地是否有镜像

curl -XGET http://localhost:5000/v2/_catalog

img

目前私服库没有任何镜像

打包成镜像

docker commit -m="ifconfig cmd add" -a="li" db19f74af087 liubuntu:1.2

img

Docker 默认不允许http方式推送镜像,取消这个限制

遇到的问题:

问题:在本地搭建私服这个是没问题的,但是在使用

curl -XGET http://localhost:5000/v2/_catalog这个命令的时候。open in new window

Localhost如果换成本地ip地址是访问不成功的,不是请求超时就是拒绝访问。

原因:ip地址没写对。使用ifconfig就可以知道当前的ip地址,然后就可以访问到了。

curl -XGET http://localhost:5000/v2/_catalog

img

从本地仓库拉下来镜像

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

img

默认是rw,双向可读写

docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name u5 ubuntu

img

容器的继承

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

img

补充点关于mysql的操作命令

mysql -uroot -p 以root身份进入mysql

img

show databases

img

create database db01;

use db01;

create table t1(id int,name varchar(20));

insert into t1 values(1,'z3');

select * from t1

img

安装mysql有个问题 默认字符集是拉丁

可以显示当前字符集的配置

SHOW VARIABLES LIKE 'character%'

img

安装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

img

有数据卷的好处就是就算是删除了容器,再次新建一模一样的容器,里面的数据还在。

安装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

img

关于配置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

img

mysql主从配置

在配置mysql主从配置的时候出现问题

img

img

查看虚拟机的地址

Ip addr

img

所以网络地址不对导致mysql主从复制docker失败

img

img

进入节点后查看集群的情况

img

查看节点的主从关系

Master slave

1 6

2 4

3 5

3主3从集群环境,在进入redis实例的时候,这样数据是分布存储到整个集群上的

img

退出实例用exit

img

主宕机之后,从会变成主机工作

img

1号机宕机之后6号从机变主机 1号机再重启 start之后,还是slave

现在主从关系

Master slave

1 6

2 4

3 5

给三主三从的集群扩容到四主四从

img

查看集群节点情况

img

redis-cli --cluster reshard 192.168.56.10:6381

重新分配槽位

img

img

img

把6388挂成6387的slave

img

把四主四从所容成三主三从

删掉从机

img

重新分配槽号

img

img

最后将6387从主机中删除