docker操作参数解读
在使用docker的时候,需要使用docker命令行工具docker与Docker daemon建立通信。Docker daemon是Docker的守护进程,负责接受并分发Docker命令。
docker命令的执行一般都需要获取root权限,因为Dokcer的命令行工具docker 与 Docker daemon 是同一个二进制文件, Docker daemon 的运行需要root权限。
官方命令教程 https://docs.docker.com/engine/reference/commandline/run/
docker的命令
docker的子命令繁多,核心子命令也有复杂的操作,可以通过 docker COMMAND --help 来查看帮助
[root@localhost ~]# docker start --helpUsage: docker start [OPTIONS] CONTAINER [CONTAINER...]Start one or more stopped containersOptions:-a, --attach Attach STDOUT/STDERR and forward signals--detach-keys string Override the key sequence for detaching a container-i, --interactive Attach container's STDIN[root@localhost ~]#
docker子命令的分类
| 子命令分类 | 子命令 |
|---|---|
| docker环境信息 | info、version |
| 容器生命周期管理 | Create、exec、kill、pause、restart、rm、run、start、stop、unpause |
| 镜像仓库命令 | login、logout、pull、push、search |
| 镜像管理 | build、images、import、load、rmi、save、tag、commit |
| 容器运维操作 | attch、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update |
| 容器资源管理 | volume、network |
| 系统日志信息 | events、history、logs |

docker的环境信息
docker info 用于检查docker是否正确安装。如果正确安装,该命令会输出docker的配置信息。
一般结合 docker version 一起使用
[root@localhost ~]# docker infoClient:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)scan: Docker Scan (Docker Inc., v0.8.0)Server:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 20.10.9Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: cgroupfsCgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2Default Runtime: runc
Docker registry
Dokcer registry [n 登记处、注册处] 是存储容器镜像的仓库,用户可以通过 Docker client 与 Docker registry 进行通信,以此完成镜像的搜索、下载和上传等相关操作。
Docker Hub 是用 Docker 公司在互联网上提供的一个镜像仓库,提供公有与私有存储服务。除开docker hup 用户也可以自己搭建实现私有镜像仓库。
docker pull
该命令主要用于从 Docker registry 中拉取 image 或者 repository ()。
在docker hup上有许多即拿即用的镜像资源,通过 docker pull 命令可以利用他们。docker pull [OPTIONS] NAME[:TAG @DIGEST]
docker push
与 pull 对应的 push。可以将本地的 image 或者 repository 推送到 Docker Hub 的公共或私有镜像库,以及私有服务器。docker push [OPTIONS] NAME[:TAG]
镜像管理
用户可以在本地保存镜像资源。Docker提供了相应的管理子命令。
docker iamges
通过 docker iamges 命令可以列出主机上的镜像,默认只是显示最顶层的镜像。可以使用 -a 选项显示所有镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest ba6acccedd29 3 days ago 72.8MB[root@localhost ~]#在这里 repository 可以判断镜像是出自官方的镜像还是私有服务器
docker rm / rmi
这两个子命令的功能都是删除,rmi 用于删除镜像, rm 用于删除容器。 他们可以同时删除多个,也可以按条件来删除。docker rm [OPTIONS] CONTAINER [CONTAINER...]docker rmi [OPTIONS] IMAGE [IMAGE...]
需要注意的是,使用rmi命令删除镜像时,如果有基于该镜像启动的容器存在,则无法直接删除,需要首先删除容器。不过存在 -f 选项,可以强制删除。
docker search
docker 官方提供了一个仓库:https://hub.docker.com/
我们可以在web上浏览并且下载任意的镜像
同时docker client 也提供了search功能,因为官方hub在国外,所以最好配置一下镜像加速。
在客户端上操作实例:
[root@localhost ~]# docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11551 [OK]mariadb MariaDB Server is a high performing open sou… 4395 [OK]
search 的一些操作
[root@localhost ~]# docker search --helpUsage: docker search [OPTIONS] TERMSearch the Docker Hub for imagesOptions:-f, --filter filter Filter output based on conditions provided--format string Pretty-print search using a Go template--limit int Max number of search results (default 25)--no-trunc Don't truncate output[root@localhost ~]# docker search mysql --filter=stars=3000NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11551 [OK]mariadb MariaDB Server is a high performing open sou… 4398 [OK]
容器的生命周期管理
docker run
基于特定的镜像创建一个容器,并依据选项来控制该容器。docker run [options] IMAGE [COMMAND] [ARG....]
一个示例:
从ubuntu镜像启动一个容器,然后执行echo。执行完后容器将停止运行。
[root@localhost ~]# docker run ubuntu echo "hello world"Unable to find image 'ubuntu:latest' locallylatest: Pulling from library/ubuntu7b1a6ab2e44d: Pull completeDigest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322Status: Downloaded newer image for ubuntu:latesthello world
docker run 命令启动的容器会被随机分配一个容器ID(CONTAINER ID)。用来标识该容器。
在选取容器的镜像时,可以在镜像名后添加 tag 来区分同名的镜像,如 ubuntu:latest、ubuntu:13.04、ubuntu:14.04。 如果在选取镜像的时候没有指定具体的 tag,docker将选取默认的tag为 latest 的镜像。
看个实例:
[root@localhost ~]# docker run -i -t --name mytest ubuntu:latest /bin/bashroot@f99cce801af6:/# whoamirootroot@f99cce801af6:/# w05:20:30 up 20:41, 0 users, load average: 0.00, 0.01, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot@f99cce801af6:/# uname -r3.10.0-1160.el7.x86_64root@f99cce801af6:/# exit[root@localhost ~]# uname -r3.10.0-1160.el7.x86_64-i 选项表示使用交互模式,始终保持标准输入(STDIN)流开放;-t 选项表示分配一个伪终端,一般与-i 结合使用,即可在容器中利用打开的伪终端进行交互操作(如上)--name 指定docker run 命令启动的容器的名字,没有这个选项则会随机分配一个名字给容器-c 用于给运行在容器中的所有进程分配CPU的 shares值,这是一个相对权重,实际的处理速度还与宿主机的CPU相关-m 用于限制容器中所有进程分配的内存总量,以 B、K、M、G为单位-v 用于挂在一个 volume,可以使用多个 -v 参数同事挂在多个 volume。 volume的格式为[host-dir]:[container-dir]:[rw|ro]-p 用于将容器的端口暴露给宿主机端口,常用的格式 hostPort:containerPort。通过端口的暴露,可以让外部主机通过宿主机暴露的端口来访问容器内的应用
可以使用docker run --help 来查看全部命令
docker start/stop/restart
对于已经存在的容器,可以通过 docker start 、stop、restart命令来启动,停止和重启。
当使用docker run 命令新建一个容器时,docker 将自动为每个新容器分配唯一的ID作为标识。而docker start、stop、restart 命令一般利用容器ID标识确定具体容器。 有时候,容器名也可以。
后台运行容器
这里使用 docker run -d --name ubuntu1 ubuntu /bin/bash
docker 会运行镜像后里面结束这个进程,因为没有服务在运行。
需要 -it 指定一下
[root@localhost ~]# docker run -d --name ubuntu1 ubuntu /bin/bash57394e7c76ab1f648e6733274c5b0bd1a0b2e89a70b5aedbb361b132bdb1802f[root@localhost ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES57394e7c76ab ubuntu "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago ubuntu1d03feaf783a7 ba6acccedd29 "--name ubuntu1 /bin…" About a minute ago Created frosty_easleyb96d2cd150f0 ubuntu "--name ubuntu /bin/…" About a minute ago Created practical_matsumoto52602874980d ubuntu "--name ubuntu-123 /…" 2 minutes ago Created determined_swartz6a2c76534177 ubuntu "--name 1 /bin/bash" 2 minutes ago Created clever_ishizaka679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci82b6181df418 ubuntu "/bin/sh -c 'while t…" 2 days ago Exited (137) 46 hours ago focused_swanson3d98751aaa73 ubuntu "echo 1111" 2 days ago Exited (0) 25 hours ago jolly_leakeya0098d2e6f1c ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago priceless_hugled0a89262dd81 ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago brave_easley96bbca879447 ubuntu:latest "/bin/bash" 2 days ago Exited (127) 2 days ago mytest1f99cce801af6 ubuntu:latest "/bin/bash" 2 days ago Exited (0) 2 days ago mytest66d5c05ce500 ubuntu "echo 'hello world'" 2 days ago Exited (0) 2 days ago interesting_kilby[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
容器运维操作
有镜像才能有容器
docker inspect
docker inspect 命令可以查看镜像和容器的详细信息,默认会列出全部信息,可以通过 —format 参数来指定输出的模版格式
docker inspect [OPTIONS] CONTAINER | IMAGE [CONTAINER|IMAGE...]
查看容器的元数据
[root@localhost ~]# docker inspect 679a5b02ae7a[{"Id": "679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e","Created": "2021-10-20T05:33:48.66919649Z","Path": "/bin/sh","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": 74711,"ExitCode": 0,"Error": "","StartedAt": "2021-10-20T05:33:49.017502029Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1","ResolvConfPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/resolv.conf","HostnamePath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/hostname","HostsPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/hosts","LogPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e-json.log","Name": "/gallant_davinci","RestartCount": 0,"Driver": "overlay2","Platform": "linux",
docker ps
docker ps 命令可以查看容器的相关信息,默认值显示正在运行的容器的信息。
可以查看到 CONTAINER ID、NAMES、IMAGE、STATUS、容器启动后执行的 COMMAND、创建时间CREATED 和 绑定开启的端口 PORTS。
-l 可以查看最新创建的容器
-a 可以查看所有容器,包括停止的容器
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES82b6181df418 ubuntu "/bin/sh -c 'while t…" 2 hours ago Up 2 hours focused_swanson[root@localhost ~]#
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:、
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 55 seconds ago Up 54 seconds gallant_davinci[root@localhost ~]# docker logs 679a5b02ae7ahello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world
进入容器
通过 exec 进入容器
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci[root@localhost ~]# docker exec -it 679a5b02ae7a /bin/bashroot@679a5b02ae7a:/# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Oct20 ? 00:00:26 /bin/sh -c while true; do echo hello world; sleep 1; doneroot 91037 0 1 06:53 pts/0 00:00:00 /bin/bashroot 91047 1 0 06:53 ? 00:00:00 sleep 1root 91048 91037 0 06:53 pts/0 00:00:00 ps -efroot@679a5b02ae7a:/#
通过 docker attach 进入容器
这里会进入容器中的主进程,比如下面这个容器是我正在执行的 while 死循环。
那么我通过 attach 即可进入该进程观察交互情况
这里我们 exit 或者 ctrl c 退出以后 容器就会结束
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci[root@localhost ~]# docker attach 679a5b02ae7ahello worldhello worldhello worldhello world^C[root@localhost ~]#
退出容器
exit #直接退出容器,容器进程会结束Ctrl + Q + P #这个不会结束容器进程
查看日志
[root@localhost ~]# docker logs --helpUsage: docker logs [OPTIONS] CONTAINERFetch the logs of a containerOptions:--details Show extra details provided to logs-f, --follow Follow log output--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)-n, --tail string Number of lines to show from the end of the logs (default "all")-t, --timestamps Show timestamps--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci[root@localhost ~]# docker logs -n 10 679a5b02ae7ahello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world[root@localhost ~]# docker logs -tf --tail 10 679a5b02ae7a2021-10-21T06:42:13.115745821Z hello world2021-10-21T06:42:14.117941063Z hello world2021-10-21T06:42:15.121216919Z hello world2021-10-21T06:42:16.123725529Z hello world2021-10-21T06:42:17.125806623Z hello world2021-10-21T06:42:18.128091673Z hello world2021-10-21T06:42:19.129478275Z hello world2021-10-21T06:42:20.131743557Z hello world2021-10-21T06:42:21.133419168Z hello world2021-10-21T06:42:22.134708102Z hello world2021-10-21T06:42:23.137335297Z hello world2021-10-21T06:42:24.139510070Z hello world2021-10-21T06:42:25.140803122Z hello world
查看进程
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci[root@localhost ~]# docker top 679a5b02ae7aUID PID PPID C STIME TTY TIME CMDroot 36181 74711 0 14:44 ? 00:00:00 sleep 1root 74711 74692 0 10月20 ? 00:00:26 /bin/sh -c while true; do echo hello world; sleep 1; done[root@localhost ~]#
copy操作
使用 docker copy 容器ID:容器内路径 主机路径 进行拷贝
将文件从容器内拷贝到宿主机
[root@localhost ~]# docker attach ec92bc9c1023root@ec92bc9c1023:/# lsbin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr varroot@ec92bc9c1023:/# clearroot@ec92bc9c1023:/# touch test.txtroot@ec92bc9c1023:/# lsbin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys test.txt tmp usr varroot@ec92bc9c1023:/# pwd/root@ec92bc9c1023:/# read escape sequence[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESec92bc9c1023 ubuntu "/bin/bash" About a minute ago Up About a minute romantic_brown[root@localhost ~]# docker cp ec92bc9c1023:/test.txt /[root@localhost ~]# lsanaconda-ks.cfg[root@localhost ~]# cd /[root@localhost /]# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test.txt tmp usr var[root@localhost /]#
命令导图

