Docker容器

运行容器

命令格式:
1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=”my-ubuntu”: 为容器指定一个名称;
  • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=”charlie”: 设置环境变量;
  • –env-file=[]: 从指定文件读入环境变量;
  • –cpuset=”0-2” or –cpuset=”0,1,2”: 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • –net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;
  • –restart 容器退出时要应用的重启策略。
运行命令:

启动一个ubuntu容器docker run -i -t ubuntu,如果本地没有镜像会先去下载,然后再启动

1
2
3
4
5
6
7
8
9
10
11
12
[root@izur9gz docker]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6abc03819f3e: Pull complete
05731e63f211: Pull complete
0bd67c50d6be: Pull complete
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:latest
root@97e685431765:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 18496 2012 pts/0 Ss 07:49 0:00 /bin/bash
root 510 0.0 0.0 34388 1460 pts/0 R+ 08:07 0:00 ps -aux

在这个容器中运行的ubuntu可以像一个正常的ubuntu系统一样运行,可以在里面做任何事情,比如安装个vim软件

1
2
3
4
5
6
7
8
9
root@97e685431765:/# apt update
···
··
·
root@97e685431765:/# apt install -y vim
···
··
·
root@97e685431765:/# vim myfile

当你想退出这个ubuntu命令行界面只需要输入exit就返回到原来状态了,容器也会随之关闭

1
2
3
root@97e685431765:/# exit
exit
[root@izur9gz docker]#

列出容器

命令格式
1
docker ps [OPTIONS]

OPTIONS说明:

  • -a :显示所有的容器,包括未运行的;
  • -f :根据条件过滤显示的内容;
  • –format :指定返回值的模板文件;
  • -l :显示最近创建的容器;
  • -n :列出最近创建的n个容器;
  • –no-trunc :不截断输出;
  • -q :静默模式,只显示容器编号;
  • -s :显示总的文件大小。
运行命令:

承接上文测试内容,没有正在运行的容器,有一个未运行的容器,容器名字叫“pedantic_snyder”这是启动之后docker自动起得容器名字

1
2
3
4
5
[root@izur9gz docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izur9gz docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97e685431765 ubuntu "/bin/bash" 25 minutes ago Exited (0) 4 minutes ago pedantic_snyder

容器命名

前文的运行容器命令中有个参数--name是用来起名字的,这里也特地说下,命名只能有下划线_,圆点·,横线-三种特殊符号 运行命令: 启动个ubuntu容器然后命名为Charlie-ubuntu,退出容器命令行,然后看生成了一个名为Charlie-ubuntu的容器

1
2
3
4
5
6
7
[root@izur9gz docker]# docker run --name Charlie-ubuntu -i -t ubuntu /bin/bash
root@c9c17b86b97e:/# exit
exit
[root@izur9gz docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c17b86b97e ubuntu "/bin/bash" 11 seconds ago Exited (0) 7 seconds ago Charlie-ubuntu
97e685431765 ubuntu "/bin/bash" 38 minutes ago Exited (0) 17 minutes ago pedantic_snyder

容器启动

命令格式:
1
docker start [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • –attach , -a:Attach STDOUT/STDERR and forward signals
  • –interactive , -i:Attach container’s STDIN
运行命令:

可以启动一个或多个,启动可以用CONTAINER ID也可以用NAMES

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@izur9gz docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c17b86b97e ubuntu "/bin/bash" 11 seconds ago Exited (0) 7 seconds ago Charlie-ubuntu
97e685431765 ubuntu "/bin/bash" 38 minutes ago Exited (0) 17 minutes ago pedantic_snyder
[root@izur9gz docker]# docker start Charlie-ubuntu
Charlie-ubuntu
[root@izur9gz docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c17b86b97e ubuntu "/bin/bash" 33 minutes ago Up 10 seconds Charlie-ubuntu
[root@izur9gz docker]# docker stop Charlie-ubuntu
Charlie-ubuntu
[root@izur9gz docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izur9gz docker]# docker start Charlie-ubuntu 97e685431765
Charlie-ubuntu
97e685431765
[root@izur9gz docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c17b86b97e ubuntu "/bin/bash" 35 minutes ago Up 5 seconds Charlie-ubuntu
97e685431765 ubuntu "/bin/bash" About an hour ago Up 5 seconds pedantic_snyder

容器停止

命令格式:
1
docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -t int:在杀死容器之前等待停止的秒数,默认10秒
运行命令:

停止名为Charlie-ubuntu容器

1
2
[root@izur9gz docker]# docker stop Charlie-ubuntu
Charlie-ubuntu

容器重启

命令格式:
1
docker restart [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -t int:在杀死容器之前等待停止的秒数,默认10秒
运行命令:

重启名为Charlie-ubuntu容器

1
2
[root@izur9gz docker]# docker restart Charlie-ubuntu
Charlie-ubuntu

连接到正在运行中的容器

命令格式:
1
docker attach [OPTIONS] CONTAINER
运行命令:

跟run命令-i -t效果相同,exit退出会停止容器

1
2
[root@izur9gz docker]# docker attach Charlie-ubuntu
root@c9c17b86b97e:/#

后台运行容器

前文提到的run命令的-d参数表示后台运行容器,并返回容器ID; 后台运行一个ubuntu的容器,里面每隔一秒打印一次hello world

1
2
[root@izur9gz docker]# docker run --name Charlie2-ubuntu -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 1;done"
2d543a799a38ad2c00204b633dad77f2ac831b5cd44801d48f5cff59c30b40f8

获取容器的日志

命令格式:
1
docker logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f : 跟踪日志输出
  • –since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • –tail :仅列出最新N条容器日志
运行命令:

前文有个每秒打印一次hello world的ubuntu容器,查看这个容器后五条日志

1
2
3
4
5
6
7
[root@izur9gz docker]# docker logs --tail 5 Charlie2-ubuntu
hello world
hello world
hello world
hello world
hello world
[root@izur9gz docker]#

查看容器中运行的进程信息

命令格式:
1
docker top [OPTIONS] CONTAINER [ps OPTIONS]
运行命令:
1
2
3
4
5
[root@izur9gz docker]# docker top Charlie2-ubuntu
UID PID PPID C STIME TTY TIME CMD
root 12260 12210 0 18:22 ? 00:00:00 /bin/bash -c while true;do echo hello world;sleep 1;done
root 12894 12260 0 18:30 ? 00:00:00 sleep 1
[root@izur9gz docker]#

在运行的容器中执行命令

命令格式:
1
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端
运行命令:

先后台运行创建一个newFile文件,然后进入终端查看,exit不会停止容器

1
2
3
4
5
6
7
8
9
10
[root@izur9gz docker]# docker exec -d Charlie-ubuntu touch ~/newFile
[root@izur9gz docker]# docker exec -t -i Charlie-ubuntu /bin/bash
root@c9c17b86b97e:/# cd ~
root@c9c17b86b97e:~# ls
newFile
root@c9c17b86b97e:~# exit
exit
[root@izuf6barrnre7hruzsy99gz docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c17b86b97e ubuntu "/bin/bash" 2 hours ago Up 6 minutes Charlie-ubuntu

重启策略

run命令的参数--restart有四种策略

策略

用途

no

默认策略,退出时不要自动重新启动容器。

on-failure[:max-retries]

指定退出时尝试重启的次数

unless-stop

始终重新启动容器,但是如果容器正常stopped,然后机器重启或docker服务重启,这种情况下容器将不会被restart

always

无论退出状态如何,始终重新启动容器。当您指定always时,docker守护进程将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护进程启动时启动

运行命令:

运行redis如果退出会尝试启动三次

1
docker run --restart=on-failure:3 redis

获取容器详细信息

命令格式:
1
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • –type :为指定类型返回JSON。
运行命令:

回去容器名为Charlie-ubuntu的详情,然后获取详情中的ip地址信息

[root@izur9gz docker]# docker inspect Charlie-ubuntu
[
    {
        "Id": "c9c17b86b97e9528535abd1ffce67945442ca985b91ce3dff3ac4fa82e5e2025",
        "Created": "2019-05-22T08:27:53.091120726Z",
···
···
···
        },
        "NetworkSettings": {
···
···
···
            "IPAddress": "172.17.0.4",
···
···
···
            }
        }
    }
]
[root@izur9gz docker]# docker inspect --format '{ {.NetworkSettings.IPAddress}}' Charlie-ubuntu
172.17.0.4

删除容器

命令格式:
1
docker rm [OPTIONS] CONTAINER [CONTAINER...]
运行命令:
1
2
3
4
5
6
7
[root@izur9gz docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc834aace694 ubuntu "-d" 16 minutes ago Created loving_vaughan
[root@izur9gz docker]# docker rm dc834aace694
dc834aace694
[root@izur9gz docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES