Docker 容器

Strong 2021年04月27日 758次浏览

Docker容器

1、Docker容器概述

Docker容器是镜像运行的实例。容器是在一个资源隔离的环境中运行应用程序和其依赖项的、轻量化的虚拟化技术。容器运行在独立的沙箱环境中,这保证了容器内的进程不会影响到容器外的任何进程。

1.1 容器的优点

  1. 敏捷环境:容器技术的最大优势是比创建VM(虚拟机)实例更快的速度。它们的轻量化在性能和占用空间方面的开销更小。
  2. 提高生产力:提高开发、部署以及升级效率;每个容器都可以被看作是一个不同的微服务,因此可以独立升级,而不需要考虑它们的同步。
  3. 版本控制:容器的每个镜像都可以进行版本控制,因此可以跟踪不同版本的容器,注意版本之间的差异。
  4. 计算环境可移植性:docker的镜像封装了程序运行所依赖的环境,所以只要安装docker程序,并下载镜像在任何环境都可以运行容器。
  5. 标准化:大多数容器基于开放标准,可以运行在所有主要的Linux发行版,微软等。
  6. 安全:容器将一个容器的进程与另一个容器以及底层基础架构隔离开来;因此一个容器中的任何升级或更改都不会影响其他容器。

1.2 容器工作原理

名称空间: Docker通过名称空间机制为容器提供隔离的工作空间。

控制组: Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Docker引擎正是依赖这种底层技术来限制容器使用的资源。

联合文件系统: 可以将其他文件系统合并到一个联合挂载点。联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来实现继承。

容器格式: Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontainer。

Docker容器使用UnionFS(联合文件系统):
当docker容器加载镜像启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中;只有容器层是可写的,容器层下面的所有镜像层都是只读的。

image_run.png

2、Docker容器管理命令

2.1 容器查看命令

docker ps		//查看容器运行状态
选项:
-a 			//显示所有的容器,包括未运行的
-q			//只显示容器id
-l			//显示最近创建的容器。
-f "筛选条件"		//根据条件过滤显示的内容

示例:
[root@docker ~]# docker ps -a 
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS     NAMES
b2573716a20d   hello-world   "/hello"                 9 minutes ago    Exited (0) 9 minutes ago             focused_perlman

CONTAINER ID		//容器 ID
IMAGE			//使用的镜像
COMMAND			//启动容器时运行的命令
CREATED			//容器的创建时间
STATUS			//容器状态
状态有7种:
	created(已创建)
	restarting(重启中)
	running(运行中)
	removing(迁移中)
	paused(暂停)
	exited(停止)
	dead(死亡)
PORTS			//容器的端口信息和使用的连接类型(tcp\udp)。
NAMES			//容器名称

2.2 容器详细信息查看命令

docker inspect 容器名	//查看容器详细信息

示例:
[root@docker ~]# docker inspect test
......略........

2.3 容器创建命令

docker run		//从镜像运行一个容器
选项:
--name			//指定容器的名称,如果不指定随机给容器生成一个名称
-it			//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
-d			//容器以守护进程的方式运行
-p 宿主机端口:容器端口	//将宿主机端口映射给容器端口
-v 宿主机目录:容器目录	//将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
-e			//启动容器时传递环境及其值
--rm			//容器退出时删除容器
--cpuset-cpus CPU序号	//容器能够使用哪些物理cpu
--cpu-shares 数值	//CPU共享权值(相对权重)
--memory 数值		//容器内存限制,单位b,k,m,g
--memory-swap 数值	//容器内存+交换分区大小,不能小-m的值
--restart 策略		//指定容器停止后的重启策略
	no		//容器退出时不重启
	on-failure	//容器故障退出(返回值非零)时重启
	always		//容器退出时总是重启
--network 网络名称	//容器网络设置
	bridge 		//使用桥接模式
	host		//容器使用主机的网络
	container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
	none 		//容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
--link 容器名称		//指定容器间的关联,可以和指定容器进行通信

示例:
//使用nginx镜像启动一个名为nginx00的容器
[root@docker ~]# docker run --name nginx00 nginx 
.....略......

//使用nginx镜像启动一个名为nginx01的容器并分配一个bash shell的终端进入容器
[root@docker ~]# docker run --name nginx01 -it nginx /bin/bash
root@a4f41fb35ac3:/# 
root@a4f41fb35ac3:/# exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

//使用nginx镜像启动一个名为nginx02的容器并在后台运行
[root@docker ~]# docker run --name nginx02 -d nginx
87dd1b06a58a87921178503024bfdfba79b0b80902606fc7bcccfce67939c6bc

//使用nginx镜像启动一个名为nginx03的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@docker ~]# docker run --name nginx03 -d -p 8080:80 nginx
9b2fa686b4aee04a7d564b6bf627b459e4aab43ca2b5b47ab590ee8e4ebd89f5

//查看所有容器状态
[root@docker ~]# docker ps -a 
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS     NAMES
9b2fa686b4ae   nginx         "/docker-entrypoint.…"   23 minutes ago   Up 19 minutes              80/tcp    nginx03
87dd1b06a58a   nginx         "/docker-entrypoint.…"   42 minutes ago   Up 27 minutes              80/tcp    nginx02
a4f41fb35ac3   nginx         "/docker-entrypoint.…"   49 minutes ago   Exited (0) 4 seconds ago             nginx01
asdasd06a58a   nginx         "/docker-entrypoint.…"   59 minutes ago   Exited (0) 4 seconds ago             nginx00

2.4 容器生命周期管理命令

docker start   容器名	//开启容器
docker stop    容器名	//停止容器
docker kill    容器名	//杀死容器
docker restart 容器名	//重启容器
docker pause   容器名	//暂停容器中所有的进程
docker unpause 容器名	//恢复容器中所有的进程

2.5 容器占用资源查看命令

docker stats  容器名	//查看容器使用资源信息
docker top    容器名	//查看容器中运行的进程信息,支持ps命令参数
docker port   容器名	//查看宿主机端口和容器端口之间的端口映射

2.6 容器日志查看命令

docker logs   容器名	//获取容器的日志信息
选项:
-f			//跟随打印最新的日志追加在最后面
-t			//显示日志打印的时间戳
--tail 数量		//只显示最新的指定数量的几条日志信息

2.7 容器内进程连接和命令执行

docker attach 容器名	//连接到正在运行的容器进程中,默认连接到容器启动时启动的进程

示例:
//连接到nginx02容器中的nginx进程,此时可以看到nginx工作日志
[root@docker ~]# docker attach nginx02
172.17.0.1 - - [27/Apr/2021:16:21:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.1" "-"
注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行

//如果容器启动时运行的命令是shell进程,则连接shell终端
[root@docker ~]# docker attach nginx01
root@9b2fa686b4ae:/# 
root@9b2fa686b4ae:/# exit
exit
注意:使用attache连接到容器的shell一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

docker exec 容器名 执行命令	//不进入容器执行容器中的命令
选项:
-d				//后台执行,不显示结果
-it				//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端

示例:
//不进入容器执行容器中的ls命令
[root@docker ~]# docker exec nginx03 ls 
bin
boot
dev
......

//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@docker ~]# docker exec -it nginx03 /bin/bash
root@87dd1b06a58a:/# 
root@87dd1b06a58a:/# exit
exit

2.8 宿主机和容器文件复制命令

docker cp 容器名:容器文件路径 宿主机路径	//将容器中的文件复制到宿主机中

docker cp 宿主机路径 容器名:容器文件路径	//将宿主机中的文件复制到容器中

示例:
//将容器中的nginx配置文件复制到宿主机
[root@docker ~]# docker cp nginx03:/etc/nginx/nginx.conf /root/
[root@docker ~]# ls
Documents  Music     Public     Videos           initial-setup-ks.cfg
Desktop  Downloads  Pictures  Templates  anaconda-ks.cfg  nginx.conf

2.9 容器导出和导入命令

docker export 容器名 > 导出的容器文件名	//容器导出

docker import 导出的容器文件名 镜像:标签	//容器导入,导入之后只会生成镜像

示例:
//将nginx01容器导出为/tmp/nginx-hzz文件
[root@docker ~]# docker export nginx03 > /tmp/nginx-hzz

//将导出的容器导入为镜像,名字叫nginx-hzz:hzz
[root@docker ~]# docker import /tmp/nginx-hzz nginx-hzz:hzz
sha256:e46da7739eede49b1f2aa5851f8c75a700d1159a69daa05427b65b3619d88353

2.10 容器删除命令

docker rm 容器名			//删除容器,无法删除运行状态下的容器
选项:
-f				//强制,可以删除运行状态下的容器

示例:
//删除nginx01容器
[root@docker ~]# docker rm nginx01
nginx01

//批量删除所有容器
[root@docker ~]# docker rm `docker ps -qa`
9b2fa686b4ae
a4f41fb35ac3