Docker初学者入门详细学习(一)

201 阅读12分钟

该篇系列面对初学者,旨在docker入门学习、练习,尽快掌握docker的技术

该篇文章包括Docker的概述、docker前置环境的配置以及Docker的镜像、容器、操作命令

Docker学习路径

  • Docker概述
  • Docker命令
    • 镜像命令
    • 容器命令
    • 操作命令
    • ...
  • Docker镜像
  • 容器数据卷
  • DockerFile
  • Docker网络原理
  • IDEA整合Docker
  • Docker Compose (集群的编排管理)
  • Docker Swarm
  • CI\CD Jenkins (持续集成和持续部署)

Docker概述

Docker为什么出现

一款产品:开发--上线 两套环境! 应用环境,应用配置!

环境配置很麻烦,每一个机器都要部署环境(集群Redis、ES...) 费时费力。 发布一个项目,项目能不能带上环境安装打包!(镜像)

Docker的思想来自于集装箱! 多个应用(端口冲突) 原来都是交叉的!

隔离: Docker核心思想!打包装箱!每个箱子都是互相隔离。Docker通过隔离机制,可以将服务器利用到极致

官方网站:www.docker.com/
镜像网站:hub.docker.com/

Docker能干嘛

虚拟机技术

image.png 虚拟机技术缺点:

  1. 资源占用十分多
  2. 冗余步骤多
  3. 启动慢

容器化技术

容器化技术不是模拟一个完整的操作系统

image.png 比较Docker和虚拟机技术的不同:

  • 传统虚拟机 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器没有自己内核,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

优势

应用更快速的交付和部署
Decker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
更简单的系统运维
在容器化之后,我们的开发以及测试环境都是高度一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器性能可以被压榨到极致!

Docker安装

Docker的基本组成

image.png

  • 镜像(image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==》run==》tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
  • 容器(container):Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动、停止、删除、基础命令。 看成简易的linux系统
  • 仓库(repository):仓库就是存放镜像的地方。

安装

环境准备

  1. linux基础 一点点
  2. centos 7
  3. 使用Xshell连接远程服务器进行操作。
  4. 一台服务器
  5. xshell、xftp

开始步骤

默认已经有服务器 且xshell成功连接上服务器(这里用的是阿里云的centos)

  1. 通过设置 Docker 的仓库来安装: 这是推荐的安装方法,因为它便于安装和升级。首先,安装 yum-utils 包(提供 yum-config-manager 工具),然后设置仓库:

    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  2. 安装 Docker 引擎: 接下来,安装 Docker Engine、containerd 和 Docker Compose:

    sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    如果系统提示接受 GPG 密钥,请验证指纹是否匹配 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35,如匹配,则接受它。

  3. 启动 Docker

    sudo systemctl start docker
    
  4. 验证 Docker 安装: 运行 hello-world 镜像以验证 Docker 安装是否成功:

    sudo docker run hello-world
    
  5. 查看下载的镜像hello-world:docker images

卸载docker

  1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io
  2. 删除资源 rm -rf /var/lib/docker 默认工作路径

阿里云镜像加速

找到阿里云官网的容器镜像服务==》镜像加速器==》加速器地址

image.png

run的流程

image.png

Docker底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socker从客户端访问。
DockerServer接收到Docker-Client的指令,就会执行命令

image.png

Docker的常用命令

帮助命令

docker version ## 版本信息
docker info ## docker系统信息 容器、镜像
docker 命令 --help

帮助文档:docs.doc ker.com/reference/

镜像命令

docker images

docker images [OPTIONS] [REPOSITORY[:TAG]]  ## 看到所有镜像
`--all`      | `-a` |   列出所有镜像
`--quiet`    | `-q` |   只显示镜像id

docker search xx

搜索docker hub镜像

docker pull xx

下载镜像

docker rmi xx

删除镜像

docker rmi -f 容器id 容器id # 删除多个/指定容器
docker rmi -f $(docker images -aq) # 删除所有镜像
-f ## 过滤

容器命令

有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习 docker pull centos

新建容器并启动 run

doucker run [可选参数] 

# 参数说明
--name 容器名字 tomcat1 用来区分容器
-d     后台方式运行
-it    使用交互方式运行,进入容器查看内容
-p     指定容器的端口  -p 8080:8080
    -p    ip:主机端口:(映射)容器端口
    -p    主机端口:(映射)容器端口
    -p    容器端口
-P     随机指定端口
-rm    用完就删除(如开启了后台 退出后不会删除容器 该命令退出后删除)

# 测试、启动并进入容器
[root@iZwz909zuxxmim3sok3i3qZ ~]# docker run -it centos /bin/bash(控制台)
[root@d9ac62643971 /]# ls  # 查看容器内的centos 基础
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

# 容器中退出主机 
exit

查看运行中的容器 ps

docker ps  
-a  # 列处当前正在运行的容器+历史运行过的容器
-n=? # 显示最近创建的n个容器
-q  # 只显示容器的id
-aq
[root@iZwz909zuxxmim3sok3i3qZ /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz909zuxxmim3sok3i3qZ /]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                       PORTS     NAMES
96fa5f7ac525   centos        "/bin/bash"   4 minutes ago   Exited (0) 4 minutes ago               eager_margulis

退出容器 exit

exit   # 直接容器停止并退出 
Ctrl + P + Q   # 容器不停止退出

删除容器 rm

docker rm 容器id         # 删除指定id容器 不能删除正在运行的容器 如果强行删除 rm -f
docker rm -f $(docker ps -aq)    # 删除所有容器 
docker pa -a -q|xargs docker rm  # 删除所有容器

启动和停止容器操作 start

docker start 容器id  # 第一次启动是run 后续就是start
docker restart 容器id  # 重启动
docker stop 容器id    # 停止正在运行的容器
docker kill 容器id    # 强制停止

进入当前正在运行容器 exec attach

docker exec 命令用于在运行中的 Docker 容器内执行命令。这个命令非常有用,因为它允许您在容器内部进行操作,即使容器已经启动并在运行。其常见用途包括启动交互式 shell、运行管理任务、调试等。以下是 docker exec 命令的一些关键点:

    docker exec [选项] 容器名 命令 [参数]
    -   `-i`(--interactive):保持 STDIN 打开,即使不附加到容器。
    -   `-t`(--tty):分配一个伪终端,这在启动交互式 shell 时非常有用。
    -   `-d`(--detach):在后台运行命令。
    
    # 示例
    运行交互式 bash shell:`docker exec -it 容器id /bin/bash`
    在容器中运行单个命令(如 `ls`):`docker exec 容器名 ls`

docker attach 容器id

    docker exec [选项] 容器名 命令 [参数]
    -   `-i`(--interactive):保持 STDIN 打开,即使不附加到容器。
    -   `-t`(--tty):分配一个伪终端,这在启动交互式 shell 时非常有用。
    -   `-d`(--detach):在后台运行命令。
    
    # 示例
    运行交互式 bash shell:`docker exec -it 容器id /bin/bash`
    在容器中运行单个命令(如 `ls`):`docker exec 容器名 ls`

常用的其他命令

后台启动容器

# 测试 docker attach 容器id
正在执行当前的代码...
区别

docker exec 进入容器后开启一个新的终端, 可以在里面操作(常用) docker attach 进入容器正在执行的终端,不会启动新的进程

查看日志 logs

docker logs -f -t --tail [几条日志] 容器id  # 没有日志

# 自己编写一个shell脚本
docker run -d centos /bin/sh -c "while true;do echo queqian; sleep 1;done"
docker ps # 能查询到在运行的容器

# 这时候查询该容器能查询到
docker logs -ft --tail 10 a7d3d60c83c4

#显示日志
-tf #显示日志
--tail number # 要显示的日志条数

查看容器中进程信息 top

# top命令
docker top 容器id

[root@iZwz909zuxxmim3sok3i3qZ ~]# docker top a7d3d60c83c4
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                51861               51842               0                   16:42               ?                   00:00:00            /bin/sh -c while true;do echo queqian; sleep 1;done
root                52518               51861               0                   16:51               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
# UID: 用户id ;PID:当前进程id ;PPID: 父进程id 

从容器内拷贝文件到主机上 cp

# cp命令
docker cp 容器id: 容器内路径 目的地主机路径

# 进入docker容器内部
[root@iZwz909zuxxmim3sok3i3qZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
853feaa0f6ab   centos    "/bin/bash"   About a minute ago   Up About a minute             brave_moore
[root@iZwz909zuxxmim3sok3i3qZ home]# docker attach 853feaa0f6ab
[root@853feaa0f6ab /]# cd /home
[root@853feaa0f6ab home]# ls

# 创建文件
[root@853feaa0f6ab home]# touch queqian.js
[root@853feaa0f6ab home]# ls
queqian.js
[root@853feaa0f6ab home]# exit
exit

# 返回主机:copy容器内的文件到主机
[root@iZwz909zuxxmim3sok3i3qZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz909zuxxmim3sok3i3qZ home]# ls
next-node-demo
[root@iZwz909zuxxmim3sok3i3qZ home]# docker cp 853feaa0f6ab:/home/queqian.js /home
Successfully copied 1.54kB to /home
[root@iZwz909zuxxmim3sok3i3qZ home]# ls
next-node-demo  queqian.js
拷贝是一个手动过程,未来可以使用-v卷的技术,可以实现,自动同步 /home /home

查看镜像的元数据 inspect

# inspect命令
docker inspect 容器id

docker inspect a7d3d60c83c4
{
        "Id": "a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635",
        "Created": "2023-11-30T08:42:27.651971979Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo queqian; sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 51861,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-11-30T08:42:27.829837813Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635/hostname",
        "HostsPath": "/var/lib/docker/containers/a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635/hosts",
        "LogPath": "/var/lib/docker/containers/a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635/a7d3d60c83c42bb74924dc448975ce87fe723e805ac0205a9cc3ee9ce7668635-json.log",
        "Name": "/hardcore_allen",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                36,
                107
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware",
                "/sys/devices/virtual/powercap"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/306dcc7bd2eba1ce79c2e85eb8835717c0cec08227cba8ceff235881bfe87fd5-init/diff:/var/lib/docker/overlay2/cf9d118afdec731275ac42c8d6765d346975f4d6d56b251a12a6c72c84312fdf/diff",
                "MergedDir": "/var/lib/docker/overlay2/306dcc7bd2eba1ce79c2e85eb8835717c0cec08227cba8ceff235881bfe87fd5/merged",
                "UpperDir": "/var/lib/docker/overlay2/306dcc7bd2eba1ce79c2e85eb8835717c0cec08227cba8ceff235881bfe87fd5/diff",
                "WorkDir": "/var/lib/docker/overlay2/306dcc7bd2eba1ce79c2e85eb8835717c0cec08227cba8ceff235881bfe87fd5/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "a7d3d60c83c4",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true;do echo queqian; sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "7f36e14df3a9733fb29300fe039ee0ec80e4411a4e8864dc6f69e09cf06fd92d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/7f36e14df3a9",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "ac51d86b85eb2948723c3fd6279655e3293a6d8828d5b1bfb7440732e524e14f",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "bf4ccc798eb16a707197ff2d92924f2bb8f04d7f40d421d217b8aafa3cce078a",
                    "EndpointID": "ac51d86b85eb2948723c3fd6279655e3293a6d8828d5b1bfb7440732e524e14f",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }

小结

image.png

参考资料:www.bilibili.com/video/BV1og… 学习于B站狂神老师的教学