docker
官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
Docker基本组成
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
docker安装
uname -r :查看内核版本
查看系统版本
[root@shuju ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
卸载旧版本
旧版本的 Docker 被称为 或 .如果已安装这些项,请将其以及关联的依赖项一起卸载。docker
docker-engine
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装方法
您可以根据需要以不同的方式安装 Docker 引擎:
-
大多数用户设置 Docker 存储库并从中进行安装,以便于安装和升级任务。这是推荐的方法。
-
某些用户下载 RPM 包并手动安装,并完全手动管理升级。这在诸如在无法访问互联网的气隙系统上安装Docker之类的情况下非常有用。
-
在测试和开发环境中,一些用户选择使用自动化的便利脚本来安装 Docker。
使用存储库安装
在新的主机上首次安装 Docker 引擎之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 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(国外的很慢)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里云docker镜像)
安装 Docker 引擎
1、安装最新版本的 Docker 引擎、容器化和 Docker Compose,或转到下一步以安装特定版本:
yum makecache fast :更新yum软件包索引
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker-ce 社区版 ee企业版
docker-compose-plugin 管理多个docker容器的工具,其中管理包括:下载镜像、创建容器和删除容器。
2、若要安装特定版本的 Docker 引擎,请在存储库中列出可用版本,然后选择并安装:
一个。列出存储库中可用的版本并对其进行排序。此示例按版本号(从最高到最低)对结果进行排序,并截断:
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
返回的列表取决于启用了哪些储存库,并且特定于您的 CentOS 版本(由本示例中的后缀指示)。.el7
b.按特定版本的完全限定包名称安装特定版本,该名称是包名 () 加上版本字符串(第 2 列),从第一个冒号 () 开始,直到第一个连字符,用连字符 () 分隔。例如。docker-ce
:
-
docker-ce-18.09.1
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin
此命令安装 Docker,但不会启动 Docker。它还会创建一个组,但是,默认情况下,它不会向该组添加任何用户。
启动docker
systemctl start docker
查看docker
[root@shuju ~]# docker version
Client: Docker Engine - Community
Version: 20.10.15
API version: 1.41
Go version: go1.17.9
Git commit: fd82621
Built: Thu May 5 13:16:58 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.15
API version: 1.41 (minimum version 1.12)
Go version: go1.17.9
Git commit: 4433bf6
Built: Thu May 5 13:15:18 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.4
GitCommit: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
runc:
Version: 1.1.1
GitCommit: v1.1.1-0-g52de29d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
运行测试
[root@shuju ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally #在image没有找到hello-world:latest
latest: Pulling from library/hello-world #去仓库里下载镜像
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest
Hello from Docker! #出项这个则表示docker安装成功
查看一下下载的hello-world 镜像
[root@shuju ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
IMAGE ID 镜像id
TAG 版本
卸载docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
阿里云镜像加速
https://cr.console.aliyun.com/
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker启动流程
运行原理
基本命令
命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
帮助命令:
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
镜像命令:
docker images 查看本地主机的所有镜像
列表参数介绍:
# 解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
docker search 搜索镜像
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
[root@shuju ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12527 [OK]
mariadb MariaDB Server is a high performing open sou… 4819 [OK]
docker pull 镜像名[:tag] 下载镜像 # :后为版本 不加:默认laster 最新版
[root@shuju ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
4be315f6562f: Pull complete #分层下载 若下载过其他版本 可能有的已经下载就不用再下载了
96e2eb237a1b: Pull complete
8aa3ac85066b: Pull complete
ac7e524f6c89: Pull complete
f6a88631064f: Pull complete
15bb3ec3ff50: Pull complete
ae65dc337dcb: Pull complete
a4c4c43adf52: Pull complete
c6cab33e8f91: Pull complete
2e1c4f2c43f6: Pull complete
2e5ee322af48: Pull complete
Digest: sha256:e767595ba3408fbb2dda493be3594b9a148178df58325fafe8b0363662935624 #签名
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 #真实地址
[root@shuju ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
4be315f6562f: Already exists
96e2eb237a1b: Already exists
8aa3ac85066b: Already exists
ac7e524f6c89: Already exists
f6a88631064f: Already exists
15bb3ec3ff50: Already exists
ae65dc337dcb: Already exists
573c3c7fa18d: Pull complete
9d10771b98b8: Pull complete
3d8ef442614b: Pull complete
7dc17a6cea26: Pull complete
752752efdaea: Pull complete
Digest: sha256:2dafe3f044f140ec6c07716d34f0b317b98f8e251435abd347951699f7aa3904
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
docker rmi 删除镜像
docker rmi -f 镜像id( docker images 的 IMAGE ID)
docker rmi -f 镜像id 镜像id 镜像id
docker rmi -f $(docker images -aq) #删除全部镜像 -aq 查出所有的IMAGE ID
容器命令
有了镜像才可以创建容器
新建容器并启动
docker run [可选参数] image 运行容器
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字 mysql1 mysql2 用与区分
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
( -p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口)
-P 随机指定端口(大写的P)
测试 it 交互运行进入容器 主机名为镜像id 974ea1790952
[root@shuju ~]# docker run -it centos /bin/bash
[root@974ea1790952 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
exit 退出容器 停止并退出容器(后台方式运行则仅退出)
[root@974ea1790952 /]# exit
exit
#Ctrl+P+Q 不停止容器退出
docker ps列出运行的容器
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录和列出当前正在运行的容器
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和重启容器命令
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
docker ps -查询存在的容器
后台启动容器 容器后台运行必须要有一个前台进程
docker 发现没有应用 就会自动停止
docker run -d nginx或者centos等 没有前台程序会直接退出
查看日志
docker logs
常用:
docker logs -tf 容器id (全部日志)(-t :显示日志时间 -f :动态显示日志)
docker logs --tail number 容器id #num为要显示的日志条数 只显示十条的内容 加上-tf 显示时间和内容(先显示设的条数)之后动态显示日志
[root@shuju ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 1;done"
40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69
[root@shuju ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40d8008a2f19 centos "/bin/sh -c 'while t…" 4 seconds ago Up 4 seconds tender_montalcini
显示日志
docker logs -tf -tail 10 40d8008a2f19
查看容器中的进程信息
docker top 40d8008a2f19(容器id)
UID PID PPID C STIME TTY TIME CMD
root 81879 81858 0 04:05 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 1;done
root 85437 81879 0 04:13 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看容器元数据
docker inspect 容器id
[
{
"Id": "40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69",
"Created": "2022-05-09T20:05:38.00490326Z",
"Path": "/bin/sh", #控制台
"Args": [ #传递的参数
"-c",
"while true;do echo hi;sleep 1;done"
],
"State": { #状态
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 81879,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-05-09T20:05:38.853427147Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", #镜像来源
"ResolvConfPath": "/var/lib/docker/containers/40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69/hostname",
"HostsPath": "/var/lib/docker/containers/40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69/hosts",
"LogPath": "/var/lib/docker/containers/40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69/40d8008a2f197f8b31b0cff69eb6eb136627fcd61f74e9f92b9e89c2cebf9d69-json.log",
"Name": "/tender_montalcini",
"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,
"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/d9a9b8fa87db953e7c4c116b201c10feaf6d8fd38a25ed6ee68545278281cbaf-init/diff:/var/lib/docker/overlay2/c7b2f533f01c967e329036d492707cc48a71b788869d61c5098bce0b3f355d7f/diff",
"MergedDir": "/var/lib/docker/overlay2/d9a9b8fa87db953e7c4c116b201c10feaf6d8fd38a25ed6ee68545278281cbaf/merged",
"UpperDir": "/var/lib/docker/overlay2/d9a9b8fa87db953e7c4c116b201c10feaf6d8fd38a25ed6ee68545278281cbaf/diff",
"WorkDir": "/var/lib/docker/overlay2/d9a9b8fa87db953e7c4c116b201c10feaf6d8fd38a25ed6ee68545278281cbaf/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "40d8008a2f19",
"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 hi;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": "519dd207ba998b9099c5cf33d7ce9a2dff1742441a9bcb9f6284cfe8ef0fbdc7",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/519dd207ba99",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "b38c9e8efc8a1572e1b0859f5dff520f46a13f8ebc59a984f469430ef267c7d5",
"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": "d3b2966f1caa628888dbcbb026af64f1efc9961ba26c9ac629c97fd885409581",
"EndpointID": "b38c9e8efc8a1572e1b0859f5dff520f46a13f8ebc59a984f469430ef267c7d5",
"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
}
}
}
}
]
进入当前正在运行的容器
1、docker exec -it 容器id bashshell
[root@shuju ~]# docker exec -it 40d8008a2f19 /bin/bash
[root@40d8008a2f19 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
2、docker attach 容器id
[root@shuju ~]# docker attach 40d8008a2f19 #进入正在运行的终端
hi
hi
hi
hi
hi
hi
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker attach 进入容器正在执行的终端,不会启动新的进程
拷贝容器文件到主机
docker cp 容器id:容器内路径 目的主机路径
[root@shuju ~]# docker attach c877896a9023
[root@c877896a9023 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c877896a9023 /]# cd /home
[root@c877896a9023 home]# ls
[root@c877896a9023 home]# touch feng1
[root@c877896a9023 home]# exit
exit
[root@shuju ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@shuju ~]# docker cp c877896a9023:/home/feng1 /root
[root@shuju ~]# ls
anaconda-ks.cfg feng1 feng100
[root@shuju ~]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构