前言
docker容器相当于一个进程,性能接近于原生,几乎没有损耗;
docker容器在单台主机上支持的数量成百上千;
容器与容器之间相互隔离;
镜像是创建容器的基础,可以理解镜像为一个压缩包
Docker 容器管理
1.1 容器创建docker create
容器创建就是将镜像加载到容器的过程。
新创建的容器处于停止状态,不会运行任何程序,需要在其中发起一个进程来启动容器.
格式:
docker create [选项] 镜像
常用选项:
选项 |
含义 |
-i |
让容器的输入保持打开 |
-t | 让Docker 分配一个伪终端(如果想要导入一些命令,需要这个参数) |
-it | 合起来实现和容器交互的作用,运行一个交互式会话shell |
–name=容器名称 |
指定容器名称,不指定会随机生成 |
#创建容器 [root@localhost ~]# docker create -i stevelugyq/nginx:latest 39ec9b5d21b18655e48d4c7af7b3287f4b6e609cb92fe2f9c9d7da028e41b96f #创建容器并分配一个伪终端 [root@localhost ~]# docker create -it stevelugyq/nginx:latest bash 9aa623f4e591167b4a146d0cded961ec7367c052133128fa92d6f10a26d29309 #显示所有的容器 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 30 seconds ago Created interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 40 seconds ago Created agitated_wu
1.2 查看容器运行状态docker ps
格式:
docker ps [选项]
直接使用 docker ps ,只查看当前正在运行的容器
常用选项:
选项 |
含义 |
-a | 显示所有的容器,包括未运行的 |
-f |
根据条件过滤显示的内容 |
–format |
指定返回值的模板文件 |
-l |
显示最近创建的容器 |
-n |
列出最近创建的n个容器 |
–no-trunc |
不间断输出 |
-q |
静默模式,只显示容器编号 |
-s |
显示总的文件大小 |
#查看当前运行的容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp agitated_wu #查看当前所有容器 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp agitated_wu #查看当前所有容器的ID号 [root@localhost ~]# docker ps -aq 9aa623f4e591 39ec9b5d21b1 #查看当前所有容器的大小 [root@localhost ~]# docker ps -as CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp interesting_cray 0B (virtual 142MB) 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp agitated_wu 1.09kB (virtual 142MB) #查看最后创建的2 个镜像 [root@localhost ~]# docker ps -n 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Up 17 hours 80/tcp agitated_wu
字段 | 含义 |
CONTAINER ID | 容器ID号 |
IMAGE | 使用什么镜像去运行 |
COMMAND | 容器运行时使用的命令 |
CREATED | 创建容器的时间 |
STATUS | 当前容器状态 |
PORTS | 映射的端口(空代表没有端口) |
NAMES | 容器运行的名称,如果不自定义会随机生成 |
1.3 启动容器docker start
格式:
docker start 容器ID/名称
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 30 seconds ago Created interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 40 seconds ago Created agitated_wu [root@localhost ~]# #使用容器id 启动容器。 [root@localhost ~]# docker start 9aa623f4e591 9aa623f4e591 #再次查看状态,status 状态项为 up [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 14 seconds 80/tcp interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 12 minutes ago Created agitated_wu #使用容器名称启动 [root@localhost ~]# docker start agitated_wu agitated_wu [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 14 minutes ago Up 2 minutes 80/tcp interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 14 minutes ago Up 2 seconds 80/tcp agitated_wu
注:端口号是容器的端口,不是宿主机的端口
1.4 创建并启动容器docker run
可以直接执行 docker run 命令, 等同于先执行docker pull、 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
1.检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
2.利用镜像创建并启动一个容器;
3.分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
4.从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
5.分配一个地址池中的 IP 地址给容器;
6.执行用户指定的应用程序,执行完毕后容器被终止运行。
Docker的机制是让容器后台运行,必须至少有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),会自动退出
格式:
docker run [选项] IMAGE [命令]
选项说明:
参数 说明
参数 |
说明 |
-a | 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 |
-d | 后台运行容器,并返回容器ID |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-P | 随机端口映射,容器内部端口 随机 映射到主机的端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
–name= | 为容器指定一个名称 |
–dns 8.8.8.8 | 指定容器使用的DNS服务器,默认和宿主一致 |
–dns-search example.com | 指定容器DNS搜索域名,默认和宿主一致 |
-h |
指定容器的hostname |
-e username= | 设置环境变量 |
-e username= | 从指定文件读入环境变量 |
-e username= | 设置容器使用内存最大值 |
–net= | 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 |
–link=[ ] | 添加链接到另一个容器 |
–expose=[ ] | 开放一个端口或一组端口 |
-volume , -v |
绑定一个卷 |
#使用centos:7 镜像创建容器,如果没有该镜像则自动从公有仓库拉取 #容器创建后执行 ls / 命令 [root@localhost ~]# docker run centos:7 bash -c "ls /" Unable to find image 'centos:7' locally 7: Pulling from library/centos 2d473b07cdd5: Pull complete Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407 Status: Downloaded newer image for centos:7 anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bec1acb446b6 centos:7 "bash -c 'ls /'" 8 minutes ago Exited (0) 8 minutes ago heuristic_snyder
在后台持续运行docker run 创建的容器
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束.
使用 itd 选项,可以创建并持续运行容器。即使进入容器后使用exit命令退出,也不会停止容器
#后台运行容器并执行死循环命令 [root@localhost ~]# docker run -i centos:7 /usr/bin/bash -c "while true;do echo $(date); sleep 1; done" #关闭这个容器,再开一个终端,stop #创建容器并持续后台运行容器.使用--name 指定名称 [root@localhost ~]# docker run -itd --name mycentos centos:7 /bin/bash 92829fa3c5849e499ee96aa6aa9c4b2e5d96a705dcb16fa48f4483e1edceaf16
1.5 终止容器运行docker stop/kill
格式:
docker stop/kill 容器ID/名称
stop: 停止容器,可以给容器一个等待时间,以防止数据的丢失。
kill: 立即强行停止一个容器(相当于linux命令 kill -9) ,不会给容器反应时间,可能会造成数据丢失
[root@localhost ~]# docker stop 9aa623f4e591 9aa623f4e591 [root@localhost ~]# docker kill 39ec9b5d21b1 39ec9b5d21b1 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9aa623f4e591 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Exited (137) 29 seconds ago interesting_cray 39ec9b5d21b1 stevelugyq/nginx:latest "/docker-entrypoint.…" 17 hours ago Exited (137) 3 seconds ago agitated_wu
1.6 删除容器docker rm [-f]
格式:
docker rm [-f] 容器ID/名称
1.#不能删除运行状态的容器,只能-f强制删除,或者先停止再删除 [root@localhost ~]# docker rm 9aa623f4e591 Error response from daemon: You cannot remove a running container 9aa623f4e591167b4a146d0cded961ec7367c052133128fa92d6f10a26d29309. Stop the container before attempting removal or force remove 2.#已经退出的容器,可以直接删除 [root@localhost ~]# docker rm 39ec9b5d21b1 39ec9b5d21b1 3.#基于名称匹配的方式删除 [root@localhost ~]# docker rm -f stoic_snyder stoic_snyder 4.#删除所有运行状态的容器 [root@localhost ~]# docker start compassionate_easley compassionate_easley [root@localhost ~]# docker ps -q 2539db89feb1 [root@localhost ~]# docker rm -f `docker ps -q` 2539db89feb1 5.#删除所有容器 #法一 [root@localhost ~]# docker rm -f `docker ps -aq` ba876d7eb965 bc63914bf6d0 7484efd3c848 #法二 [root@localhost ~]# docker ps -a |awk 'NR>=2 {print $1}' |xargs docker rm -f #法三 [root@localhost ~]# docker rm -f $(docker ps -aq)