【0】Docker 底层知识
docker 和 vmware 相比快在哪儿?
- 资源利用率更高:在虚拟机中,每个虚拟机都需要运行一个完整的操作系统,这意味着虚拟机会消耗大量的内存、CPU和硬盘空间。而 Docker 容器只需加载所需的应用程序及其依赖项,不需要额外的操作系统支持,因此占用更少的资源。
- 更快的启动时间:在虚拟机中启动操作系统通常需要数分钟。而 Docker 容器只需几秒钟即可启动,并且可以在几秒钟内启动多个容器。
- 更小的镜像大小:Docker 镜像比虚拟机映像更小,因为它们不包括操作系统和其他不必要的组件。这意味着 Docker 镜像可以更快地传输和部署。
- 更好的性能:由于 Docker 容器是本地运行的,因此它们可以直接访问主机的文件系统和网络,而无需通过虚拟化层进行交互。这样可以提高容器的性能和响应速度。
执行 docker run 发生了什么?
- 如果指定的镜像不存在本地,Docker会从默认的镜像仓库中下载该镜像。
- Docker会在宿主机中创建一个新的文件系统作为容器的根文件系统,并将镜像文件复制到该文件系统中。
- Docker会为容器创建一个网络命名空间,以隔离容器的网络环境。
- Docker会为容器配置一个独立的文件系统,并为容器分配一个唯一的文件系统标识符(Filesystem UUID)。
- Docker会为容器设置一个随机的MAC地址。
- Docker会为容器创建一个进程命名空间,并在其中启动容器的初始化进程。
- Docker会为容器挂载必要的文件系统,例如 /proc 和 /sys。
- Docker会为容器设置一些系统资源限制,例如CPU、内存等限制。
- Docker会为容器分配一个IP地址,并配置容器的网络环境。
- Docker会根据指定的命令在容器中启动一个新进程。
- 当容器退出时,Docker会清理容器并释放占用的资源。
什么是docker的虚悬镜像?
- Docker的“虚悬镜像”(dangling image)指的是未被任何容器使用的镜像,仓库名和标签都是“NONE”。 它们是构建 新镜像时留下的残留物,也可能是由于执行了删除容器操作,但没有相应地删除该容器的关联镜像而导致的。
- 虚悬镜像占用磁盘空间,并可能导致系统性能问题。为避免这种问题,可以通过docker image prune命令来清理虚悬镜像并释放磁盘空间。
docker 的数据卷是什么?
Docker数据卷是容器与主机或与其他容器共享持久化数据的一种方法。 数据卷可以被认为是绕过容器文件系统,直接访问主机文件系统(或其他容器的文件系统)中的特定目录。 数据存储在数据卷中,它可以在容器之间共享,即使容器被删除或重新创建,数据卷中的数据也不会丢失。 数据卷还可用于实现容器内的持久化数据库存储,应用程序配置和其他需要在多个容器之间共享的数据。可以使用docker volume命令在本地或远程存储中创建一个数据卷。容器可以直接挂载数据卷,然后可以在容器之间共享它们。
【1】Docker 三要素
- 镜像
- 容器
- 仓库
【2】Docker 安装步骤
- 安装 GCC
yum -y install gcc
- 安装 GCC C++
yum -y install gcc-c++
- 安装 yum-util
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
- 设置阿里云镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
- 更新yum包软件索引
yum makecache fast
- 安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
- 启动Docker
systemctl start docker
- 卸载Docker
systemctl stop docker
yum remove ocker-ce docker-ce-cli containerd.io
rm -rf /var/lib/contanerd
rm -rf /var/lib/docker
9. 阿里云镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qlmy5iw9.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
【3】Docker的常用镜像命令
展示镜像
docker images
docker images -a 列出所有镜像
docker images -q 只显示镜像ID
查找镜像
docker search hello-world 查找远程仓库中的镜像
docker search --limit 5 hello-world 查找远程仓库中的镜像(只显示5个)
下载镜像
docker pull redis 下载镜像(不加TAG则默认下载最新镜像)
docker pull redis: 6.0.8 下载指定版本的镜像
docker system df 查看镜像/容器卷/数据卷/所占用的空间
删除镜像
docker rmi redis 删除镜像
docker rmi -f redis 强制删除镜像
docker rmi -f redis mysql hello-world 强制删除多个镜像
【4】Docker的常用容器命令
运行容器
docker run
--name="skylar_redis" 为容器指定一个名称
-d 守护式启动容器(后台运行)
-i 以交互模式运行容器
-t 为容器重新分配一个伪输入终端
-p hostPort:containerPort 指定端口的映射
-P hostPort:containerPort 随机端口映射
docker exec/attach
docker exec -it 容器ID /bin/bash 重新进入容器执行(不会退出容器,生产环境使用)
docker attach 容器ID 重新进入容器执行(会退出容器,生产环境不能使用)
exit 退出当前进入的容器
docker start 容器ID或者容器名 启动容器
docker restart 容器ID或者容器名 重启容器
docker stop 容器ID或者容器名 停止容器
docker kill 容器ID或者容器名 强制停止容器
docker stop 容器ID或者容器名 删除容器
示例:
docker run -it centos /bin/bash
docker run -d redis redis这种必须要后台守护启动,不然容易发生缓存穿透等问题
docker exec -it redis redis-cli
展示容器
docker ps
-a 当前运行的或者历史上运行过的容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 显示容器编号
删除容器
docker container prune 快速删除已退出的容器
调试容器
docker logs 容器ID 查看容器日志
docker top 容器ID 查看容器内运行的进程
docker inspect 容器ID 查看容器内部细节
备份容器
docker cp 容器ID:容器内路径 目的主机路径
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
示例:
docker cp xxxxx:/tmp/lzk.txt /home/runner 将容器内的lzk.txt文件拷贝到虚机的runner路径下
【5】数据卷的继承与共享
数据卷实现了容器与宿主机之间的文件共享,继承父类的数据卷可以继续实现与宿主机的文件共享
文件共享
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
限制容器内可读可写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
限制容器内只可读
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
示例:
docker run -it --privileged=true -v /tmp/host_dara:/tmp/docker_data --name=lzk_centos_7
docker run -it --privileged=true -v /tmp/host_dara:/tmp/docker_data:rw --name=lzk_centos_7
文件继承
docker run -it --privileged=true --volumes from 父类 --name=子类
示例:
docker run -it --privileged=true --volumes from lzk_centos_7 -- name lzk_centos_7_1
【6】Docker 常用软件安装
MySQL安装
- 拉取镜像
docker pull mysql:5.7
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker ps
docker exec -it xxxx /bin/bash
mysql -uroot -p
- 使用数据卷做持久化处理数据库的数据
docker run
-p 3306:3306
--privileged=true
-v /lzk/mysql/log:/var/log/mysql 将容器内mysql日志备份到宿主机做持久化处理
-v /lzk/mysql/data:/var/lib/mysql 将容器内mysql数据备份到宿主机做持久化处理
-v /lzk/mysql/conf:/etc/mysql/conf.d 将容器内mysql配置备份到宿主机做持久化处理
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7
- 修改docker中的mysql编码格式(否则出现拉丁乱码)
vim /etc/my.cnf
[client]
default_character_set=utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
:wq
docker restart mysql
Redis 安装
- 拉取镜像
docker pull redis:6.0.8
- 修改redis的配置文件
vim /etc/redis.conf
- 去掉 # bind 127.0.0.1 的注释
- 将daemonize yes这一行注释,由于它会和docker run -d 参数相冲突,会导致容器一直启动失败
- 开启redis数据持久化选项 appendonly yes
docker restart redis
- 使用数据卷做持久化处理数据库的数据
docker run
-p 6379:6379
--name lzk_redis
--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 指定持久化后的配置文件启动redis