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 来查看帮助

  1. [root@localhost ~]# docker start --help
  2. Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
  3. Start one or more stopped containers
  4. Options:
  5. -a, --attach Attach STDOUT/STDERR and forward signals
  6. --detach-keys string Override the key sequence for detaching a container
  7. -i, --interactive Attach container's STDIN
  8. [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

image.png

docker的环境信息

docker info 用于检查docker是否正确安装。如果正确安装,该命令会输出docker的配置信息。
一般结合 docker version 一起使用

  1. [root@localhost ~]# docker info
  2. Client:
  3. Context: default
  4. Debug Mode: false
  5. Plugins:
  6. app: Docker App (Docker Inc., v0.9.1-beta3)
  7. buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
  8. scan: Docker Scan (Docker Inc., v0.8.0)
  9. Server:
  10. Containers: 0
  11. Running: 0
  12. Paused: 0
  13. Stopped: 0
  14. Images: 0
  15. Server Version: 20.10.9
  16. Storage Driver: overlay2
  17. Backing Filesystem: xfs
  18. Supports d_type: true
  19. Native Overlay Diff: true
  20. userxattr: false
  21. Logging Driver: json-file
  22. Cgroup Driver: cgroupfs
  23. Cgroup Version: 1
  24. Plugins:
  25. Volume: local
  26. Network: bridge host ipvlan macvlan null overlay
  27. Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  28. Swarm: inactive
  29. Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
  30. Default 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]
image.png

docker push

与 pull 对应的 push。可以将本地的 image 或者 repository 推送到 Docker Hub 的公共或私有镜像库,以及私有服务器。
docker push [OPTIONS] NAME[:TAG]
image.png

镜像管理

用户可以在本地保存镜像资源。Docker提供了相应的管理子命令。

docker iamges

通过 docker iamges 命令可以列出主机上的镜像,默认只是显示最顶层的镜像。可以使用 -a 选项显示所有镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

  1. [root@localhost ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu latest ba6acccedd29 3 days ago 72.8MB
  4. [root@localhost ~]#
  5. 在这里 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上浏览并且下载任意的镜像
image.png
同时docker client 也提供了search功能,因为官方hub在国外,所以最好配置一下镜像加速
在客户端上操作实例:

  1. [root@localhost ~]# docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 11551 [OK]
  4. mariadb MariaDB Server is a high performing open sou 4395 [OK]

search 的一些操作

  1. [root@localhost ~]# docker search --help
  2. Usage: docker search [OPTIONS] TERM
  3. Search the Docker Hub for images
  4. Options:
  5. -f, --filter filter Filter output based on conditions provided
  6. --format string Pretty-print search using a Go template
  7. --limit int Max number of search results (default 25)
  8. --no-trunc Don't truncate output
  9. [root@localhost ~]# docker search mysql --filter=stars=3000
  10. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  11. mysql MySQL is a widely used, open-source relation… 11551 [OK]
  12. mariadb MariaDB Server is a high performing open sou… 4398 [OK]

容器的生命周期管理

docker run

基于特定的镜像创建一个容器,并依据选项来控制该容器。
docker run [options] IMAGE [COMMAND] [ARG....]
一个示例:
从ubuntu镜像启动一个容器,然后执行echo。执行完后容器将停止运行。

  1. [root@localhost ~]# docker run ubuntu echo "hello world"
  2. Unable to find image 'ubuntu:latest' locally
  3. latest: Pulling from library/ubuntu
  4. 7b1a6ab2e44d: Pull complete
  5. Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
  6. Status: Downloaded newer image for ubuntu:latest
  7. hello world

docker run 命令启动的容器会被随机分配一个容器ID(CONTAINER ID)。用来标识该容器。
在选取容器的镜像时,可以在镜像名后添加 tag 来区分同名的镜像,如 ubuntu:latest、ubuntu:13.04、ubuntu:14.04。 如果在选取镜像的时候没有指定具体的 tag,docker将选取默认的tag为 latest 的镜像。

看个实例:

  1. [root@localhost ~]# docker run -i -t --name mytest ubuntu:latest /bin/bash
  2. root@f99cce801af6:/# whoami
  3. root
  4. root@f99cce801af6:/# w
  5. 05:20:30 up 20:41, 0 users, load average: 0.00, 0.01, 0.05
  6. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  7. root@f99cce801af6:/# uname -r
  8. 3.10.0-1160.el7.x86_64
  9. root@f99cce801af6:/# exit
  10. [root@localhost ~]# uname -r
  11. 3.10.0-1160.el7.x86_64
  12. -i 选项表示使用交互模式,始终保持标准输入(STDIN)流开放;
  13. -t 选项表示分配一个伪终端,一般与-i 结合使用,即可在容器中利用打开的伪终端进行交互操作(如上)
  14. --name 指定docker run 命令启动的容器的名字,没有这个选项则会随机分配一个名字给容器
  15. -c 用于给运行在容器中的所有进程分配CPU shares值,这是一个相对权重,实际的处理速度还与宿主机的CPU相关
  16. -m 用于限制容器中所有进程分配的内存总量,以 BKMG为单位
  17. -v 用于挂在一个 volume,可以使用多个 -v 参数同事挂在多个 volume volume的格式为[host-dir]:[container-dir]:[rw|ro]
  18. -p 用于将容器的端口暴露给宿主机端口,常用的格式 hostPort:containerPort。通过端口的暴露,可以让外部主机通过宿主机暴露的端口来访问容器内的应用

可以使用docker run --help 来查看全部命令
image.png

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 指定一下

  1. [root@localhost ~]# docker run -d --name ubuntu1 ubuntu /bin/bash
  2. 57394e7c76ab1f648e6733274c5b0bd1a0b2e89a70b5aedbb361b132bdb1802f
  3. [root@localhost ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 57394e7c76ab ubuntu "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago ubuntu1
  6. d03feaf783a7 ba6acccedd29 "--name ubuntu1 /bin…" About a minute ago Created frosty_easley
  7. b96d2cd150f0 ubuntu "--name ubuntu /bin/…" About a minute ago Created practical_matsumoto
  8. 52602874980d ubuntu "--name ubuntu-123 /…" 2 minutes ago Created determined_swartz
  9. 6a2c76534177 ubuntu "--name 1 /bin/bash" 2 minutes ago Created clever_ishizaka
  10. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
  11. 82b6181df418 ubuntu "/bin/sh -c 'while t…" 2 days ago Exited (137) 46 hours ago focused_swanson
  12. 3d98751aaa73 ubuntu "echo 1111" 2 days ago Exited (0) 25 hours ago jolly_leakey
  13. a0098d2e6f1c ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago priceless_hugle
  14. d0a89262dd81 ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago brave_easley
  15. 96bbca879447 ubuntu:latest "/bin/bash" 2 days ago Exited (127) 2 days ago mytest1
  16. f99cce801af6 ubuntu:latest "/bin/bash" 2 days ago Exited (0) 2 days ago mytest
  17. 66d5c05ce500 ubuntu "echo 'hello world'" 2 days ago Exited (0) 2 days ago interesting_kilby
  18. [root@localhost ~]# docker ps
  19. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  20. 679a5b02ae7a 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...]
image.png
查看容器的元数据

  1. [root@localhost ~]# docker inspect 679a5b02ae7a
  2. [
  3. {
  4. "Id": "679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e",
  5. "Created": "2021-10-20T05:33:48.66919649Z",
  6. "Path": "/bin/sh",
  7. "Args": [
  8. "-c",
  9. "while true; do echo hello world; sleep 1; done"
  10. ],
  11. "State": {
  12. "Status": "running",
  13. "Running": true,
  14. "Paused": false,
  15. "Restarting": false,
  16. "OOMKilled": false,
  17. "Dead": false,
  18. "Pid": 74711,
  19. "ExitCode": 0,
  20. "Error": "",
  21. "StartedAt": "2021-10-20T05:33:49.017502029Z",
  22. "FinishedAt": "0001-01-01T00:00:00Z"
  23. },
  24. "Image": "sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1",
  25. "ResolvConfPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/resolv.conf",
  26. "HostnamePath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/hostname",
  27. "HostsPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/hosts",
  28. "LogPath": "/var/lib/docker/containers/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e/679a5b02ae7a4767bbdc05de0dd8e1c7b9d9f2c8044247267d710d2fae1ef78e-json.log",
  29. "Name": "/gallant_davinci",
  30. "RestartCount": 0,
  31. "Driver": "overlay2",
  32. "Platform": "linux",

docker ps

docker ps 命令可以查看容器的相关信息,默认值显示正在运行的容器的信息。
可以查看到 CONTAINER ID、NAMES、IMAGE、STATUS、容器启动后执行的 COMMAND、创建时间CREATED 和 绑定开启的端口 PORTS。
-l 可以查看最新创建的容器
-a 可以查看所有容器,包括停止的容器

  1. [root@localhost ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 82b6181df418 ubuntu "/bin/sh -c 'while t…" 2 hours ago Up 2 hours focused_swanson
  4. [root@localhost ~]#

输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:、

  1. [root@localhost ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 55 seconds ago Up 54 seconds gallant_davinci
  4. [root@localhost ~]# docker logs 679a5b02ae7a
  5. hello world
  6. hello world
  7. hello world
  8. hello world
  9. hello world
  10. hello world
  11. hello world
  12. hello world
  13. hello world
  14. hello world
  15. hello world
  16. hello world
  17. hello world

进入容器

通过 exec 进入容器

  1. [root@localhost ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
  4. [root@localhost ~]# docker exec -it 679a5b02ae7a /bin/bash
  5. root@679a5b02ae7a:/# ps -ef
  6. UID PID PPID C STIME TTY TIME CMD
  7. root 1 0 0 Oct20 ? 00:00:26 /bin/sh -c while true; do echo hello world; sleep 1; done
  8. root 91037 0 1 06:53 pts/0 00:00:00 /bin/bash
  9. root 91047 1 0 06:53 ? 00:00:00 sleep 1
  10. root 91048 91037 0 06:53 pts/0 00:00:00 ps -ef
  11. root@679a5b02ae7a:/#

通过 docker attach 进入容器
这里会进入容器中的主进程,比如下面这个容器是我正在执行的 while 死循环。
那么我通过 attach 即可进入该进程观察交互情况
这里我们 exit 或者 ctrl c 退出以后 容器就会结束

  1. [root@localhost ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
  4. [root@localhost ~]# docker attach 679a5b02ae7a
  5. hello world
  6. hello world
  7. hello world
  8. hello world
  9. ^C[root@localhost ~]#

退出容器

  1. exit #直接退出容器,容器进程会结束
  2. Ctrl + Q + P #这个不会结束容器进程

查看日志

  1. [root@localhost ~]# docker logs --help
  2. Usage: docker logs [OPTIONS] CONTAINER
  3. Fetch the logs of a container
  4. Options:
  5. --details Show extra details provided to logs
  6. -f, --follow Follow log output
  7. --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  8. -n, --tail string Number of lines to show from the end of the logs (default "all")
  9. -t, --timestamps Show timestamps
  10. --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  11. [root@localhost ~]# docker ps
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
  14. [root@localhost ~]# docker logs -n 10 679a5b02ae7a
  15. hello world
  16. hello world
  17. hello world
  18. hello world
  19. hello world
  20. hello world
  21. hello world
  22. hello world
  23. hello world
  24. hello world
  25. [root@localhost ~]# docker logs -tf --tail 10 679a5b02ae7a
  26. 2021-10-21T06:42:13.115745821Z hello world
  27. 2021-10-21T06:42:14.117941063Z hello world
  28. 2021-10-21T06:42:15.121216919Z hello world
  29. 2021-10-21T06:42:16.123725529Z hello world
  30. 2021-10-21T06:42:17.125806623Z hello world
  31. 2021-10-21T06:42:18.128091673Z hello world
  32. 2021-10-21T06:42:19.129478275Z hello world
  33. 2021-10-21T06:42:20.131743557Z hello world
  34. 2021-10-21T06:42:21.133419168Z hello world
  35. 2021-10-21T06:42:22.134708102Z hello world
  36. 2021-10-21T06:42:23.137335297Z hello world
  37. 2021-10-21T06:42:24.139510070Z hello world
  38. 2021-10-21T06:42:25.140803122Z hello world

查看进程

  1. [root@localhost ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
  4. [root@localhost ~]# docker top 679a5b02ae7a
  5. UID PID PPID C STIME TTY TIME CMD
  6. root 36181 74711 0 14:44 ? 00:00:00 sleep 1
  7. root 74711 74692 0 1020 ? 00:00:26 /bin/sh -c while true; do echo hello world; sleep 1; done
  8. [root@localhost ~]#

copy操作

使用 docker copy 容器ID:容器内路径 主机路径 进行拷贝
将文件从容器内拷贝到宿主机

  1. [root@localhost ~]# docker attach ec92bc9c1023
  2. root@ec92bc9c1023:/# ls
  3. bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
  4. root@ec92bc9c1023:/# clear
  5. root@ec92bc9c1023:/# touch test.txt
  6. root@ec92bc9c1023:/# ls
  7. bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys test.txt tmp usr var
  8. root@ec92bc9c1023:/# pwd
  9. /
  10. root@ec92bc9c1023:/# read escape sequence
  11. [root@localhost ~]# docker ps
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. ec92bc9c1023 ubuntu "/bin/bash" About a minute ago Up About a minute romantic_brown
  14. [root@localhost ~]# docker cp ec92bc9c1023:/test.txt /
  15. [root@localhost ~]# ls
  16. anaconda-ks.cfg
  17. [root@localhost ~]# cd /
  18. [root@localhost /]# ls
  19. bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test.txt tmp usr var
  20. [root@localhost /]#

命令导图

image.png