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 --help
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-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 info
Client:
Context: default
Debug Mode: false
Plugins:
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: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.9
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
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: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
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]
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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 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 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql 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 --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
[root@localhost ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql 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' locally
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
hello 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/bash
root@f99cce801af6:/# whoami
root
root@f99cce801af6:/# w
05:20:30 up 20:41, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root@f99cce801af6:/# uname -r
3.10.0-1160.el7.x86_64
root@f99cce801af6:/# exit
[root@localhost ~]# uname -r
3.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/bash
57394e7c76ab1f648e6733274c5b0bd1a0b2e89a70b5aedbb361b132bdb1802f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57394e7c76ab ubuntu "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago ubuntu1
d03feaf783a7 ba6acccedd29 "--name ubuntu1 /bin…" About a minute ago Created frosty_easley
b96d2cd150f0 ubuntu "--name ubuntu /bin/…" About a minute ago Created practical_matsumoto
52602874980d ubuntu "--name ubuntu-123 /…" 2 minutes ago Created determined_swartz
6a2c76534177 ubuntu "--name 1 /bin/bash" 2 minutes ago Created clever_ishizaka
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
82b6181df418 ubuntu "/bin/sh -c 'while t…" 2 days ago Exited (137) 46 hours ago focused_swanson
3d98751aaa73 ubuntu "echo 1111" 2 days ago Exited (0) 25 hours ago jolly_leakey
a0098d2e6f1c ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago priceless_hugle
d0a89262dd81 ba6acccedd29 "bash" 2 days ago Exited (0) 2 days ago brave_easley
96bbca879447 ubuntu:latest "/bin/bash" 2 days ago Exited (127) 2 days ago mytest1
f99cce801af6 ubuntu:latest "/bin/bash" 2 days ago Exited (0) 2 days ago mytest
66d5c05ce500 ubuntu "echo 'hello world'" 2 days ago Exited (0) 2 days ago interesting_kilby
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
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...]
查看容器的元数据
[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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b6181df418 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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 55 seconds ago Up 54 seconds gallant_davinci
[root@localhost ~]# docker logs 679a5b02ae7a
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
进入容器
通过 exec 进入容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
[root@localhost ~]# docker exec -it 679a5b02ae7a /bin/bash
root@679a5b02ae7a:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct20 ? 00:00:26 /bin/sh -c while true; do echo hello world; sleep 1; done
root 91037 0 1 06:53 pts/0 00:00:00 /bin/bash
root 91047 1 0 06:53 ? 00:00:00 sleep 1
root 91048 91037 0 06:53 pts/0 00:00:00 ps -ef
root@679a5b02ae7a:/#
通过 docker attach 进入容器
这里会进入容器中的主进程,比如下面这个容器是我正在执行的 while 死循环。
那么我通过 attach 即可进入该进程观察交互情况
这里我们 exit 或者 ctrl c 退出以后 容器就会结束
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
[root@localhost ~]# docker attach 679a5b02ae7a
hello world
hello world
hello world
hello world
^C[root@localhost ~]#
退出容器
exit #直接退出容器,容器进程会结束
Ctrl + Q + P #这个不会结束容器进程
查看日志
[root@localhost ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
[root@localhost ~]# docker logs -n 10 679a5b02ae7a
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
[root@localhost ~]# docker logs -tf --tail 10 679a5b02ae7a
2021-10-21T06:42:13.115745821Z hello world
2021-10-21T06:42:14.117941063Z hello world
2021-10-21T06:42:15.121216919Z hello world
2021-10-21T06:42:16.123725529Z hello world
2021-10-21T06:42:17.125806623Z hello world
2021-10-21T06:42:18.128091673Z hello world
2021-10-21T06:42:19.129478275Z hello world
2021-10-21T06:42:20.131743557Z hello world
2021-10-21T06:42:21.133419168Z hello world
2021-10-21T06:42:22.134708102Z hello world
2021-10-21T06:42:23.137335297Z hello world
2021-10-21T06:42:24.139510070Z hello world
2021-10-21T06:42:25.140803122Z hello world
查看进程
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
679a5b02ae7a ubuntu "/bin/sh -c 'while t…" 25 hours ago Up 25 hours gallant_davinci
[root@localhost ~]# docker top 679a5b02ae7a
UID PID PPID C STIME TTY TIME CMD
root 36181 74711 0 14:44 ? 00:00:00 sleep 1
root 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 ec92bc9c1023
root@ec92bc9c1023:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@ec92bc9c1023:/# clear
root@ec92bc9c1023:/# touch test.txt
root@ec92bc9c1023:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys test.txt tmp usr var
root@ec92bc9c1023:/# pwd
/
root@ec92bc9c1023:/# read escape sequence
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec92bc9c1023 ubuntu "/bin/bash" About a minute ago Up About a minute romantic_brown
[root@localhost ~]# docker cp ec92bc9c1023:/test.txt /
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# cd /
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test.txt tmp usr var
[root@localhost /]#