Docker 学习笔记

118 阅读6分钟

【0】Docker 底层知识

docker 和 vmware 相比快在哪儿?

  1. 资源利用率更高:在虚拟机中,每个虚拟机都需要运行一个完整的操作系统,这意味着虚拟机会消耗大量的内存、CPU和硬盘空间。而 Docker 容器只需加载所需的应用程序及其依赖项,不需要额外的操作系统支持,因此占用更少的资源。
  2. 更快的启动时间:在虚拟机中启动操作系统通常需要数分钟。而 Docker 容器只需几秒钟即可启动,并且可以在几秒钟内启动多个容器。
  3. 更小的镜像大小:Docker 镜像比虚拟机映像更小,因为它们不包括操作系统和其他不必要的组件。这意味着 Docker 镜像可以更快地传输和部署。
  4. 更好的性能:由于 Docker 容器是本地运行的,因此它们可以直接访问主机的文件系统和网络,而无需通过虚拟化层进行交互。这样可以提高容器的性能和响应速度。

执行 docker run 发生了什么?

  1. 如果指定的镜像不存在本地,Docker会从默认的镜像仓库中下载该镜像。
  2. Docker会在宿主机中创建一个新的文件系统作为容器的根文件系统,并将镜像文件复制到该文件系统中。
  3. Docker会为容器创建一个网络命名空间,以隔离容器的网络环境。
  4. Docker会为容器配置一个独立的文件系统,并为容器分配一个唯一的文件系统标识符(Filesystem UUID)。
  5. Docker会为容器设置一个随机的MAC地址。
  6. Docker会为容器创建一个进程命名空间,并在其中启动容器的初始化进程。
  7. Docker会为容器挂载必要的文件系统,例如 /proc 和 /sys。
  8. Docker会为容器设置一些系统资源限制,例如CPU、内存等限制。
  9. Docker会为容器分配一个IP地址,并配置容器的网络环境。
  10. Docker会根据指定的命令在容器中启动一个新进程。
  11. 当容器退出时,Docker会清理容器并释放占用的资源。

什么是docker的虚悬镜像?

  1. Docker的“虚悬镜像”(dangling image)指的是未被任何容器使用的镜像,仓库名和标签都是“NONE”。 它们是构建 新镜像时留下的残留物,也可能是由于执行了删除容器操作,但没有相应地删除该容器的关联镜像而导致的。
  2. 虚悬镜像占用磁盘空间,并可能导致系统性能问题。为避免这种问题,可以通过docker image prune命令来清理虚悬镜像并释放磁盘空间。

docker 的数据卷是什么?

Docker数据卷是容器与主机或与其他容器共享持久化数据的一种方法。 数据卷可以被认为是绕过容器文件系统,直接访问主机文件系统(或其他容器的文件系统)中的特定目录。 数据存储在数据卷中,它可以在容器之间共享,即使容器被删除或重新创建,数据卷中的数据也不会丢失。 数据卷还可用于实现容器内的持久化数据库存储,应用程序配置和其他需要在多个容器之间共享的数据。可以使用docker volume命令在本地或远程存储中创建一个数据卷。容器可以直接挂载数据卷,然后可以在容器之间共享它们。

【1】Docker 三要素

  1. 镜像
  2. 容器
  3. 仓库

【2】Docker 安装步骤

  1. 安装 GCC
yum -y install gcc
  1. 安装 GCC C++
yum -y install gcc-c++
  1. 安装 yum-util
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken
  1. 设置阿里云镜像仓库
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
  1. 更新yum包软件索引
yum makecache fast
  1. 安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
  1. 启动Docker
systemctl start docker
  1. 卸载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_1.png

查找镜像

docker search hello-world 查找远程仓库中的镜像
docker search --limit 5 hello-world 查找远程仓库中的镜像(只显示5个)

docker_2.png

下载镜像

docker pull redis 下载镜像(不加TAG则默认下载最新镜像)
docker pull redis: 6.0.8 下载指定版本的镜像
docker system df 查看镜像/容器卷/数据卷/所占用的空间

docker_3.png

删除镜像

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_5.png

展示容器

docker ps
-a 当前运行的或者历史上运行过的容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 显示容器编号

docker_4.png

删除容器

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路径下

docker_6.png

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

  1. 拉取镜像
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
  1. 使用数据卷做持久化处理数据库的数据
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
  1. 修改docker中的mysql编码格式(否则出现拉丁乱码)

docker_8.png

vim /etc/my.cnf
[client]
default_character_set=utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
:wq

docker restart mysql

Redis 安装

  1. 拉取镜像
docker pull redis:6.0.8
  1. 修改redis的配置文件
vim /etc/redis.conf
- 去掉 # bind 127.0.0.1 的注释
- 将daemonize yes这一行注释,由于它会和docker run -d 参数相冲突,会导致容器一直启动失败
- 开启redis数据持久化选项 appendonly yes

docker restart redis
  1. 使用数据卷做持久化处理数据库的数据
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