2024-07-10
Docker
00

目录

Docker简介
docker是什么
容器与虚拟机比较
Docker安装
Docker常用命令
帮助启动类命令
镜像命令
容器命令
Docker镜像
镜像分层的概念
Docker镜像commit操作案例
本地镜像发布到私有库
Docker容器数据卷
容器数据卷是什么
容器卷ro和rw读写规则
容器卷之间的继承
Docker常规软件安装
安装tomcat
安装mysql
安装redis

Docker简介

docker是什么

Docker是一种轻量级的虚拟化技术,同时是一个开源的应用容器运行环境搭建平台,可以让开发者以便捷方式打包应用到一个可移植的容器中,然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机,Docker容器提供轻量化的虚拟化方式、安装便捷、启停速度快。

容器与虚拟机比较

Docker和传统虚拟化方式的不同之处

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
  • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

Docker安装

docker官网:https://www.docker.com/

Docker Hub 官网(镜像仓库):https://hub.docker.com/

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境,所以 Docker 必须部署在Linux内核系统上

镜像(image)容器(container)仓库(repository)是docker的基本组成

  • 镜像(image):image文件生成的容器实例,本身也是一个文件,称为镜像文件。
  • 容器(container):一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器。
  • 仓库(repository):就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
  1. 安装最新版本docker命令

    bash
    # 安装之前需要先安装编译器 yum install -y gcc gcc-c++ # yum-utils 提供了 yum-config-manager yum install -y yum-utils # 配置官方源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker Engine、containerd 和 Docker Compose yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  2. 修改配置文件,设置docker默认使用数据盘,启动 Docker

    bash
    mkdir /data cat > /etc/docker/daemon.json <<'EOF' { "data-root": "/data/docker" } EOF systemctl start docker
  3. 测试是否安装成功

    bash
    docker run hello-world

卸载命令:

bash
# 停止docker systemctl stop docker # 删除安装包 yum remove docker-ce docker-ce-cli containerd.io # 删除镜像、容器、配置文件等内容 rm -rf /var/lib/docker rm -rf /var/lib/containerd

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

镜像命令

  • 列出主机上的镜像:docker images

    image.png

    标题说明
    REPOSITORY表示镜像的仓库源
    TAG镜像的标签版本号
    IMAGE ID镜像ID
    CREATED镜像创建时间
    SIZE镜像大小

    参数说明

    -a:列出本地所有镜像(含历史映像层)

    -q:只显示镜像ID

  • 搜索镜像:docker search [OPTIONS] 镜像名字

    image.png

    标题说明
    NAME镜像名称
    DESCRIPTION镜像描述
    STARS点赞数量
    OFFICIAL是否为官方的
    AUTOMATED是否是自动构建的

    如果不想列出全部镜像,可以使用 OPTIONS 参数: 只列出N个镜像,默认25个,示例(列出排名前5个镜像): docker search --limit 5 redis

  • 拉取镜像:docker pull 镜像名字[:TAG],TAG就是版本号,不写默认就是最新的版本。

  • 查看镜像/容器/数据卷所占的空间:docker system df

  • 删除镜像:docker rmi 镜像ID,加上 -f 参数可以强制删除

    • 删除单个镜像:docker rmi -f 镜像ID
    • 删除多个镜像:docker rmi -f 镜像名1:TAG 镜像名2:TAG
    • 删除全部:docker rmi -f $(docker images -qa)

容器命令

  • 新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...],OPTIONS说明:有些是一个减号,有些是两个减号

    示例:docker run -it --name=myu1 ubuntu /bin/bash

    • --name="容器新名字":给容器起一个名字
    • -d:后台运行容器并返回容器ID,即启动守护式容器
    • -i:以交互模式运行容器,通常与 -t同时使用
    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,即启动交互式容器(前台有伪终端,等待交互)
    • -P:随机端口映射,大写P,宿主机随机端口:容器端口
    • -p:指定端口映射,小写p,宿主机指定端口:容器端口
  • 列出所有正在运行的容器:docker ps [OPTIONS],OPTIONS说明:

    • -a:列出当前所有正在运行的容器+历史上运行过的
    • -l:显示最近创建的容器
    • -n:显示最近n个创建的容器
    • -q:静默模式,只显示容器编号
  • 退出容器,有两种退出方式

    • run进去容器,exit退出,容器停止
    • run进去容器,ctrl+p+q退出,容器不停止
  • 启动已停止运行的容器:docker start 容器ID或容器名

  • 重启容器:docker restart 容器ID或容器名

  • 停止容器:docker stop 容器ID或容器名

  • 强制停止容器:docker kill 容器ID或容器名

  • 删除已停止的容器:docker rm 容器ID,删除全部容器:docker rm -f $(docker ps -a -q),-f参数是强制删除。

  • 后台运行容器:docker run -d 容器名 /bin/bashdocker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是一直挂起的命令(比如运行top,tail),就会自动退出。

  • 查看指定容器日志:docker logs 容器ID

  • 查看容器内运行的进程:docker top 容器ID

  • 查看容器内部细节:docker inspect 容器ID

  • 进入正在运行的容器并以命令行交互,推荐使用 docker exec -it 容器ID /bin/bash命令:

    • docker exec -it 容器ID /bin/bash:exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
    • docker attach 容器ID:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
  • 从容器内拷贝文件到主机:docker cp 容器ID:容器内路径 目的主机路径

  • 导入和导出容器:

    • docker export 容器ID > filename.tar:导出容器的内容留作为一个tar归档文件

    • cat filename.tar | docker import - 镜像用户/镜像名:镜像版本号:从tar包中的内容创建一个新的文件系统再导入为镜像

Docker镜像

镜像分层的概念

联合文件系统(UnionFS):

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

Docker镜像加载原理:

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
  • bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

为什么docker镜像要采用这种分层结构?

  • 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

  • 比如有多个镜像都从相同的base镜像构建而来,那么 Docker Host 只需再磁盘上保存一份 base 镜像,同时内存中也只需加载一份base镜像,就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

Docker镜像层都是只读的,容器层是可写的

当容器启动时,一个新的科协层被加载到镜像的顶部。这一层通常被称为“容器层”,“容器层”之下的都叫“镜像层”。

Docker镜像commit操作案例

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像,新镜像是从base镜像一层一层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层

案例演示ubuntu安装vim,并打包成一个新的镜像

bash
# 首先要先进入到容器里,之后再执行命令 # 更新软件包列表 apt-get update # 安装vim apt-get install -y vim # 退出容器,打包成一个新的镜像 docker commit -m="vim cmd add ok" -a="jerry" ee7cba59b288 myubuntu:1.1 # 查看本地已有的镜像,就能看到自己刚才打包的镜像了 docker images REPOSITORY TAG IMAGE ID CREATED SIZE myubuntu 1.3 473a89ae6bfb 6 seconds ago 187MB ubuntu latest 35a88802559d 4 weeks ago 78.1MB

本地镜像发布到私有库

  1. 拉取 registry 镜像: docker pull registry

  2. 运行私有库registry,相当于本地有个私有 Docker Hub:docker run -d -p 5000:5000 -v /data/myreqistry/:/var/lib/registry --privileged=true registry

  3. 演示创建一个新镜像,ubuntu安装ifconfig命令

    bash
    # 创建一个新镜像 docker commit -m="ifconfig cmd add ok" -a="jerry" 4f2057334c76 myubuntu1:1.2
  4. curl验证私服库上有什么镜像

    bash
    curl -XGET http://192.168.30.100:5000/v2/_catalog # 返回结果没有镜像 {"repositories":[]}
  5. 将新镜像myubuntu1:1.2修改符合私服规范的Tag

    bash
    docker tag myubuntu1:1.2 192.168.30.100:5000/myubuntu1:1.2
  6. docker默认不允许http方式推送镜像,修改配置文件使之支持http,修改完配置如果不生效,就重启docker。

    bash
    vim /etc/docker/daemon.json # 把本机的请求ip和端口添加到这个配置文件 { "insecure-registries": ["192.168.30.100:5000"] } # 重启docker systemctl restart docker
  7. push推送到私服库:docker push 192.168.30.100:5000/myubuntu1:1.2

  8. 再次curl验证私服库镜像

    bash
    curl -XGET http://192.168.30.100:5000/v2/_catalog # 返回结果有一个myubuntu1镜像了 {"repositories":["myubuntu1"]}
  9. pull到本地运行:docker pull 192.168.30.100:5000/myubuntu1:1.2

Docker容器数据卷

容器数据卷是什么

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

  1. 数据卷可在容器之间共享重用数据
  2. 卷中的更改可以直接试试生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用为止

语法格式:docker run -it --privileged=true -v /宿主机绝对目录:/容器内绝对目录:ro 镜像名

示例:docker run -it -v /data/host_data/:/tmp/docker_data --privileged=true --name=u1 ubuntu

参数解释:

  • -v:挂载目录:冒号左边的是宿主机的目录,右边的是容器内的目录
  • --privileged=true:放开权限

Docker挂载主机目录访问如果出现cannot open directory.:Permission denied 解决办法:在挂载目录后多加一个-privileged=true参数即可

容器卷ro和rw读写规则

默认挂载默认是可以读写的,也可以在容器目录后面加上rw,docker run -it -v /data/host_data/:/tmp/docker_data:rw --privileged=true --name=U1 ubuntu

如果需要容器内的挂在目录设置只读权限,可以在容器内目录加上ro 参数

语法格式:docker run -it --privileged=true -v /宿主机绝对目录:/容器内绝对目录:ro 镜像名

容器卷之间的继承

容器1完成和宿主机的映射

容器2继承容器1的卷规则:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

示例:

bash
# 先挂在容器1 docker run -it -v /data/host_data/:/tmp/docker_data -me=U1 ubuntu # 容器2继承容器1 docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

如果u1容器挂掉,也不会影响u2的数据卷挂在

Docker常规软件安装

总体步骤:

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像
  5. 停止容器
  6. 移除容器

安装tomcat

  1. 搜索镜像:docker search tomcat
  2. 拉取镜像:docker pull tomcat
  3. 查看镜像:docker images tomcat
  4. 启动镜像:docker run -d -p 8080:8080 --name t1 tomcat
  5. 停止容器:docker stop t1
  6. 移除容器:docker rm t1

最新版本 tomcat 需要把 webapps.dist 替换成 webapps,访问地址时才能看到tomcat页面,否则访问会显示404。或者可以直接安装旧版本:docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

安装mysql

我们可以直接运行下面的命令,默认会查看本地是否有镜像,没有就去仓库拉取镜像:

bash
docker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

安装完成后,可以在宿主机进入 /data/mysql/conf 目录编辑配置文件。

bash
vim my.cnf [client] default_character_set=utf8 [mysqld] collation_server=utf8_general_ci character_set_server=utf8

安装redis

安装命令redis-server /etc/redis/redis.conf这个是指定配置文件,点击 redis 可以在官网下载redis.conf配置文件,配置文件要和redis版本对应,否则可能会启动失败:

bash
docker run -p 6379:6379 --name myredis --privileged=true -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf

安装完成后修改 redis 配置文件

bind 127.0.0.1 # 注释掉这部分,使redis可以外部访问

daemonize yes # 把这个注释掉或者原来的yes改成no,该配置会与 docker run 中的 -d 参数冲突,会导致容器启动失败

requirepass password # 给redis设置密码

appendonly no # redis持久化,可以改成yes

本文作者:柯南

本文链接:

版权声明:©2024 柯南 All rights reserved.