Docker《一:简介和安装》

211 阅读11分钟

简介:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

发展历程: 实体机---》虚拟机---》容器

虚拟机和容器的对比image.png 当我们在物理服务器创建一台虚拟机时,便需要虚拟出一套硬件并在上面运行完整的操作系统,每台虚拟机都占用许多的服务器资源。虚拟机的不足之外来自于对物理服务器资源的消耗,当然docker也不是没有缺点,比如必须使用root账号,这可能会带来一些安全问题

image.png

背景:最容易想到的就是实际开发过程中,很容易出现开发测试以及生产环境不一致情况,比如最经典的就是“明明在我本地是问题的”,使用docker就可以完美的杜绝这种现象。

一:docker安装

特别注意的是docker官方对Linux不同版本有不同的要求,比如我现在的系统版本是 官方要求是 image.png 查看自己虚拟机版本

cat /etc/redhat-release

image.png

1.1# 卸载旧版本的Docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1.2安装yum-utils

sudo yum install -y yum-utils

1.3设置仓库地址

 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

注意:download.docker.com/linux/cento… 地址是国外的,为了方便我们下载镜像更快,这里我们不用官方提供的仓库地址,我们可以使用国内的仓库地址 比如使用阿里云镜像地址

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.4安装 Docker 引擎

sudo yum install docker-ce docker-ce-cli containerd.io

:默认是安装最新的,也可以选择指定版本,

yum list docker-ce --showduplicates | sort -r

然后进行安装

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

1.5启动docker

sudo systemctl start docker

image.png

1.6Docker镜像加速

使用加速器可以进一步提升获取docker官方镜像的速度 登陆阿里云获取个人镜像加速地址 image.png 找到镜像加速器地址 image.png 配置镜像加速器步骤

  • 创建目录
sudo mkdir -p /etc/docker
  • 配置daemon.json内容
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["你的镜像加速器地址"] } EOF
  • 重新加载daemon和重启docker
sudo systemctl daemon-reload 
sudo systemctl restart docker

1.7停止docker

sudo systemctl stop docker

1.8重启docker

sudo systemctl restart docker

1.9设置docker开机自启

  • 查看所有设置开机启动服务
systemctl list-unit-files | grep enable
  • 设置docker开机启动
systemctl enable docker.service

1.10卸载docker

  • 卸载Docker包
sudo yum remove docker-ce
  • 镜像、容器、自定义配置文件等并不会随着Docker的卸载自动删除,需要执行一下命令手动删除:
sudo rm -rf /var/lib/docker

二:Docker中的镜像和容器

2.1镜像

镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。镜像层的主要组成部分包括镜像层 ID、镜像层指针 「指向父层」、元数据「 Layer Metadata,包含了 Docker 构建和运行的信息和父层的层次信息」。只读层和读写层「Top Layer」的组成部分基本一致,同时读写层可以转换成只读层「 通过docker commit 操作实现」 image.png

2.1.1关于镜像常用命令
  • 查看本地镜像
docker images

image.png

docker images -q
# 只展示image id
  • 搜索镜像
docker search mysql
  • 从仓库下载镜像
docker pull mysql

如果不指定版本,默认下载最新版本镜像,下载指定版本镜像 关于镜像版本可以从dockhub官网上获取,比如 image.png

docker pull mysql:5.7.35
  • 删除镜像 删除指定id镜像
docker rmi imagesId

image.png

删除所有镜像

 docker rmi -f $(docker images -aq)

2.2容器

容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。要点:容器 = 镜像 + 读写层,并且容器的定义并没有提及是否要运行容器。 image.png

2.2.1关于容器常用命令
  • 查看当前正在运行的容器
 docker ps
  • 查看当前以及历史上运行过的容器
docker ps -a
  • 创建容器
docker run [可选参数] iamge
#可选参数说明
--name="Name" 容器名字,用来区分容器
-d             容器以后台方式运行
-v             目录挂载
-it           使用交互方式运行,进入容器查看内容
-p             指定容器的端口 -p 33063306
       -p ip:主机端口:容器端口
	   -p 主机端口:容器端口(最常用)
	   -p 容器端口
-P     随机指定端口

示例:我们创建一个mysql容器

sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

image.png

  • 进入容器 第一种方式
docker exec -it mysql /bin/bash

image.png

第二种方式

docker attach 容器id
  • docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)

  • docker attach # 进入容器正在执行的终端

  • 退出容器 直接在容器内部输入exit指令,或者使用快捷键 ctrl+d

  • 启动容器

docker start mysql
  • 停止容器
docker stop mysql
  • 重启容器
docker restart mysql
  • 删除容器 image.png
  • 查看容器的元数据
docker inspect 1f8fa87898b3
[
    {
        "Id": "1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df",
        "Created": "2021-09-13T01:30:43.616983125Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "mysqld"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3048,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-09-13T01:30:45.912679674Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:1d7aba9171693947d53f474014821972bf25d72b7d143ce4af4c8d8484623417",
        "ResolvConfPath": "/var/lib/docker/containers/1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df/hostname",
        "HostsPath": "/var/lib/docker/containers/1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df/hosts",
        "LogPath": "/var/lib/docker/containers/1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df/1f8fa87898b3e572b296f0ca8419ce9db3b145c5c78760ae0fd332c14458c5df-json.log",
        "Name": "/mysql",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/mydata/mysql/log:/var/log/mysql",
                "/mydata/mysql/data:/var/lib/mysql",
                "/mydata/mysql/conf:/etc/mysql"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "3306/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "3306"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "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",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "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"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/9579a80af707e228b83c36c35bf78d16e60c393c53db6b1b08af2614571fb751-init/diff:/var/lib/docker/overlay2/46bdd25b268e86c78340efc55df2b3168a5aa94a866a126e21339681122bf4b9/diff:/var/lib/docker/overlay2/fe293b3d8a420345489e9479d65f4b66339540fc1b94c00de09229be6f056482/diff:/var/lib/docker/overlay2/1356923f598837d4df98372e0d208fe804bf30ce2f3a5177fd258716f420be1e/diff:/var/lib/docker/overlay2/f90dcd25409626ed17b0cf1bdc1a11101bce6efaaeb86a019241e42acc823a8b/diff:/var/lib/docker/overlay2/97e80f2b28a293eb012df21495e4d0c44aa5368df371cdfa8f5fae72ff097706/diff:/var/lib/docker/overlay2/7cabee401fcbbbba722980ac36ec12da7169a7bc36e634374e0fffdb197f37be/diff:/var/lib/docker/overlay2/69ae699bc51e647d84772c712bf812f1d5b6a5f18194e8a8eb91680db9f01ee1/diff:/var/lib/docker/overlay2/50200055c27b1afbf9b79a8133b1ad083e5b66c2e5b0da1e47dc4b6a23c64b9e/diff:/var/lib/docker/overlay2/61d455616c1b91f4cf32352612243a295d575f899d1a7eb3470639c96e4f4973/diff:/var/lib/docker/overlay2/56e975d01fa2d44db6bd5e06c96945c451e9404f62384d0b0d492d6c45bda227/diff:/var/lib/docker/overlay2/a710415355de88d8c9bd7b30ec2b82cf3c1a8efcf37eb9ebf40d35a20d41be3c/diff",
                "MergedDir": "/var/lib/docker/overlay2/9579a80af707e228b83c36c35bf78d16e60c393c53db6b1b08af2614571fb751/merged",
                "UpperDir": "/var/lib/docker/overlay2/9579a80af707e228b83c36c35bf78d16e60c393c53db6b1b08af2614571fb751/diff",
                "WorkDir": "/var/lib/docker/overlay2/9579a80af707e228b83c36c35bf78d16e60c393c53db6b1b08af2614571fb751/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/mydata/mysql/log",
                "Destination": "/var/log/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mydata/mysql/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mydata/mysql/conf",
                "Destination": "/etc/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "1f8fa87898b3",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {},
                "33060/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "MYSQL_ROOT_PASSWORD=root",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "MYSQL_MAJOR=5.7",
                "MYSQL_VERSION=5.7.35-1debian10"
            ],
            "Cmd": [
                "mysqld"
            ],
            "Image": "mysql:5.7",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "9ac195d15b9b1eacc735b58eb3c668939481cf055c2bad27495622bb557a29d0",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "3306/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "3306"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "3306"
                    }
                ],
                "33060/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/9ac195d15b9b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "f539a4d8674dd70d0c187213426c37ac7f059f06b46ec4e360b0a634f5eff172",
            "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": "76e2f596aa456af2da972fb9f5fef03e4f48a312c6176e7d1d00e5a60f8dc9e4",
                    "EndpointID": "f539a4d8674dd70d0c187213426c37ac7f059f06b46ec4e360b0a634f5eff172",
                    "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
                }
            }
        }
    }
]

2.3从容器内部拷贝文件

docker cp 容器id:容器内路径 主机目的路径

示例:将容器根路径下的test.html

docker cp 1f8fa87898b3:/test.html /root/

image.png

2.4查看容器内存,cpu等使用情况

docker stats

docker stats后面也可以指定容器id,查询单个容器的使用情况 image.png

2.5小结

image.png