容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。下图为使用单个 Docker镜像启动多个容器的示意图。
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是镜像的一个运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
容器是基于镜像启动起来的,容 器中可以运行一个或多个进程。镜像是Docker生命周期 中的构建或打包阶段,而容器则是启动或执行阶段。镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
可以通过下面的方式启动一个容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
下面指令是运行一个tomcat镜像:
[root@localhost ~]# docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8
常用参数列表:
docker run命令常用参数比较多,这里仅仅列出开发岗常用参数,想获得更多参数信息可以查看https://docs.docker.com/engine/reference/commandline/run/,里面有详细的参数介绍和使用说明:
1,-d, --detach=false: 后台运行容器,并返回容器ID;
2,-i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用;
3,-P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口,不推荐使用;
4,-p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用
5,-t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
6,–name=“nginx-dream21th”: 为容器指定一个名称
7,-h , --hostname=“dream21th”: 指定容器的hostname
8,-e , --env=[]: 设置环境变量,容器中可以使用该环境变量
9,–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
10,–link=[]: 添加链接到另一个容器,
11,-v, --volume : 绑定一个卷
12,–privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities
13,**–restart=no:**指定容器停止后的重启策略;no:容器退出时不重启 ;on-failure:容器故障退出(返回值非零)时重启 ; always:容器退出时总是重启
14,–rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器
docker logs :获取容器的日志,执行的方式:
docker logs [OPTIONS] CONTAINER
执行下面指令:
[root@localhost ~]# docker run -itd -p 8080:8080 tomcat:9.0.20-jre8
2f66b01d73efc7a12fe43da2253c1d05856c6185b29ec4ff2366c76e53668428
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f66b01d73ef tomcat:9.0.20-jre8 "catalina.sh run" 37 seconds ago Up 36 seconds 0.0.0.0:8080->8080/tcp gallant_newton
[root@localhost ~]# docker logs -f gallant_newton
可以在控制台输入:
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:37) or relative (e.g. 42m for 42 minutes)
--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:37) or relative (e.g. 42m for 42 minutes)
//查看到2022-06-20T10:32:14Z之前的日志
docker logs -f --until 2022-06-20T10:32:14Z gallant_newton
docker rm **:**删除一个或多个容器。执行的指令方式如下:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选择项的一些参数如下:
1,**f *通过 SIGKILL 信号强制删除一个运行中的容器;
2,**-l *移除容器间的网络连接,而非容器本身;
3,**-v *删除与容器关联的卷。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f66b01d73ef tomcat:9.0.20-jre8 "catalina.sh run" 23 minutes ago Up 23 minutes 0.0.0.0:8080->8080/tcp gallant_newton
[root@localhost ~]# docker stop gallant_newton
gallant_newton
[root@localhost ~]# docker rm gallant_newton
gallant_newton
列出容器使用指令:
docker ps [OPTIONS]
查询容器的列表:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df2ad52f9203 tomcat:9.0.20-jre8 "catalina.sh run" 58 seconds ago Up 57 seconds 0.0.0.0:8080->8080/tcp beautiful_kowalevski
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df2ad52f9203 tomcat:9.0.20-jre8 "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp beautiful_kowalevski
输出详情介绍:
1,CONTAINER ID: 容器 ID;
2,IMAGE: 使用的镜像;
3,COMMAND: 启动容器时运行的命令;
4,CREATED: 容器的创建时间;
5,STATUS: 容器状态;
状态有7种:created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡)
6,PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
7,NAMES: 自动分配的容器名称。
常用参数说明:
1,**-a *显示所有的容器,包括未运行的;
2,**-q *只显示容器编号。
实用技巧:
停止所有运行容器
docker stop $(docker ps -qa)
删除所有的容器
docker rm $(docker ps -aq)
docker rm $(docker stop $(docker ps -q))
删除所有的镜像
docker rmi $(docker images -q)
docker create **:**创建一个新的容器但不启动它。用法同 docker run命令。
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
[root@localhost ~]# docker create -it --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8
f7b45b68607780aa635a3e5996861b30c2ad5ea98be7d4d80d8603ebf72e0900
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7b45b686077 tomcat:9.0.20-jre8 "catalina.sh run" 10 seconds ago Created tomcat9
[root@localhost ~]#
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
操作命令:
[root@localhost ~]# docker start tomcat9
tomcat9
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7b45b686077 tomcat:9.0.20-jre8 "catalina.sh run" 2 minutes ago Up 5 seconds 0.0.0.0:8080->8080/tcp tomcat9
[root@localhost ~]# docker stop tomcat9
tomcat9
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker restart tomcat9
tomcat9
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7b45b686077 tomcat:9.0.20-jre8 "catalina.sh run" 3 minutes ago Up 2 seconds 0.0.0.0:8080->8080/tcp tomcat9
docker exec **:**在运行的容器中执行命令。早期有attach命令,对于阻塞命令会等待,所以不方便。在Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令。
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
执行命令:
有bash命令的linux系统:例如centos
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim
docker exec -it tomcat9.1 /bin/bash
没有bash命令的linux系统:例如alpine系统
docker run -it --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker exec -it tomcat9.2 sh
常用参数:
1,**-i *即使没有附加也保持STDIN 打开
2,**-t *分配一个伪终端
docker inspect : 获取容器/镜像的元数据。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
执行命令:
docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker inspect tomcat9
常用参数:
1,**-f *指定返回值的模板文件。
2,**-s *显示总的文件大小。
3,**–type *为指定类型返回JSON。
docker update :可以动态地更新容器配置。可以更新一个或多个容器配置。多个容器名称或ID之间使用空格分隔。但update命令不是很成熟,有很多配置项不能动态更新。推荐大家还是rm容器后,再重新run一个新的镜像。
docker update [OPTIONS] CONTAINER [CONTAINER...]
执行命令:
docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
更新容器restart策略
docker update --restart always tomcat9
docker kill :杀掉一个运行中的容器。
docker kill [OPTIONS] CONTAINER [CONTAINER...]
执行命令:
docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker kill tomcat9
docker ps docker
ps -a docker start tomcat9
常用参数:
**-s *向容器发送一个信号