docker 003 入门
学习 docker 的基本工作流:创建-管理-停止-删除
这里以
确保 docker 已正常运行
# 查看容器和镜像的数量,docker 使用的驱动及基本配置信息
$ docker info
Client:
Debug Mode: false
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 19.03.5
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: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.4MiB
Name: docker02
ID: 23TL:WD67:K4HB:U2JK:2U5R:VSSQ:2VDM:M2M4:VZIK:Z5FW:5RWZ:RHN7
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
运行第一个容器
# 运行容器 ubuntu,并使用为终端登录进容器内,运行/bin/bash启动一个 bash shell
# -i : 保证容器中 stdin 是开启的
# -t : 为创建的容器分配一个伪tty终端
$ docker run -i -t ubuntu /bin/bash
Unable to find image ‘ubuntu:latest‘ locally
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
Status: Downloaded newer image for ubuntu:latest
[email protected]:/# # 这里已经是容器内部的 shell
# 容器内部执行 hostname
[email protected]:/# hostname
b0558195ad79 # 这里主机名就是容器 ID
# 查看 hosts 文件,本地有一个容器的 IP 和主机名的解析
[email protected]:/# 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.2 b0558195ad79
# 查看运行的进程
[email protected]:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 18496 2116 pts/0 Ss 02:01 0:00 /bin/bash
root 20 0.0 0.1 34388 1460 pts/0 R+ 02:07 0:00 ps aux
# 安装 iproute2
[email protected]:/# apt-get update
[email protected]:/# apt-get install iproute2
# 查看容器网络配置
[email protected]:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
9: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 可以看到有一个回环接口,还有一个标砖 eth0网络接口,和宿主机一样
我们可以继续在容器中进行各种操作,当所有工作结束后,输入 exit 就可以退出容器,回到宿主机。而这个容器也会停止运行,只有/bin/bash 处于运行状态的时候,容器才会处于运行状态,一旦退出,/bin/bash 命令结束,容器也就响应的停止了。
但这时候,容器还是存在的,可以使用 docker ps -a
查看当前系统中容器的列表,如下:
# 查看宿主机内所有容器,包括已停止运行的
# 默认情况下 docker ps 只能看到正在运行的容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0558195ad79 ubuntu "/bin/bash" 53 minutes ago Exited (0) 12 seconds ago vibrant_germain
注意: 有三种方式唯一指定容器
- 短 UUID
- 长 UUID
- 容器名称
容器命名
docker 会为每一个容器自动生产一个随机的名称,例如上面的vibrant_germain,如果想自己指定容器名称,可以使用 --name 参数,如下:
# 运行容器并指定容器名称
$ docker run --name ubuntu001 -i -t ubuntu /bin/bash
# 查看容器信息
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ffeedd9447b5 ubuntu "/bin/bash" 16 seconds ago Up 15 seconds ubuntu001
容器的名称只能包含以下字符:
- 大小写字母
- 数字 0-9
- 下划线
- 远点
- 横线(减号)
在很多 docker 命令中,容器名称可以替代容器 ID,容器名称也可以让我们更容易分辨容器。推荐使用容器名称,以方便容器的管理。
注意 :容器名称必须唯一,如果试图创建两个名称相同的容器,会命令失败,如果要使用已经存在的名称,可以使用 docker rm 命令先将已有的同名容器删除,在创建。
# 删除容器
# 使用容器 ID
docker rm b0558195ad79
# 使用容器名称
docker rm ubuntu001
重启启动已停止的容器
# 使用容器名称启动指定容器
$ docker start ubuntu001
# 使用容器 ID 启动指定容器
$ docker start 74d08be02091
# 使用 restart 重新启动容器
$ docker restart ubuntu001
重新登录到容器内
# 登录到容器内
$ docker attach ubuntu001
注意:因为容器内部没有单独运行的程序,所以四处退出容易后,容器会再次停止运行
创建守护式容器
前面的操作使用的都是交互式运行的容器,我们还可以创建守护式容器。守护式容器没有交互式会话,适合运行应用程序和服务。大多数时候,我们需要使用守护式运行我们的容器。
示例:
# 创建一个守护式容器的示例
# -d 参数: 让容器后台运行,并打印容器 ID
$ docker run --name ubuntu02 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
d326b1bbd1b718c525fd5503fc3d99b0fb610bdbbf8c3a31e88f32f796e2c381
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d326b1bbd1b7 ubuntu "/bin/sh -c ‘while t…" 15 seconds ago Up 15 seconds ubuntu02
上面的示例中,容器内执行了一个while 死循环,该循环会每隔 1 秒打印一次”hello world“,知道容器或其内部的进程停止运行。
##查看容器内部的工作内容
docker logs
可以获取容器的日志:
# 查看容器的日志
# 查看
$ docker logs ubuntu02
hello world
hello world
hello world
......
# -f 参数可以让我们持续查看容器日志, 类似于 tail 命令的-f 参数
$ docker logs -f ubuntu02
hello world
hello world
hello world
......
hello world
# 查看最后 10 行日志
$ docker logs --tail 10 ubuntu02
# 查看最新的日志,并监控日志
$ docker logs --tail 0 -f ubuntu02
在查看日志的过程中,通过 ctrl+c 来退出日志追踪。
docker日志驱动
自1.6 开始,docker 支持控制守护进程和容器所用的日志驱动,通过 --log-dirver 实现,可在启动docker 守护进程或者 docker run 时使用。
--log-driver : 有如下选项
- json-file :默认值
- syslog : 该选项将禁用 docker logs 命令,并将所有容器的日志输出都重定向到 syslog,可在启动 docker 的守护进程时指定,也可以通过 docker run 对指定的容器进行日志重定向
- none : 禁用容器中所有的日志,docker logs 命令也会被禁用。
支持的选项:
awslogs、fluentd、gcplogs、gelf、journald、json-file、local、logentries、splunk、syslog
查看容器内的进程
# 查看容器内的进程
docker top ubuntu02
docker 统计信息
# 可动态查看一个或多个容器的统计信息
$ docker status ubuntu02 ubuntu001
#展示的信息包括 CPU、MEM、网络IO、存储IOdezhi
在容器内部运行新进程
# docker exec 可以在容器内部额外启动新进程(后台任务或交互式任务)
# -d 表明要运行一个后台进程,其后跟荣启明和要执行的命令
$ docker exec -d ubuntu02 touch /tmp/newfile
# 在已运行容器上打开一个交互式shell
# -i 保证 attach 期间 stdin 为打开状态
# -t 分配一个伪tty
$ docker exec -i -t ubuntu02 /bin/bash
停止守护式容器
# 发送 sigtrem 信号,停止容器
$ docker stop ubuntu02 # 容器名称
$ docker stop d326b1bbd1b7 # 容器 ID
# 发送 sigkill 信号停止容器,更快
$ docker kill ubuntu01
$ docker kill d326b1bbd1b7
# 查看已停止容器的状态
$ docker ps
$ docker ps -n x # 显示最后 x 个容器
自动重启容器
如果容器因为某种错误而停止运行,可以通过 --restart 参数,让 docker 自动重启容器,该参数会检查容器的退出代码,并据此来判断是否重启容器。docker 默认不会重启容器。
#
$ docker run --restart=always --name ubuntu03 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
这里 --restart参数的值为 always,无论容器的代码是什么都会自动重启;另外一个可设的值为 on-failure,即当容器退出代码未非 0 值时,才会自动重启,该值还可以设置重启次数,例:--restart=on-failure:5
深入容器
获取容器的更多信息:
# 获取更多关于容器的信息
# docker inspect 会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置等信息
$ docker inspect ubuntu03
# 查看选定内容的值: -f 或者 --format
# 查看运行状态
$ docker inspect -f ‘{{ .State.Running }}‘ ubuntu03
true
# 查看IP
$ docker inspect -f ‘{{ .NetworkSettings.IPAddress }}‘ ubuntu03
172.17.0.3
# 同时查看多个容器中的指定信息
$ docker inspect --format ‘{{.Name}} {{.State.Running}} {{.NetworkSettings.IPAddress}}‘ ubuntu03 ubuntu02
/ubuntu03 true 172.17.0.3
/ubuntu02 true 172.17.0.2
注意:除了查看容器,也可以通过浏览 /var/lib/docker 下的文件来来了解 docker 的工作原理,其下存放有镜像、容器及容器配置等信息。
目录结构如下:
/var/lib/docker/ ├── builder ├── buildkit ├── containers ├── image ├── network ├── overlay2 ├── plugins ├── runtimes ├── swarm ├── tmp ├── trust └── volumes
删除容器
如果容器不在使用,可使用 rm 子命令删除容器:
# 使用 ID 删除容器
$ docker rm 88607d784af6
# 使用容器名删除容器
$ docker rm ubuntu03
# 一次删除所有容器
$ docker rm $(docker ps -a -q)
# docker ps 可列出容器信息, -a 表示列出所有容器, -q 表示只显示容器 ID
原文地址:https://www.cnblogs.com/resn/p/12218368.html