Docker容器基本操作
容器操作基础命令
容器生命周期
启动容器的流程
启动容器"run"
docker run 可以启动容器,进入到容器,并随机生成容器ID和名称
简介
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。
docker run 启动过程(重要)
1)检查本地是否有镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器;
2)在只读的镜像层上挂载一层可读可写的容器层;
3)从docker网桥给容器分配一个虚拟接口和IP地址给容器;
4)使用镜像的默认命令或者指定的命令启动容器,直到容器中pid=1的主进程退出为止。
命令
基本格式和常用选项
#基本格式
docker run -d [选项] 镜像名:标签 [容器启动命令]
#常用选项
- `-d`:以后台模式运行容器。
- `-it`:以交互模式运行容器。
- `--name`:为容器指定一个名称。
- `-p`:将容器的端口映射到主机上的特定端口。
- `-P`:随机端口映射
- `-v`:将主机上的目录或文件挂载到容器中。
- `-e`:设置容器的环境变量。
- `--rm`:容器停止后自动删除。
- `--network`:指定容器要使用的网络。
- `--link`:将容器链接到另一个容器。
运用实例
[root@C7-1 ~]# docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/07/30 03:26:24 [notice] 1#1: using the "epoll" event method
2024/07/30 03:26:24 [notice] 1#1: nginx/1.21.5
2024/07/30 03:26:24 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2024/07/30 03:26:24 [notice] 1#1: OS: Linux 3.10.0-1160.119.1.el7.x86_64
2024/07/30 03:26:24 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/07/30 03:26:24 [notice] 1#1: start worker processes
2024/07/30 03:26:24 [notice] 1#1: start worker process 31
2024/07/30 03:26:24 [notice] 1#1: start worker process 32
2024/07/30 03:26:24 [notice] 1#1: start worker process 33
2024/07/30 03:26:24 [notice] 1#1: start worker process 34
2024/07/30 03:26:24 [notice] 1#1: start worker process 35
2024/07/30 03:26:24 [notice] 1#1: start worker process 36
2024/07/30 03:26:24 [notice] 1#1: start worker process 37
2024/07/30 03:26:24 [notice] 1#1: start worker process 38
2024/07/30 03:26:26 [notice] 1#1: signal 28 (SIGWINCH) received
在后台持续运行 docker run 创建的容器,需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行,并且容器所运行的程序不能结束。
[root@C7-1 ~]# docker run -d nginx
docker run -itd --name n1 nginx:latest
docker run的重启策略
docker run --restart no/always/on-failure/unless-stopped
-
no:默认的重启策略,不管容器是正常退出还是异常退出,总是不重启容器。
-
always:不管容器是正常退出还是异常退出,总是重启容器
-
on-failure:只在容器异常退出时重启容器。on-failure:N 表示容器重启了N次。
-
unless-stopped:总是重启容器,但不考虑docker服务端启动时就已经退出的容器。
启动第一个容器
范例: 运行docker 的 nginx(前台运行)
[root@C7-1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@C7-1 ~]# docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/07/30 03:26:24 [notice] 1#1: using the "epoll" event method
2024/07/30 03:26:24 [notice] 1#1: nginx/1.21.5
2024/07/30 03:26:24 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2024/07/30 03:26:24 [notice] 1#1: OS: Linux 3.10.0-1160.119.1.el7.x86_64
2024/07/30 03:26:24 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/07/30 03:26:24 [notice] 1#1: start worker processes
2024/07/30 03:26:24 [notice] 1#1: start worker process 31
2024/07/30 03:26:24 [notice] 1#1: start worker process 32
2024/07/30 03:26:24 [notice] 1#1: start worker process 33
2024/07/30 03:26:24 [notice] 1#1: start worker process 34
2024/07/30 03:26:24 [notice] 1#1: start worker process 35
2024/07/30 03:26:24 [notice] 1#1: start worker process 36
2024/07/30 03:26:24 [notice] 1#1: start worker process 37
2024/07/30 03:26:24 [notice] 1#1: start worker process 38
2024/07/30 03:26:26 [notice] 1#1: signal 28 (SIGWINCH) received
....
查看容器的运行状态
-CONTAINER ID 容器的ID号
-IMAGE 加载的镜像
-COMMAND 运行的程序
-CREATED 创建时间
-STATUS 当前的状态
-PORTS 端口映射
-NAMES 名称
终止容器运行
#格式 docker stop 容器的ID/名称
#以上文中,处于运行状态的容器为例
docker stop 4d3f1a4a9811
docker ps -a
容器的进入
- attach (不推荐)
- exec
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器
#格式 docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
docker start f491bfb936dd
#进入容器前,确保容器正在运行
docker exec -it f491bfb936dd /bin/bash
ls
exit
#退出容器后,容器仍在运行
docker ps -a
docker run -it nginx:latest bash #不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止
删除容器
格式:docker rm [-f] 容器ID/名称
docker stop 40085fc92d1c
docker rm 40085fc92d1c #删除已经终止状态的容器
docker rm -f 7e8fd3421682 #强制删除正在运行的容器
总结
docker容器操作
docker create [-it] [--name 容器名] 镜像名:标签 [容器启动命令] #创建一个容器,可以指定容器名、镜像和容器启动命令
start 容器名|容器ID #启动一个已经创建的容器,可以通过容器名或容器ID指定
ps [-a] #列出当前运行的容器,可选参数 `-a` 表示列出所有容器,包括停止状态的容器。
stop 容器名|容器ID #kill -15,发送SIGTERM信号,默认等待10s
kill 容器名|容器ID #kill -9,发送SIGKILL强制停止容器
rm 容器名|容器ID [-f] #批量删除 docker rm $(docker ps -aq) [-f]
inspect 容器名|容器ID #获取一个容器的详细信息,包括容器的配置和状态
logs 容器名|容器ID [-f] #查看一个容器的日志,可选参数 `-f` 实时跟踪日志输出
exec -it 容器名|容器ID bash|sh #在一个正在运行的容器内执行命令,可以进入容器的交互式终端(bash或sh)
cp 容器名|容器ID:绝对路径 宿主机路径 #将容器内的文件或文件夹复制到宿主机指定路径
cp 宿主机路径 容器名|容器ID:绝对路径 #将宿主机的文件或文件夹复制到容器指定路径
export -o 容器模板文件 容器名|容器ID #导出一个容器的文件系统快照为容器模板文件
export 容器名|容器ID > 容器模板文件 #导出一个容器的文件系统快照到指定的容器模板文件
import 容器模板文件 -- 镜像名:标签 #导入一个容器模板文件为镜像
cat 容器模板文件 | docker import - 镜像名:标签 #通过管道方式将容器模板文件导入为镜像
docker system prune -a #清除未开启的容器、没被使用的镜像和网络、构建镜像的缓存
docker run
docker run 启动过程:1)检查本地是否有镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
2)在只读的镜像层上挂载一层可读可写的容器层
3)从docker网桥给容器分配一个虚拟接口和IP地址给容器
4)使用镜像的默认命令或者指定的命令启动容器,直到容器中pid=1的主进程退出为止
docker run -d [选项] 镜像名:标签 [容器启动命令]
-i -t --name --rm
-P #使用从32768开始的随机端口映射容器
-p 宿主机端口:容器端点 #指定宿主机端口映射容器
-v 宿主机绝对路径:容器绝对路径[:ro]
--volumes-from 数据卷容器名
--link 目标容器名:连接别名