目录

一、Docker介绍

  Docker 是基于 Linux 内核实现,Docker 最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可以提供轻量级的虚拟化 ,可以说 docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,标准的配置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernelbased Virtual Machine Machine) 基于模块实现, 后来Docker改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。

1、Docker的组成

Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点

Docker 服务端(Server): Docker守护进程,运行docker容器

Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API

Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合

Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor

Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程

2、Namespace

  namespace是Linux系统的底层概念,在LInux内核层实现,即有一些不同类型的命名空间被部署在内核,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:


3、Control groups

  Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽 等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操 作)。



二、Centos7基础配置

#修改主机名
[root@c7-docker-node1-71 ~]# hostnamectl set-hostname c7-docker-node1-71

#修改固定IP
[root@c7-docker-node1-71 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE="Ethernet"
BOOTPROTO="none"
IPADDR=172.29.7.11
PREFIX=24
GATEWAY=172.29.7.254
DNS1=114.114.114.114
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"

#重启网卡
[root@c7-docker-node1-71 ~]# nmcli connection reload ;nmcli connection up ens33 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

#修改selinux为警告状态
[root@c7-docker-node1-71 ~]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#Disabled :不启用控制系统。
#permissive:开启控制系统,但是处于警告模式。即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。
#Enforcing:开启控制系统,处于强制状态。一旦违反了策略,就无法继续操作下去。
SELINUX=permissive
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

#动态修改selinux为警告状态
[root@c7-docker-node1-71 ~]# setenforce 0

#永久停止防火墙
[root@c7-docker-node1-71 ~]# systemctl disable --now firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

#修改时区
[root@c7-docker-node1-71 ~]# timedatectl set-timezone Asia/Shanghai

#时间同步
[root@c7-docker-node1-71 ~]# cat /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#修改为阿里云时间服务器
server ntp1.alliyun.com iburst
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

....

#重启、开机自启、查看是否生效
[root@c7-docker-node1-71 ~]# systemctl restart chronyd
[root@c7-docker-node1-71 ~]# systemctl enable --now chronyd
[root@c7-docker-node1-71 ~]# chronyc -n sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 173.255.248.194               0   7     0     -     +0ns[   +0ns] +/-    0ns


三、Docker的安装

1、yum安装

[root@c7-docker-node1-71 ~]# yum list docker --showduplicates 
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.bupt.edu.cn
 * extras: mirrors.bupt.edu.cn
 * updates: mirrors.bupt.edu.cn
Available Packages
docker.x86_64                                                        2:1.13.1-102.git7f2769b.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-103.git7f2769b.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-108.git4ef4b30.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-109.gitcccb291.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-161.git64e9980.el7_8                                                             extras
docker.x86_64                                                        2:1.13.1-162.git64e9980.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-203.git0be3e21.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-204.git0be3e21.el7                                                               extras
docker.x86_64                                                        2:1.13.1-205.git7d71120.el7.centos                                                        extras
docker.x86_64                                                        2:1.13.1-206.git7d71120.el7_9                                                             extras
docker.x86_64                                                        2:1.13.1-208.git7d71120.el7_9                                                             extras
docker.x86_64                                                        2:1.13.1-209.git7d71120.el7.centos 

#官方源下载太慢
#这里换成阿里云的源
#https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.57e31b11OBQGW7

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

2、二进制安装

[root@c7-docker-node1-71 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-19.03.10.tgz
[root@c7-docker-node1-71 ~]# tar xf docker-19.03.10.tgz 

[root@c7-docker-node1-71 ~]# cp docker/* /usr/bin/

[root@c7-docker-node1-71 ~]# dockerd &>/dev/null &

[root@c7-docker-node1-71 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.10
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9424aea
 Built:             Thu May 28 22:11:50 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.10
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       9424aea
  Built:            Thu May 28 22:18:15 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

创造service文件

[root@c7-docker-node1-71 ~]# groupadd docker

#这个service写起来很麻烦建议直接从别的节点使用yum安装 传一份
[root@c7-memcached-61 ~]# scp /lib/systemd/system/docker.service root@172.29.7.71:/lib/systemd/system/
[root@c7-memcached-61 ~]# scp /lib/systemd/system/docker.socket root@172.29.7.71:/lib/systemd/system/
[root@c7-memcached-61 ~]# scp /lib/systemd/system/containerd.service root@172.29.7.71:/lib/systemd/system/

[root@c7-docker-node1-71 ~]# cat /lib/systemd/system/docker.socket 
[Unit]
Description=Docker Socket for the API
Partof=docker.service

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

[root@c7-docker-node1-71 ~]# cat /lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
#OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target

[root@c7-docker-node1-71 ~]# cat /lib/systemd/system/containerd.service 
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

#Type=notify
Delegate=yes
KillMode=process
#Restart=always
#RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
#OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

[root@c7-docker-node1-71 ~]# jobs -l
[1]+  2030 Running                 dockerd &>/dev/null &
[root@c7-docker-node1-71 ~]# kill -9 2030
[root@c7-docker-node1-71 ~]# jobs -l
[1]+  2030 Killed                  dockerd &>/dev/null

[root@c7-docker-node1-71 ~]# systemctl daemon-reload 
[root@c7-docker-node1-71 ~]# systemctl start docker

[root@c7-docker-node1-71 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2024-02-15 18:59:55 CST; 4s ago
     Docs: https://docs.docker.com
 Main PID: 2246 (dockerd)
    Tasks: 12
   Memory: 17.4M
   CGroup: /system.slice/docker.service
           └─2246 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.827705803+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{...dule=grpc
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.827711890+08:00" level=info msg="ClientConn switching balancer to \"pick_firs...dule=grpc
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.844174546+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.845913024+08:00" level=info msg="Loading containers: start."
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.929974315+08:00" level=info msg="Default bridge (docker0) is assigned with an... address"
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.952655935+08:00" level=info msg="Loading containers: done."
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.965499382+08:00" level=info msg="Docker daemon" commit=9424aea graphdriver(s)...=19.03.10
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.965549143+08:00" level=info msg="Daemon has completed initialization"
Feb 15 18:59:55 c7-docker-node1-71 dockerd[2246]: time="2024-02-15T18:59:55.975641078+08:00" level=info msg="API listen on /var/run/docker.sock"
Feb 15 18:59:55 c7-docker-node1-71 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

3、Docker相关信息和优化配置

1.查看 docker 版本

[root@c7-docker-node1-71 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.10
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9424aea
 Built:             Thu May 28 22:11:50 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.10
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       9424aea
  Built:            Thu May 28 22:18:15 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

2.查看docker详解情况

[root@c7-docker-node1-71 ~]# docker info
Client:
 Debug Mode: false  #client 端是否开启 debug

Server:
 Containers: 0  #当前主机运行的容器总数
  Running: 0    #有几个容器是正在运行的
  Paused: 0     #有几个容器是暂停的
  Stopped: 0    #有几个容器是停止的
 Images: 0      #当前服务器的镜像数
 Server Version: 19.03.10   #服务端版本
 Storage Driver: overlay2   #正在使用的存储引擎
  Backing Filesystem: xfs   #后端文件系统,即服务器的磁盘文件系统
  Supports d_type: true #是否支持 d_type
  Native Overlay Diff: true #是否支持差异数据存储
 Logging Driver: json-file  #日志类型,每个容器的标准输出以日志存放
 Cgroup Driver: cgroupfs    #Cgroups 类型
 Plugins:                    #插件
  Volume: local             #卷
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1160.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.682GiB
 Name: c7-docker-node1-71
 ID: F6TP:T6WG:MP7A:EQGU:R46V:X6XD:IADH:ZYWF:VDH4:BXCN:R5OM:5CHX
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

3.查看docker0网卡

[root@c7-docker-node1-71 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:8b:46:ed brd ff:ff:ff:ff:ff:ff
    inet 172.29.7.71/24 brd 172.29.7.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8b:46ed/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:7a:fc:c8:6b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

4.docker的优化

注意:这种方式只对新建的容器有效的,之前的容器不生效

[root@c7-docker-node1-71 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": [
    #这几个地址用一个就行
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    #下面这个地址用自己的阿里云容器加速就行  
    "https://xxxxx.mirror.aliyuncs.com/"
 ],
"hosts": ["unix:///var/run/docker.sock", "tcp://172.29.7.71:2375"], #设置容器hosts
"insecure-registries": ["www.jiutingqiu.com"],  #设置私有仓库地址可以设为http
"exec-opts": ["native.cgroupdriver=systemd"],   #k8s需要改这个
"graph": "/data/docker",  #指定docker数据目录,新版24.0.0不支持,实现:ExecStart=/usr/bin/dockerd --data-root=/data/docker
"max-concurrent-downloads": 10,       #同时下载
"max-concurrent-uploads": 5,      #同时上传
"log-opts": {
   "max-size": "300m",   #指定容器日志文件的最大值
   "max-file": "2"       #指定容器日志文件的个数,循环写入日志文件,即一个日志满,会写入第二个文件
 },
"live-restore": true,     #重载docker守护进程而不重启容器
  "proxies": {           #代理,主要是为了上google等一些网站
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   }
   "tcp://docker-daemon1.example.com": {
     "noProxy": "*.internal.example.net"
   }
 }
}

我的配置

[root@c7-docker-node1-71 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": [
    #感觉不如,,,,不如阿里云
    "http://hub-mirror.c.163.com"
 ],
"graph": "/data/docker",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
   "max-size": "300m",
   "max-file": "2"
 },
"live-restore": true
}

[root@c7-docker-node1-71 ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.10
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1160.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.682GiB
 Name: c7-docker-node1-71
 ID: F6TP:T6WG:MP7A:EQGU:R46V:X6XD:IADH:ZYWF:VDH4:BXCN:R5OM:5CHX
 Docker Root Dir: /data/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  http://hub-mirror.c.163.com/
 Live Restore Enabled: true
 Product License: Community Engine

5.docker开启远程连接

#在docker服务端主机开启远程网络连接功能
[root@c7-memcached-61 ~]# cat /lib/systemd/system/docker.service 
.....
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
.....

[root@c7-memcached-61 ~]# systemctl daemon-reload 
[root@c7-memcached-61 ~]# systemctl restart docker

[root@c7-memcached-61 ~]# ss -tnlp | grep 2375
LISTEN     0      128       [::]:2375                  [::]:*                   users:(("dockerd",pid=2399,fd=3))

[root@c7-docker-node1-71 ~]# docker -H 172.29.7.61 version
Client: Docker Engine - Community
 Version:           19.03.10
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9424aea
 Built:             Thu May 28 22:11:50 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Tue Feb  6 21:16:08 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


四、Docker镜像

镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快 速的创建并启动容器

镜像含里面是一层层的文件系统,叫做 Union FS(联合文件系统),联合文件系统,可以将几层目录挂载 到一起(就像千层饼,洋葱头,俄罗斯套娃一样),形成一个虚拟文件系统,虚拟文件系统的目录结构就 像普通 linux 的目录结构一样,镜像通过这些文件再加上宿主机的内核共同提供了一个 linux 的虚拟环 境,每一层文件系统叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读 (readonly)、读写(readwrite)和写出(whiteout-able),但是镜像中每一层文件系统都是只读的, 构建镜像的时候,从一个最基本的操作系统开始,每个构建提交的操作都相当于做一层的修改,增加了 一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层 把底层遮住了一样,当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层,实际上也不 需要知道里面有几层。


[root@c7-docker-node1-71 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

#查看镜像的分层历史
[root@c7-docker-node1-71 ~]# docker image history nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
605c77e624dd        2 years ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  EXPOSE 80                    0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB              
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB              
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB              
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB               
<missing>           2 years ago         /bin/sh -c set -x     && addgroup --system -…   61.1MB              
<missing>           2 years ago         /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.1        0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.5     0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B                  
<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:09675d11695f65c55…   80.4MB

[root@c7-docker-node1-71 ~]# docker inspect nginx
[
    {
        "Id": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-29T19:28:29.892199479Z",
        "Container": "ca3e48389f7160bc9d9a892d316fcbba459344ee3679998739b1c3cd8e56f7da",
        "ContainerConfig": {
            "Hostname": "ca3e48389f71",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 141479488,
        "VirtualSize": 141479488,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/data/docker/overlay2/c01ea99339280caeb5de5bfecbbb7929b1f5cc9f7490126f1d8a517ae09ee8b0/diff:/data/docker/overlay2/0900c9a29f7f02f0fc184474d4048bbdbbcd2a1d28a3ffe2cf9b1a2339d19a86/diff:/data/docker/overlay2/f9f805dbf1571532b027d7d13895426a781dcfc20e021d8468d84658093957c9/diff:/data/docker/overlay2/6e7c39ad0bcd7ee465f399dc834e4e77d94b5907052557fc56b12bcbc10bc3e1/diff:/data/docker/overlay2/c1229ae8b9d9817231dbbef014eef4ad12bc57d260f51968423250cd19416730/diff",
                "MergedDir": "/data/docker/overlay2/33abf4bad8250758d897a938af3f2d60d8e2527f0a25cdf5f929a25562a6a36f/merged",
                "UpperDir": "/data/docker/overlay2/33abf4bad8250758d897a938af3f2d60d8e2527f0a25cdf5f929a25562a6a36f/diff",
                "WorkDir": "/data/docker/overlay2/33abf4bad8250758d897a938af3f2d60d8e2527f0a25cdf5f929a25562a6a36f/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8",
                "sha256:b8d6e692a25e11b0d32c5c3dd544b71b1085ddc1fddad08e68cbd7fda7f70221",
                "sha256:f1db227348d0a5e0b99b15a096d930d1a69db7474a1847acbc31f05e4ef8df8c",
                "sha256:32ce5f6a5106cc637d09a98289782edf47c32cb082dc475dd47cbf19a4f866da",
                "sha256:d874fd2bc83bb3322b566df739681fbd2248c58d3369cb25908d68e7ed6040a6"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

2、搜索镜像

1.官网

http://hub.docker.com/

2.search命令

[root@c7-docker-node1-71 ~]# docker search nginx
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                              Official build of Nginx.                        19614               [OK]                
bitnami/nginx                      Bitnami nginx Docker Image                      181                                     [OK]
nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                  141                                     
nginxproxy/nginx-proxy             Automated nginx proxy for Docker containers …   131                                     
nginxproxy/acme-companion          Automated ACME SSL certificate generation fo…   130     

#搜索点赞100个以上的镜像
[root@c7-docker-node1-71 ~]# docker search -s 100 centos
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                DESCRIPTION                                 STARS               OFFICIAL            AUTOMATED
centos              DEPRECATED; The official build of CentOS.   7713                [OK]   

3、下载镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像
[root@c7-docker-node1-71 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB

4、查看本地镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
docker images list [OPTIONS] [REPOSITORY[:TAG]]

-q      #仅显示数字ID
-a      #显示所有图像(默认情况下隐藏中间图像)
-f      #查询状态
[root@c7-docker-node1-71 ~]# docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB

[root@c7-docker-node1-71 ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB

[root@c7-docker-node1-71 ~]# docker image ls -q
605c77e624dd
c20987f18b13

[root@c7-docker-node1-71 ~]# docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

5、镜像导出

docker save [OPTIONS] IMAGE [IMAGE...]

-o      #输出到文件

1.导出镜像

[root@c7-docker-node1-71 ~]# docker save mysql:5.7 -o /data/mysql_test.tar
#或
[root@c7-docker-node1-71 ~]# docker save mysql:5.7 > /data/mysql_test.tar

[root@c7-docker-node1-71 ~]# ll /data/mysql_test.tar 
-rw-------. 1 root root 453727744 Feb 16 12:46 /data/mysql_test.tar

2.导出镜像并压缩

[root@c7-docker-node1-71 ~]# docker save mysql:5.7 | gzip - > /data/mysql_test.tar.gz

[root@c7-docker-node1-71 ~]# ll -h /data/mysql_test.tar
-rw-------. 1 root root 433M Feb 16 12:46 /data/mysql_test.tar
[root@c7-docker-node1-71 ~]# ll -h /data/mysql_test.tar.gz 
-rw-r--r--. 1 root root 145M Feb 16 12:49 /data/mysql_test.tar.gz

3.打包所有镜像

[root@c7-docker-node1-71 ~]# docker images | awk 'NR!=1{print $1":"$2}'
nginx:latest
mysql:5.7

[root@c7-docker-node1-71 ~]# docker save `docker images | awk 'NR!=1{print $1":"$2}'` | gzip > /data/all.tar.gz

[root@c7-docker-node1-71 ~]# ll -h /data/all.tar.gz 
-rw-r--r--. 1 root root 197M Feb 16 12:52 /data/all.tar.gz

6、镜像导入

利用docker load命令可以将镜像导出的打包或压缩文件再导入

注意:镜像导入只能支持单个镜像导入,不支持多个镜像导入

docker load [OPTIONS]

-i      #读取tar镜像存档文件

1.镜像导入

[root@c7-docker-node1-71 ~]# scp /data/mysql_test.tar root@172.29.7.61:/root

[root@c7-memcached-61 ~]# docker load -i mysql_test.tar 
#或
[root@c7-memcached-61 ~]# docker load < mysql_test.tar 
ad6b69b54919: Loading layer [==================================================>]  72.55MB/72.55MB
fba7b131c5c3: Loading layer [==================================================>]  338.4kB/338.4kB
0798f2528e83: Loading layer [==================================================>]  9.556MB/9.556MB
a0c2a050fee2: Loading layer [==================================================>]  4.202MB/4.202MB
d7a777f6c3a4: Loading layer [==================================================>]  2.048kB/2.048kB
0d17fee8db40: Loading layer [==================================================>]  53.77MB/53.77MB
aad27784b762: Loading layer [==================================================>]  5.632kB/5.632kB
9b64bb048d04: Loading layer [==================================================>]  3.584kB/3.584kB
35ba198e64f5: Loading layer [==================================================>]  313.2MB/313.2MB
789f3aa31b3f: Loading layer [==================================================>]  17.92kB/17.92kB
e889c671872c: Loading layer [==================================================>]  1.536kB/1.536kB
Loaded image: mysql:5.7
[root@c7-memcached-61 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.7       c20987f18b13   2 years ago   448MB

[root@c7-docker-node1-71 ~]# scp /data/all.tar.gz root@172.29.7.61:/root

[root@c7-memcached-61 ~]# docker load < all.tar.gz 
2edcec3590a4: Loading layer [==================================================>]  83.86MB/83.86MB
e379e8aedd4d: Loading layer [==================================================>]     62MB/62MB
b8d6e692a25e: Loading layer [==================================================>]  3.072kB/3.072kB
f1db227348d0: Loading layer [==================================================>]  4.096kB/4.096kB
32ce5f6a5106: Loading layer [==================================================>]  3.584kB/3.584kB
d874fd2bc83b: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:latest
Loaded image: mysql:5.7

[root@c7-memcached-61 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
mysql        5.7       c20987f18b13   2 years ago   448MB

7、删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]

-f          #强制删除,无论其是否在运行

1.删除指定镜像

[root@c7-docker-node1-71 ~]# docker rmi mysql:5.7
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB

[root@c7-docker-node1-71 ~]# docker image rm nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

2.删除所有镜像

[root@c7-docker-node1-71 ~]# docker rmi -f `docker images -q`
Untagged: nginx:latest
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
Untagged: mysql:5.7
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

3.清除dangling状态的镜像

dangling:悬挂状态

Docker 会在磁盘中保留所有使用过的镜像,即使这些镜像没有正在运行。这样做是为了在本地“缓存”中保留必要的镜像。这本身是没问题的,因为当你想拉取某个依赖于这些镜像的镜像,或者当你想要构建一个镜像时,本地的这些镜像可以直接使用。但同时,这也占用了大量的磁盘空间!

创造dangling状态镜像

[root@c7-docker-node1-71 ~]# docker save 605c77e624dd > /data/dangling_test.tar

[root@c7-docker-node1-71 ~]# docker rmi nginx
[root@c7-docker-node1-71 ~]# docker load -i /data/dangling_test.tar 

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB

清除dangling状态的镜像

[root@c7-docker-node1-71 ~]# docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              605c77e624dd        2 years ago         141MB

[root@c7-docker-node1-71 ~]# docker rmi -f `docker images -q -f dangling=true`
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

8、镜像打标签

docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定的仓库

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB

[root@c7-docker-node1-71 ~]# docker tag mysql:5.7 mysql:5.7_test

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB
mysql               5.7_test            c20987f18b13        2 years ago         448MB


五、容器操作基础命令

1、容器相关命令

[root@c7-docker-node1-71 ~]# docker container

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  inspect     Display detailed information on one or more containers
  kill        Kill one or more running containers
  logs        Fetch the logs of a container
  ls          List containers
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  prune       Remove all stopped containers
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  run         Run a command in a new container
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker container COMMAND --help' for more information on a command.

2、启动容器

1.启动容器

#没有的镜像会自动去镜像仓库下载
[root@c7-docker-node1-71 ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[root@c7-docker-node1-71 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              605c77e624dd        2 years ago         141MB
mysql               5.7                 c20987f18b13        2 years ago         448MB
mysql               5.7_test            c20987f18b13        2 years ago         448MB
hello-world         latest              feb5d9fea6a5        2 years ago         13.3kB

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
6a0a34da1039        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       happy_mahavira

2.启动容器的流程

开始  ----》   Docker在本机寻找镜像   ----》   判断是否有   -----》  没有就去镜像仓库下载,有的话就直接运行

3.启动容器的用法

docker run [选项] [镜像名] [shell命令] [参数]

-i              #Keep STDIN open even if not attached,通常和-t一起使用
-t              #分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
-d              #台后运行
--name          #为容器指定名称
-h              #容器主机名
--rm            #容器退出时自动移除容器
-P              #随机端口映射,容器内部端口随机映射到主机的端口
-p              #指定端口映射,格式为:主机(宿主)端口:容器端口
--dns           #自定义dns服务器
--entrypoint    #指定镜像的默认入口命令
--restart       #可以指定policy
--privileged    #向容器授予扩展权限
-e              #设置环境变量
--ulimit        #指定ulimit限制配置

1 policy

policy 说明
no 默认值为“否”,退出时不自动重新启动容器。
on-failure[:max-retries] 失败时[:max retries]仅当容器以非零值退出时才重新启动退出状态。(可选)限制Docker的重新启动重试次数守护进程尝试。
always 无论退出状态如何,始终重新启动容器。当您指定Docker守护进程总是会尝试无限期地重新启动容器。这个容器也将始终在后台进程启动时启动,而不管容器的当前状态。
nless-stopped 无论退出状态如何,始终重新启动容器,但不要启动它在守护进程启动时,如果容器以前已处于停止状态。

2 容器启动后

注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止
从容器内退出,并停止容器

exit

从容器内退出,且容器不停止

同时按三个键,ctrl+p+q

3 运行容器

#没有指定名字容器,名字是随机的
[root@c7-docker-node1-71 ~]# docker run alpine

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
783bb1faf7c5        alpine              "/bin/sh"           18 seconds ago      Exited (0) 17 seconds ago                       amazing_hugle

4 一次性运行容器

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
cd71a36d853c        alpine              "echo 'Hello World'"   4 seconds ago       Exited (0) 3 seconds ago                       agitated_galois
783bb1faf7c5        alpine              "/bin/sh"              6 minutes ago       Exited (0) 6 minutes ago                       amazing_hugle

5 指定容器名称

[root@c7-docker-node1-71 ~]# docker run --name alpine_node1 alpine
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
294a9c126835        alpine              "/bin/sh"              3 seconds ago        Exited (0) 2 seconds ago                            alpine_node1
cd71a36d853c        alpine              "echo 'Hello World'"   About a minute ago   Exited (0) About a minute ago                       agitated_galois
783bb1faf7c5        alpine              "/bin/sh"              8 minutes ago        Exited (0) 8 minutes ago                            amazing_hugle

6 运行交互式容器并退出

[root@c7-docker-node1-71 ~]# docker run --name alpine_node2 -it alpine sh
/ # exit

#退出后容器也停止了运行

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
399f92419265        alpine              "sh"                   47 seconds ago      Exited (0) 30 seconds ago                       alpine_node2
294a9c126835        alpine              "/bin/sh"              5 minutes ago       Exited (0) 5 minutes ago                        alpine_node1
cd71a36d853c        alpine              "echo 'Hello World'"   7 minutes ago       Exited (0) 7 minutes ago                        agitated_galois
783bb1faf7c5        alpine              "/bin/sh"              13 minutes ago      Exited (0) 13 minutes ago                       amazing_hugle

#使用ctrl+p+q,容器仍处于运行状态
[root@c7-docker-node1-71 ~]# docker run --name alpine_node3 -it alpine sh
/ # [root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
4a620973755d        alpine              "sh"                   8 seconds ago        Up 7 seconds                                        alpine_node3
399f92419265        alpine              "sh"                   About a minute ago   Exited (0) About a minute ago                       alpine_node2
294a9c126835        alpine              "/bin/sh"              5 minutes ago        Exited (0) 5 minutes ago                            alpine_node1
cd71a36d853c        alpine              "echo 'Hello World'"   7 minutes ago        Exited (0) 7 minutes ago                            agitated_galois
783bb1faf7c5        alpine              "/bin/sh"              14 minutes ago       Exited (0) 14 minutes ago                           amazing_hugle

7 设置容器内的主机名

[root@c7-docker-node1-71 ~]# docker run -it --name alpine-node4 -h a-node4-test alpine sh
/ # hostname
a-node4-test
/ # exit

8 一次性运行容器,退出后删除

#先清空一下容器
[root@c7-docker-node1-71 ~]# docker rm -f `docker ps -aq`
b8e4eef7256c
4a620973755d
399f92419265
294a9c126835
cd71a36d853c
783bb1faf7c5

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@c7-docker-node1-71 ~]# 

[root@c7-docker-node1-71 ~]# docker run --rm alpine echo "Hello world" ;docker ps -a
Hello world
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@c7-docker-node1-71 ~]#

9 守护式容器

能够长期运行

无需交互式会话

适合运行应用程序和服务

[root@c7-docker-node1-71 ~]# docker run -d --name nginx_node1 nginx
364b4b4c11684ac43180dbb86366e46cb9bb37fc3d7653ffc3efdc003c155a8d
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
364b4b4c1168        nginx               "/docker-entrypoint.…"   7 seconds ago        Up 7 seconds                    80/tcp

#有些容器后台启动不会持续运行
[root@c7-docker-node1-71 ~]# docker run -d --name alpine_node1 alpine
a9d0f5bc7adb2479f757b4246c6fbee8cae604899da22f6dfbf97ca930b5da26
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
364b4b4c1168        nginx               "/docker-entrypoint.…"   7 seconds ago        Up 7 seconds                    80/tcp              nginx_node1

#可以给他新开一个终端
[root@c7-docker-node1-71 ~]# docker run -d -it --name alpine_node2 alpine sh
16eb6c39a178bc3999a5fd01dff710fb4df32ec1e75bd33af53731341e54db61
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
16eb6c39a178        alpine              "sh"                2 seconds ago       Up 1 second                                     alpine_node2
a9d0f5bc7adb        alpine              "/bin/sh"           56 seconds ago      Exited (0) 55 seconds ago                       alpine_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
16eb6c39a178        alpine              "sh"                5 seconds ago       Up 4 seconds                                    alpine_node2
a9d0f5bc7adb        alpine              "/bin/sh"           59 seconds ago      Exited (0) 58 seconds ago                       alpine_node

10 开机自动运行容器

[root@c7-docker-node1-71 ~]# docker run -d --name nginx --restart=always -p 80:80 nginx
bdd800c3628ab827c48ff6e9d22df2142ef22c3177b826923b93bb8c2476722c

[root@c7-docker-node1-71 ~]# reboot

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                NAMES
bdd800c3628a        nginx               "/docker-entrypoint.…"   8 minutes ago       Up 7 minutes                 0.0.0.0:80->80/tcp   nginx
364b4b4c1168        nginx               "/docker-entrypoint.…"   10 minutes ago      Exited (255) 7 minutes ago   80/tcp               nginx_node1
16eb6c39a178        alpine              "sh"                     11 minutes ago      Exited (255) 7 minutes ago                        alpine_node2
a9d0f5bc7adb        alpine              "/bin/sh"                12 minutes ago      Exited (0) 11 minutes ago                         alpine_node1

11 privileged

使用该参数,container内的root拥有真正的root权限。

否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上 的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。

[root@c7-docker-node1-71 ~]# docker run -it --privileged centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
[root@4cae66450a4f /]# 

[root@4cae66450a4f /]# df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   18G  7.6G   11G  43% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs    1.9G     0  1.9G   0% /sys/fs/cgroup
shm            tmpfs     64M     0   64M   0% /dev/shm
/dev/sda3      xfs       18G  7.6G   11G  43% /etc/hosts
[root@4cae66450a4f /]# mount /dev/sda3 /mnt
[root@4cae66450a4f /]# df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   18G  7.6G   11G  43% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs    1.9G     0  1.9G   0% /sys/fs/cgroup
shm            tmpfs     64M     0   64M   0% /dev/shm
/dev/sda3      xfs       18G  7.6G   11G  43% /mnt

[root@4cae66450a4f /]# echo hello world > /mnt/hello.txt
[root@4cae66450a4f /]# exit

[root@c7-docker-node1-71 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 17.7G  0 part /
sr0     11:0    1 1024M  0 rom  

[root@c7-docker-node1-71 ~]# ls /hello.txt 
/hello.txt

3、查看容器信息

1.显示当前存在的容器

docker ps [OPTIONS]

-a              #显示所有容器(默认显示正在运行)
-q              #仅显示数字ID
-s              #显示文件总大小
-f              #根据提供的条件过滤输出
-l              #显示最新创建的容器(包括所有状态)
-n              #显示上次创建的n个容器(包括所有状态)
[root@c7-docker-node1-71 ~]# docker run -it -d --name nginx_node1 -p 80:80 nginx
4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3

[root@c7-docker-node1-71 ~]# docker run -it -d --name centos_node1 centos
1eb67d0e0c470904cea0a51c59d54a291b15327bfe5ed8ebca2bfa42598e5fd2

[root@c7-docker-node1-71 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1eb67d0e0c47        centos              "/bin/bash"              9 seconds ago       Up 9 seconds                             centos_node1
4a347455e128        nginx               "/docker-entrypoint.…"   45 seconds ago      Up 44 seconds       0.0.0.0:80->80/tcp   nginx_node1

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                NAMES
1eb67d0e0c47        centos              "/bin/bash"              28 seconds ago       Up 28 seconds                                    centos_node1
4a347455e128        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute           0.0.0.0:80->80/tcp   nginx_node1
4cae66450a4f        centos              "/bin/bash"              24 minutes ago       Exited (0) 22 minutes ago                        wonderful_wing

[root@c7-docker-node1-71 ~]# docker ps -q
1eb67d0e0c47
4a347455e128

[root@c7-docker-node1-71 ~]# docker ps -a -s
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                NAMES               SIZE
1eb67d0e0c47        centos              "/bin/bash"              59 seconds ago       Up 58 seconds                                    centos_node1        0B (virtual 231MB)
4a347455e128        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute           0.0.0.0:80->80/tcp   nginx_node1         1.09kB (virtual 141MB)
4cae66450a4f        centos              "/bin/bash"              25 minutes ago       Exited (0) 22 minutes ago                        wonderful_wing      80B (virtual 231MB)

[root@c7-docker-node1-71 ~]# docker ps -f 'status=exited'
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4cae66450a4f        centos              "/bin/bash"         25 minutes ago      Exited (0) 23 minutes ago                       wonderful_wing

2.查看容器内的进程

docker top CONTAINER 
[root@c7-docker-node1-71 ~]# docker top nginx_node1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2989                2972                0                   16:41               pts/0               00:00:00            nginx: master process nginx -g daemon off;
101                 3042                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3043                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3044                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3045                2989                0                   16:41               pts/0               00:00:00            nginx: worker process

3.查看容器资源使用情况

docker stats [OPTIONS] [CONTAINER...]

-a                  #显示所有容器(默认显示正在运行)
[root@c7-docker-node1-71 ~]# docker top nginx_node1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2989                2972                0                   16:41               pts/0               00:00:00            nginx: master process nginx -g daemon off;
101                 3042                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3043                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3044                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
101                 3045                2989                0                   16:41               pts/0               00:00:00            nginx: worker process
[root@c7-docker-node1-71 ~]# 
[root@c7-docker-node1-71 ~]# docker stats centos_node1
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB   0.01%               656B / 0B           0B / 0B             1

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB   0.01%               656B / 0B           0B / 0B             1

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB   0.01%               656B / 0B           0B / 0B             1
^C

[root@c7-docker-node1-71 ~]# docker stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB     0.01%               656B / 0B           0B / 0B             1
4a347455e128        nginx_node1         0.00%               3.102MiB / 3.682GiB   0.08%               656B / 0B           0B / 0B             5

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB     0.01%               656B / 0B           0B / 0B             1
4a347455e128        nginx_node1         0.00%               3.102MiB / 3.682GiB   0.08%               656B / 0B           0B / 0B             5

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB     0.01%               656B / 0B           0B / 0B             1
4a347455e128        nginx_node1         0.00%               3.102MiB / 3.682GiB   0.08%               656B / 0B           0B / 0B             5

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
1eb67d0e0c47        centos_node1        0.00%               524KiB / 3.682GiB     0.01%               656B / 0B           0B / 0B             1
4a347455e128        nginx_node1         0.00%               3.102MiB / 3.682GiB   0.08%               656B / 0B           0B / 0B             5
^C

4.查看容器的详细情况

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
[root@c7-docker-node1-71 ~]# docker inspect nginx_node1
[
    {
        "Id": "4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3",
        "Created": "2024-02-16T08:41:26.648383595Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2989,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-02-16T08:41:27.276326743Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
        "ResolvConfPath": "/data/docker/containers/4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3/resolv.conf",
        "HostnamePath": "/data/docker/containers/4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3/hostname",
        "HostsPath": "/data/docker/containers/4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3/hosts",
        "LogPath": "/data/docker/containers/4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3/4a347455e128a2d7b651b941aa0beba48767c67edc91543192b90ef6b5f765e3-json.log",
        "Name": "/nginx_node1",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {
                    "max-file": "2",
                    "max-size": "300m"
                }
            },
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "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": "/data/docker/overlay2/b44aedd8d241e8edbe2a22e8e4bbe6eb84a3259197240905dec945492dc91493-init/diff:/data/docker/overlay2/dded97b866976ec5f858049db07b621d234379555e724db7104f9921cca7e5a0/diff:/data/docker/overlay2/c6e9fe71b1e2ecf6cf0bd66ebb8f7f90444a5388163fd4d934f219f7a6b47e00/diff:/data/docker/overlay2/d89694dca980205e7db1c36c5d312f2d379f3aae580e7b7c77b676b260df2d24/diff:/data/docker/overlay2/cd2e77a3e57fb7f613fa9eb5d2c135fb10ccf4a54bf8f8f60f9a9ee8328a4d61/diff:/data/docker/overlay2/6da0a344c5c7d42e536153d0a01166225b4373bde49d22c7a3126d92c9ce024c/diff:/data/docker/overlay2/3d33fc75a21355245238578d999b7990f5c1464b0347cefa340451bbcda10e7f/diff",
                "MergedDir": "/data/docker/overlay2/b44aedd8d241e8edbe2a22e8e4bbe6eb84a3259197240905dec945492dc91493/merged",
                "UpperDir": "/data/docker/overlay2/b44aedd8d241e8edbe2a22e8e4bbe6eb84a3259197240905dec945492dc91493/diff",
                "WorkDir": "/data/docker/overlay2/b44aedd8d241e8edbe2a22e8e4bbe6eb84a3259197240905dec945492dc91493/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "4a347455e128",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "f226c9273d6b50671b37cbbf5a92b96ed1f31ce4d6042432328ed2bdd1679fc0",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/f226c9273d6b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "6d222554d3d17c4dfdc89533ca77466a003519733287ea876719d763f49c2bed",
            "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": "8516248ce899d0f4e422088cf3c204579b6adb13f8b337dc919e0ea89d7e3702",
                    "EndpointID": "6d222554d3d17c4dfdc89533ca77466a003519733287ea876719d763f49c2bed",
                    "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
                }
            }
        }
    }
]

4、删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]

-f              #强制删除
-v              #删除与容器关联的卷

#删除停止的容器
docker container prune [OPTIONS]

-f              #强制删除
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
1eb67d0e0c47        centos              "/bin/bash"              29 minutes ago      Up 29 minutes                                    centos_node1
4a347455e128        nginx               "/docker-entrypoint.…"   29 minutes ago      Up 29 minutes               0.0.0.0:80->80/tcp   nginx_node1
4cae66450a4f        centos              "/bin/bash"              53 minutes ago      Exited (0) 51 minutes ago                        wonderful_wing
[root@c7-docker-node1-71 ~]# docker rm -f 4cae
4cae
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1eb67d0e0c47        centos              "/bin/bash"              29 minutes ago      Up 29 minutes                            centos_node1
4a347455e128        nginx               "/docker-entrypoint.…"   30 minutes ago      Up 30 minutes       0.0.0.0:80->80/tcp   nginx_node1

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1eb67d0e0c47        centos              "/bin/bash"              29 minutes ago      Up 29 minutes                            centos_node1
4a347455e128        nginx               "/docker-entrypoint.…"   30 minutes ago      Up 30 minutes       0.0.0.0:80->80/tcp   nginx_node1
[root@c7-docker-node1-71 ~]# docker rm -f centos_node1
centos_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   30 minutes ago      Up 30 minutes       0.0.0.0:80->80/tcp   nginx_node1

5、容器的停止与启动

docker start|stop|restart|pause|unpause 容器ID

pause暂停
unpause恢复
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   31 minutes ago      Up 31 minutes       0.0.0.0:80->80/tcp   nginx_node1
[root@c7-docker-node1-71 ~]# docker stop nginx_node1
nginx_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   32 minutes ago      Exited (0) 3 seconds ago                       nginx_node1

[root@c7-docker-node1-71 ~]# docker start nginx_node1
nginx_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   32 minutes ago      Up 4 seconds        0.0.0.0:80->80/tcp   nginx_node1

[root@c7-docker-node1-71 ~]# docker pause nginx_node1
nginx_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   34 minutes ago      Up About a minute (Paused)   0.0.0.0:80->80/tcp   nginx_node1

[root@c7-docker-node1-71 ~]# docker unpause nginx_node1
nginx_node1
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   34 minutes ago      Up 2 minutes        0.0.0.0:80->80/tcp   nginx_node1

6、给正在运行的容器发信号

docker kill [OPTIONS] CONTAINER [CONTAINER...]

7、进入正在运行的容器

注意:容器只有正在运行状态时,才能进入

1.使用attach命令

docker attach [OPTIONS] CONTAINER

docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器
[root@c7-docker-node1-71 ~]# docker attach nginx_node1
2024/02/16 09:17:45 [notice] 26#26: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 23#23: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 25#25: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 1#1: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 24#24: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 26#26: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 24#24: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 23#23: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 1#1: signal 28 (SIGWINCH) received
2024/02/16 09:17:45 [notice] 25#25: signal 28 (SIGWINCH) received

2.使用exec命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

在运行中的容器启动新进程,可以执行单次命令,以及进入容器
测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式
[root@c7-docker-node1-71 ~]# docker exec -it nginx_node1 sh
# exit

#容器不停止运行
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4a347455e128        nginx               "/docker-entrypoint.…"   38 minutes ago      Up 5 minutes        0.0.0.0:80->80/tcp   nginx_node1

8、暴露所有容器端口

docker run -P

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务

docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化
[root@c7-docker-node1-71 ~]# docker run -it -P --name nginx_node2 nginx

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
6f3c83529b9c        nginx               "/docker-entrypoint.…"   20 seconds ago      Up 19 seconds       0.0.0.0:32768->80/tcp   nginx_node2
4a347455e128        nginx               "/docker-entrypoint.…"   About an hour ago   Up 37 minutes       0.0.0.0:80->80/tcp      nginx_node1

端口映射的本质就是利用NAT技术实现的

[root@c7-docker-node1-71 ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 1 packets, 71 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   104 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 1 packets, 71 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
    2   293 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:80
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.3           172.17.0.3           tcp dpt:80

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:32768 to:172.17.0.3:80

9、指定端口映射

docker run -p

注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同
[root@c7-docker-node1-71 ~]# docker run -it -d --name nginx_node1 -p 80:80 nginx

[root@c7-docker-node1-71 ~]# docker run -it -d --name nginx_node3 -p 81:80 nginx
7338198112b4423ab531acbf7e0bf81064dee11676e26c872018fded390bf039

[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
7338198112b4        nginx               "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds        0.0.0.0:81->80/tcp      nginx_node3
6f3c83529b9c        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx_node2
4a347455e128        nginx               "/docker-entrypoint.…"   About an hour ago   Up 40 minutes       0.0.0.0:80->80/tcp      nginx_node1

10、查看容器的日志

docker logs 

可以查看容器中运行的进程在控制台的标准输出和标准错误,一般对应是日志信息
[root@c7-docker-node1-71 ~]# docker logs nginx_node3
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/02/16 09:54:37 [notice] 1#1: using the "epoll" event method
2024/02/16 09:54:37 [notice] 1#1: nginx/1.21.5
2024/02/16 09:54:37 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2024/02/16 09:54:37 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
2024/02/16 09:54:37 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/02/16 09:54:37 [notice] 1#1: start worker processes
2024/02/16 09:54:37 [notice] 1#1: start worker process 31
2024/02/16 09:54:37 [notice] 1#1: start worker process 32
2024/02/16 09:54:37 [notice] 1#1: start worker process 33
2024/02/16 09:54:37 [notice] 1#1: start worker process 34

[root@c7-docker-node1-71 ~]# docker logs --tail 3 nginx_node3
2024/02/16 09:54:37 [notice] 1#1: start worker process 32
2024/02/16 09:54:37 [notice] 1#1: start worker process 33
2024/02/16 09:54:37 [notice] 1#1: start worker process 34

11、容器内部的hosts文件

容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP

[root@c7-docker-node1-71 ~]# docker run -it --name centos_node1 centos
[root@d02817a3897e /]# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5  d02817a3897e

修改容器的 hosts文件

[root@c7-docker-node1-71 ~]# docker run -it --rm --add-host www.jiutingqiu.com:172.29.7.45 --name centos_node2 centos
[root@f5cff7ef2979 /]# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.29.7.45 www.jiutingqiu.com
172.17.0.5  f5cff7ef2979
#配置文件指定DNS和搜索domain名
[root@c7-docker-node1-71 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": [
    "https://si7y70hh.mirror.aliyuncs.com/" 
 ],
"dns" : ["114.114.114.114", "119.29.29.29"],
"graph": "/data/docker",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
   "max-size": "300m",
   "max-file": "2"
 },
"live-restore": true
}

[root@c7-docker-node1-71 ~]# systemctl restart docker

12、指定容器 DNS

容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址

将dns地址配置在宿主机
在容器启动时加选项 --dns=x.x.x.x
在/etc/docker/daemon.json 文件中指定

1.命令行指定dns

[root@c7-docker-node1-71 ~]# docker run -it --rm --dns 8.8.8.8 centos bash
[root@d434622d57be /]# cat /etc/resolv.conf 
nameserver 8.8.8.8

2.配置文件指定DNS和搜索domain名

[root@c7-docker-node1-71 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": [
    "https://si7y70hh.mirror.aliyuncs.com/" 
 ],
"dns" : ["114.114.114.114", "119.29.29.29"],
"graph": "/data/docker",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
   "max-size": "300m",
   "max-file": "2"
 },
"live-restore": true
}

[root@c7-docker-node1-71 ~]# systemctl restart docker

[root@c7-docker-node1-71 ~]# docker run -it --rm  centos bash
[root@1e79cfe0f639 /]# cat /etc/resolv.conf 
nameserver 114.114.114.114
nameserver 119.29.29.29

13、容器内和宿主机之间复制文件

不论容器的状态是否运行,复制都可以实现

#将容器内文件复制到宿主机
[root@c7-docker-node1-71 ~]# docker cp -a centos:/etc/hosts .

[root@c7-docker-node1-71 ~]# cat hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  758b3123ca54

#将宿主机文件复制到容器内
[root@c7-docker-node1-71 ~]# docker cp -a /etc/resolv.conf centos:/tmp/
[root@c7-docker-node1-71 ~]# docker start centos
centos
[root@c7-docker-node1-71 ~]# docker exec -it centos sh
sh-4.4# cat /tmp/resolv.conf 
# Generated by NetworkManager
nameserver 114.114.114.114

14、传递环境变量

有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现

[root@c7-docker-node1-71 ~]# docker run --name mysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7
a9b2a23d8005c5b5bfbb237b0afc53f8df3dd96f0e85a7d988b7e0ac38207977

[root@c7-docker-node1-71 ~]# docker exec -it mysql bash
root@a9b2a23d8005:/# mysql -u root -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

15、导出和导出容器文件系统

docker export 和 docker save 都可以用于将 Docker 的内容导出到本地文件系统,但是它们用途和效果是不同的
docker export:此命令是用于将一个运行的或者停止的容器的文件系统导出为一个 tar 归档文件。需要注意的是, docker export 不会包含该容器的历史(也就是每个层的变更),并且也不会包含容器的环境变量、元数据和其他相关的配置信息。这意味着如果你导入一个用 docker export 导出的 tar 文件并运行,你得到的将是一个新的、干净的容器,没有之前容器的运行历史和配置。
save:此命令用于将一个或多个镜像导出为一个 tar 归档文件。与 docker export 不同,docker save 会完整地保存镜像的所有内容,包括每一层的变更、所有的元数据、所有的标签等。这意味着如果你导入一个用 docker save 导出的 tar 文件并运行,你得到的将是一个与原镜像完全一样的新镜像,包括所有的历史和配置。
[root@c7-docker-node1-71 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
a9b2a23d8005        mysql:5.7           "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
758b3123ca54        centos              "/bin/bash"              7 minutes ago       Up 5 minutes                                            centos
[root@c7-docker-node1-71 ~]# docker export mysql -o mysql.tar
[root@c7-docker-node1-71 ~]# scp mysql.tar root@172.29.7.61:/root
root@172.29.7.61's password: 
mysql.tar                                                                                                                          100%  427MB  85.3MB/s   00:05

[root@c7-memcached-61 ~]# docker import mysql.tar mysql:test
sha256:27d77c66c4c7740f8f675770c2900e5d9c9798f4a919e760bcbad7e9ee01e9cb
[root@c7-memcached-61 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        test      27d77c66c4c7   9 seconds ago   442MB
<none>       <none>    605c77e624dd   2 years ago     141MB
mysql        5.7       c20987f18b13   2 years ago     448MB
[root@c7-memcached-61 ~]# docker run -it -d --name mysql_test mysql:test bash
d9c1e115d0e708fe05b4034d7250796927d514c77015dc130179c77785c34e27
[root@c7-memcached-61 ~]# docker exec -it mysql_test bash
root@d9c1e115d0e7:/# 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注