Files
Cloud-book/Docker/Docker容器管理.md
2025-08-27 17:10:05 +08:00

6.9 KiB
Raw Blame History

容器

使用场景

开发一个杀手级的 Web 应用它包含三个主要组件React 前端、Python API 和 MySQL 数据库。如果你想开发这个项目,你必须安装 Node、Python 和 MySQL。

  • 如何确保团队中开发人员使用的Python版本一致
  • 如何确保应用运行所需的版本不和现有生产环境版本冲突?

什么是容器独立进程。React 前端、Python API、MySQL 都在独立的环境中运行,并与其他组件完全隔离。

容器和虚拟机

img

虚拟化 容器
隔离性强有独立的GUEST OS 共享内核和OS隔离性弱!
虚拟化性能差(>15%) 计算/存储无损耗无Guest OS内存开销(~200M)
虚拟机镜像庞大(十几G~几十G), 且实例化时不能共享 Docker容器镜象200~300M且公共基础镜象实例化时可以共享
虚拟机镜象缺乏统一标准 Docker提供了容器应用镜象事实标准OCI推动进一 步标准化
虚拟机创建慢(>2分钟) 秒级创建(<10s)相当于建立索引
虚拟机启动慢(>30s) 读文件逐个加载 秒级(<1s,不含应用本身启动)
资源虚拟化粒度低单机10~100虚拟机 单机支持1000+容器密度很高,适合大规模的部署

对比总结

  • 资源利用率更高:一台物理机可以运行数百个容器,但一般只能运行数十个虚拟机。
  • 开销更小:不需要启动单独的虚拟机占用硬件资源。
  • 启动速度更快:可以在数秒内完成启动。

容器管理

创建容器

Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

[root@docker-server ~]# docker create -it --name nginx-test nginx bash

启动容器

Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]

[root@docker-server ~]# docker start nginx

重启容器

Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]

[root@docker-server ~]# docker restart nginx

停止容器

Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]

[root@docker-server ~]# docker stop nginx

列出容器

Usage: docker ps [OPTIONS]

[root@docker-server ~]# docker ps -a

运行容器

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 等同于 create + start
[root@docker-server ~]# docker run -it centos:latest bash

# 指定DNS
[root@docker-server ~]# docker run -it --rm --dns 8.8.8.8 centos bash

# 端口映射
## 前台启动随机映射端口
[root@docker-server ~]# docker run -P nginx
## 方式1本地端口80映射到容器80端口
[root@docker-server ~]# docker run -p 80:80 --name nginx-1 nginx:latest 
## 方式2本地ip本地端口容器端口
[root@docker-server ~]# docker run -p 192.168.204.135:80:80 --name nginx-1 nginx:latest 
## 方式3本地ip本地随机端口容器端口
[root@docker-server ~]# docker run -p 192.168.175.10::80 --name nginx-1 nginx:latest 
## 方式4本地ip本地端口容器端口/协议默认为tcp协议
[root@docker-server ~]# docker run -p 192.168.175.10:80:80/tcp --name nginx-1 nginx:latest 
## 查看容器已经映射的端口
[root@docker-server ~]# docker port nginx-1

# 传递运行命令
[root@docker-server ~]# docker run -it centos:latest /bin/bash
[root@docker-server ~]# docker run -it centos:latest cat /etc/hosts

# 单次运行,容器退出后自动删除
[root@docker-server ~]# docker run --name hello_world_test --rm hello-world

# 后台运行
[root@docker-server ~]# docker run -d -P --name nginx-2 nginx

参数说明:

选项 说明
-d 以守护进程方式在后台运行容器。默认为否,适用于运行需要持续在线的服务
-i 保持标准输入打开即使未连接也保持STDIN打开常与-t一起使用
-P 通过NAT机制将容器标记暴露的端口自动映射到主机的随机临时端口
-p 手动指定容器端口映射,格式:主机(宿主)端口:容器端口
-t 分配一个伪终端pseudo-TTY通常与-i配合使用以提供交互式shell
-v 挂载主机上的文件卷到容器内,格式:主机目录:容器目录[:权限]
--rm 容器退出后自动删除容器(不能与-d同时使用适用于临时测试场景
-e 设置容器内的环境变量,格式:-e 变量名=变量值
-h 指定容器的主机名,便于容器间通过主机名访问
--name 指定容器的别名,方便管理和访问容器
--cpu-shares 设置容器使用CPU的相对权重默认1024数值越高优先级越高
--cpuset-cpus 限制容器使用特定的CPU核心0-3使用前4个核心或0,2使用第1、3核心
-m 限制容器可使用的最大内存量支持的单位b、k、m、g-m 512m

挂起/恢复容器

Usage: docker pause CONTAINER [CONTAINER...]

[root@docker-server ~]# docker pause nginx-2

Usage: docker unpause CONTAINER [CONTAINER...]

[root@docker-server ~]# docker unpause nginx-2

进入容器

Usage: docker exec [OPTIONS] CONTAINER

[root@docker-server ~]# docker exec -it nginx-2 bash
# attach不推荐: 所有使用此方式进入容器的操作都是同步显示的且exit容器将被关闭且使用exit退出后容器关闭
[root@docker-server ~]# docker attach nginx-2
# nsenter: 通过pid进入到容器内部不过可以使用docker inspect获取到容器的pid
[root@docker-server ~]# nsenter -t $(docker inspect -f "[.State.Pid]" nginx-2) -m -u -i -n -p

导入/导出容器

Usage: docker export [OPTIONS] CONTAINER

[root@docker-server ~]# docker export -o /opt/nginx.tar nginx-2

Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

[root@docker-server ~]# docker import /opt/nginx.tar nginx:v50

适用场景: 主要用来制作基础镜像比如从一个ubuntu镜像启动一个容器然后安装一些软件和进行一些设置后使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用作为基础的开发环境。(因为export导出的镜像只会保留从镜像运行到export之间对文件系统的修改所以只适合做基础镜像)

查看容器日志

Usage: docker logs [OPTIONS] CONTAINER

[root@docker-server ~]# docker logs nginx-2

删除容器

Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]

[root@docker-server ~]# docker rm -f nginx-2