docker 003 基本操作

Posted resn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 003 基本操作相关的知识,希望对你有一定的参考价值。

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
root@b0558195ad79:/#  # 这里已经是容器内部的 shell

# 容器内部执行 hostname
root@b0558195ad79:/# hostname
b0558195ad79   # 这里主机名就是容器 ID

# 查看 hosts 文件,本地有一个容器的 IP 和主机名的解析
root@b0558195ad79:/# 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

# 查看运行的进程
root@b0558195ad79:/# 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
root@b0558195ad79:/# apt-get update
root@b0558195ad79:/# apt-get install iproute2

# 查看容器网络配置
root@b0558195ad79:/# 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: eth0@if10: <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

以上是关于docker 003 基本操作的主要内容,如果未能解决你的问题,请参考以下文章

003-docker的操作命令-远程镜像仓库命令,本地镜像管理命令

LEETCODE 003 找出一个字符串中最长的无重复片段

[新增EA003考勤系统演示片段]全程字幕-22套UML+Enterprise Architect建模示范视频

附003.Docker Compose命令详解

003-docker安装nginx,mysql

003Docker学习__commit命令构建docker镜像