Docker容器基本操作

359 阅读8分钟

Docker容器基本操作

容器操作基础命令

image.png

image.png

容器生命周期

image.png

启动容器的流程

image.png

启动容器"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

image.png

docker run -itd --name n1 nginx:latest

image.png

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
....

image.png

查看容器的运行状态

image.png

-CONTAINER ID  容器的ID号
-IMAGE         加载的镜像
-COMMAND       运行的程序
-CREATED       创建时间
-STATUS        当前的状态
-PORTS         端口映射 
-NAMES         名称

终止容器运行

#格式 docker stop 容器的ID/名称
#以上文中,处于运行状态的容器为例 
docker stop 4d3f1a4a9811 

docker ps -a

image.png

容器的进入

  • 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

image.png

docker run -it nginx:latest bash #不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止

image.png

image.png

image.png

删除容器

格式:docker rm [-f] 容器ID/名称



docker stop 40085fc92d1c

image.png

docker rm 40085fc92d1c #删除已经终止状态的容器

image.png

docker rm -f 7e8fd3421682 #强制删除正在运行的容器

image.png

总结

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 目标容器名:连接别名

image.png