当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载,如果不指定版本,默认下载最新的版本。也可以通过配置,使用自定义的镜像仓库。
使用 docker images 或者 docker image ls来列出本地主机上的镜像:
docker images
docker image ls
选项说明:
使用docker tag命令为本地镜像任意添加新的标签。当TAG为
如:添加一个新的myubuntu:latest镜像:
docker tag ubuntu:18.04 myubuntu:latest
注意:可以注意到ID的相同的,docker tag命令添加的标签实际上起到了类似链接的作用。
如TAG为
docker tag d1165f221234 hello-world:old_image
注意:此时直接为该镜像打上了标签。
docker inspect ubuntu:18.04
执行结果:
[root@dgw-machine ~]# docker inspect ubuntu:18.04
[
{
"Id": "sha256:3941d3b032a8168d53508410a67baad120a563df67a7959565a30a1cb2114731",
"RepoTags": [
"myubuntu:latest",
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b"
],
"Parent": "",
"Comment": "",
"Created": "2023-03-08T03:22:44.73196058Z",
"Container": "ee3fcc8c88d3f3129f1236850de28a7eba0da7c548a7b23a6495905ebcf255ea",
"ContainerConfig": {
"Hostname": "ee3fcc8c88d3",
"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",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"Image": "sha256:b64649bc9d1a48300ec5a929146aa3c5ca80046f74c33aa5de65a7046f5177a6",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.version": "18.04"
}
},
"DockerVersion": "20.10.12",
"Author": "",
"Config": {
"Hostname": "",
"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/bash"
],
"Image": "sha256:b64649bc9d1a48300ec5a929146aa3c5ca80046f74c33aa5de65a7046f5177a6",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.version": "18.04"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 63146040,
"VirtualSize": 63146040,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/16361f3b03baee1bac13d5476160ddb296b800caec61cebd427b24a32b758e42/merged",
"UpperDir": "/var/lib/docker/overlay2/16361f3b03baee1bac13d5476160ddb296b800caec61cebd427b24a32b758e42/diff",
"WorkDir": "/var/lib/docker/overlay2/16361f3b03baee1bac13d5476160ddb296b800caec61cebd427b24a32b758e42/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:b7e0fa7bfe7f9796f1268cca2e65a8bfb1e010277652cee9a9c9d077a83db3c4"
]
},
"Metadata": {
"LastTagTime": "2023-05-14T11:50:51.28460608+08:00"
}
}
]
上述命令返回的是一个json格式的信息,如果只需要其中某条信息时,可以使用-f指定。
如获取镜像的RootFS:
docker inspect -f {{".RootFS"}} ubuntu:18.04
docker inspect -f {{".RootFS.Type"}} ubuntu:18.04
docker history ubuntu:18.04
过长的命令被自动截断了,可以添加--no-trunc命令:
以查找mysql为例:
docker search mysql
参数介绍:
支持的命令主要包括:
示例如下:
# 搜索官方提供的
docker search --filter=is-official=true mysql
docker search -f=is-official=true mysql
docker search -f is-official=true mysql
#搜索收藏数超过4的
docker search -f stars=100 mysql
使用如下命令:
docker [image] pull NAME[:TAG]
其中:NAME是镜像仓库名称,TAG是镜像的标签。
对于docker镜像来说,如果不显示指定 TAG,则默认会选择latest标签,这样会下载仓库中最新版本的镜像。
docker pull mysql
docker pull ubuntu:18.04
sudo docker image rm 镜像名或镜像ID
sudo docker image rm hello-world
sudo docker image rm fce289e99eb9
注意:删除的前提是:这个对象没有创建容器。镜像正在运行时是不能删除的。需要先把容器给stop、删除,然后再删除镜像。
使用docker rmi或者docker image rm命令可以删除镜像。
支持的选项:
docker rmi myubuntu:latest
注意:当镜像只剩下一个标签的时候,docker rmi会彻底的删除镜像。
docker image rm fce289e99eb9
当使用docker rmi ID命令时,会先尝试删除该ID所有指向的镜像标签,然后再删除该镜像本身。
注意:通常不推荐使用-f参数来强制删除一个存在的容器依赖的镜像。正确的做法是先删除依赖该镜像的所有容器,再删除该镜像。
使用docker 一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有使用的镜像,可以通过docker image prune命令来进行清理。
支持的选项包括:
如下命令-f会自动清理临时的遗留镜像文件层,最后提示释放的存储空间。
docker image prune -f
docker image prune -a
针对ubantu镜像,是否可以在里面安装一些软件,然后再生成一个新的镜像呢?这就需要重新commit出一个新的镜像。
以ubantu镜像为例:
首先run一个ubantu容器,同时在里面进行apt-get update更新操作:
docker run -it ubuntu:latest
apt-get update
创建镜像主要有三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
命令格式:
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
实例操作:
首先下载一个镜像,以Ubuntu最新镜像为例:
然后启动镜像,并在其中进行修改操作:
docker run -it ubuntu:latest /bin/bash
记住容器的id:18db64bd342f,也可以通过下面命令查看:
使用docker commit命令提交一个镜像:
docker commit -m "Added a new file" -a "dgw" 18db64bd342f test:1.0
可以直接从一个操作系统模板文件中导入一个镜像。
注意:
可以使用docker save命令将镜像导出到本地文件。
命令参数:
使用tag导出:
docker save -o ubuntu_18.04.tar ubuntu:latest
docker save > ubuntu_18.04_2.tar ubuntu:latest
使用id导出:
docker save > ubuntu_18.04_3.tar 6b7dfa7e8fdb
之后用户就可以复制.tar文件将镜像分享给别人。
使用docker load命令将导出的tar文件再导入到本地镜像库。
支持的参数:
docker load -i ubuntu_18.04.tar
这将导入镜像和相关的元数据信息(包括标签等)。导入成功后,可以使用docker images命令进行查看,与原镜像一致。
可以使用docker push 命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。
在生产环境中,为了提高容器的高可用性和安全性,一方面要合理利用资源限制参数来管理容器的资源消耗;另一方面要指定合适的容器重启策略,来自动重启退出的容器。此外,还可以使用HAProxy等辅助工具来处理负载均衡,自动切换故障的应用容器。
可以使用docker create命令新建一个容器。
docker create -it ubuntu:18.04
注意:使用docker create命令创建的容器处于停止状态,可以使用docker start命令来启动它。
可以使用docker start命令来启动一个已经创建的容器。
docker start id
可以使用docker run命令直接新建并启动容器。
docker run等价于先执行docker create命令,再执行docker start命令。
示例:(输出一个hello world,然后容器自动停止)
docker run ubuntu:18.04 /bin/echo "Hello world"
注意:如果镜像不指定版本号,默认是latest,若不存在的话会自动下载。
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
启动一个bash终端,允许用户进行交互:
docker run -it ubuntu:18.04 /bin/bash
其中:
在交互式模式下,用户可以通过创建的终端来输入命令:
可以使用Ctrl+d或输入exit命令来退出容器。
对于所创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。
可以使用docker container wait CONTAINER[CONTAINER....]子命令来等待容器退出,并打印退出返回结果。
某些时候,执行docker [container] run时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
使用docker restart命令重启容器。
大部分时候需要Docker容器以守护态在后台运行,可以添加 -d 来实现。
docker run -d ubuntu:18.04 /bin/bash -c "while true; do echo hello world; sleep 1; done"
要获取容器的输出信息,可以使用docker logs命令。
docker logs --help
docker logs -t dbef38912874
可以使用docker pause 命令来暂停一个运行中的容器。
示例:启动一个容器,然后将其暂停
docker run -d --name test_pause ubuntu:18.04 /bin/bash -c "while true; do echo hello world; sleep 1; done"
docker pause test_pause
处于pause状态的容器,可以使用docker unpause命令来恢复到运行状态:
docker unpause test_pause
使用docker stop 命令来终止一个正在运行的容器。
该命令会首先发送SIGTERM信号,等待一段超时时间后(默认是10s),再发送SIGKILL信号来终止容器。
docker stop id
加上-f
之后是可以强制停止容器的。
docker rm -f fcf727bda146
执行docker container prune命令,会自动清除掉所有处于停止状态的容器。
docker container prune
还可以使用docker kill 直接发送SIGKILL信号来强行终止容器。
可以使用docker ps -qa命令来查看所有容器的ID。
docker ps -qa
可以使用docker start命令启动处于停止状态的容器。
也可以使用docker restart命令重新启动容器。先将一个运行的容器终止,然后再重新启动。
docker restart 67b354e0d141
attach命令是Docker官方自带的命令。
docker run -itd ubuntu:18.04
docker ps
docker attach intelligent_fermi
注意:当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
注意:使用docker attach进入时,当使用exit退出时容器也跟着停止了。
可以在运行中容器内直接执行任意命令。
docker exec -it intelligent_fermi /bin/bash
通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。
注意:当退出容器时,不会导致容器的停止。
可以使用docker rm 命令来删除处于终止或者退出状态的容器。
默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能册删除还处于运行状态的容器。
docker rm practical_jemison
如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。或者也可以先stop容器,然后再rm删除容器。
docker rm -f intelligent_fermi
可以导出一个已经创建的容器到一个文件中,不管此时这个容器是否处于运行状态。
docker export -o ubuntu_hello_world.tar 0e3f62f364a3
或者
docker export 0e3f62f364a3 > ubuntu_hello_world2.tar
其中,-o选项来指定导出的.tar文件名 ,也可以直接通过重定向来实现。
之后,就可以将导出的.tar文件传输到别的机器上,然后通过导入命令到系统中,实现容器的迁移。
注意:导出容器的时候,容器无需关闭
导出的文件可以通过docker import 命令导入变成镜像。
docker import --help
可以通过-c,--change=[ ]选项在导入的同时执行对容器进行修改的Dockerfile文件。
docker import ubuntu_hello_world.tar test/ubuntu:v1
docker load命令和docker import命令类似。实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import 命令来导入一个容器快照到本地镜像仓库。二者的区别:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保留容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
# 查看正在运行的容器
sudo docker container ls
# 查看所有的容器
sudo docker container ls --all
docker ps
可以使用docker container inspect命令查询详情,会以json格式返回包括容器的id、创建时间、路径、状态、镜像、配置等在内的各项信息。
docker container inspect eloquent_robinson
[root@dgw-machine ~]# docker container inspect eloquent_robinson
[
{
"Id": "0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7",
"Created": "2023-05-21T05:06:52.230375082Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 11785,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-21T05:06:52.554615834Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:e28a50f651f9eefbc8883ddc64704d609f3d95bf1ea9e41f873a8da68ea5ec98",
"ResolvConfPath": "/var/lib/docker/containers/0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7/hostname",
"HostsPath": "/var/lib/docker/containers/0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7/hosts",
"LogPath": "/var/lib/docker/containers/0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7/0e3f62f364a357fae84b577379c67ed78ff485c1a855fa9cee004f8fc0f30ff7-json.log",
"Name": "/eloquent_robinson",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
27,
166
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/255e8f6f55b45d7614bd012fcc0d2f8efdd1a44d3564d5ab0ab90da041867b2c-init/diff:/var/lib/docker/overlay2/d2db9613f837932d77d6dc5a11090e59704626d4358161a1ae364967bde28315/diff",
"MergedDir": "/var/lib/docker/overlay2/255e8f6f55b45d7614bd012fcc0d2f8efdd1a44d3564d5ab0ab90da041867b2c/merged",
"UpperDir": "/var/lib/docker/overlay2/255e8f6f55b45d7614bd012fcc0d2f8efdd1a44d3564d5ab0ab90da041867b2c/diff",
"WorkDir": "/var/lib/docker/overlay2/255e8f6f55b45d7614bd012fcc0d2f8efdd1a44d3564d5ab0ab90da041867b2c/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "0e3f62f364a3",
"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/bash",
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Image": "ubuntu:18.04",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "11f5f2a64705ba6ef8419547bb0bbb3aacba5a68288de1b1ad2e092656484ca6",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/11f5f2a64705",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "2a6e6d63a0ff4d1cbfa4da9ad5353c7cc32acf7e5015a064f6b5d40c82472922",
"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": "63bc5376b3ecf16d0d60b4952199d183cd553485dfebe9de3b65927f9e98b28c",
"EndpointID": "2a6e6d63a0ff4d1cbfa4da9ad5353c7cc32acf7e5015a064f6b5d40c82472922",
"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
}
}
}
}
]
使用top方法查看容器内进程,类似于Linux系统中的top命令。会打印出容器内的进程信息,包括PID、用户、时间、命令等。
docker top eloquent_robinson
使用stats命令查看统计信息,会显示CPU、内存、存储、网络等使用情况的统计信息。
docker stats eloquent_robinson
container cp命令支持在容器和主机之间复制文件。
将容器中数据复制到宿主机上:
docker cp eloquent_robinson:/tmp .
将宿主机上数据复制到容器中:
docker cp 111.txt eloquent_robinson:/tmp
docker diff查看容器内文件系统的变更。
docker container diff eloquent_robinson
docker port命令可以查看容器的端口映射情况。
docker container port objective_burnell
docker update命令可以更新容器中的一些运行时配置,主要是一些资源限制份额。
docker run -itd --name new_ubuntu new/ubuntu:v2.0.1 /bin/bash
例:实时查看docker容器名为user-dgw的最后10行日志
docker logs -f -t --tail 10 user-dgw
例:查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2018-02-08" --tail=100 user-dgw
例:查看最近30分钟的日志:
docker logs --since 30m user-dgw
例:查看某时间之后的日志:
docker logs -t --since="2018-02-08T13:23:37" user-dgw
例:查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" user-dgw
例:将错误日志写入文件:
docker logs -f -t --since="2018-02-18" user-dgw | grep error >> logs_error.txt
仓库(Repository)是集中存放镜像的地方。
注册官方docker hub:Docker Hub
本人注册名称为:dgwdocker
可以通过docker login命令输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录下会自动创建.docker/config.json文件,保存用户的认证信息。
登录成功后用户可以上传个人制作的镜像到Docker Hub。
如时速云:https://tenxcloud.com/
时速云官方仓库中的镜像会保持与DockerHub中官方镜像的同步。
下载镜像同样是使用docker pull命令,但是要在前面添加服务器的地址。
略
官方提供了registry镜像来简单搭建一套本地私有仓库环境。
docker run -d -p 5000:5000 registry:2
这将自动下载并启动一个registry容器,创建本地的私有仓库服务。
此时,在本地启动了一个私有仓库服务,监听端口为5000。
略