【docker】10. 容器操作案例

容器操作案例

容器基本操作

• 通过 nginx 镜像文件创建容器

• 容器的列举(包含正在运行的容器)

powershell 复制代码
# 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态
root@LAPTOP-H2EI4I6A:~# docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
e7c33d9f5c61   nginx     "/docker-entrypoint...."   59 seconds ago   Up 58 seconds   80/tcp    keen_mestorf

• 停止当前正在运行的容器

powershell 复制代码
 docker container stop e7c33d9f5c61

• 容器的列举(包含正在运行和退出的容器)

powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker container ls -a

# 看到可以列举出已经退出的状态
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                      PORTS                               NAMES
e7c33d9f5c61   nginx          "/docker-entrypoint...."   3 minutes ago   Exited (0) 14 seconds ago                                       keen_mestorf
e249ad15d7fe   nginx:1.23.3   "/docker-entrypoint...."   4 weeks ago     Exited (255) 4 weeks ago    0.0.0.0:80->80/tcp, :::80->80/tcp   brave_raman
8c5bbb5a7a3c   nginx:1.23.3   "/docker-entrypoint...."   4 weeks ago     Exited (255) 4 weeks ago    80/tcp                              mynginx
97eb88ba8c20   d2c94e258dcb   "/hello"                 5 weeks ago     Exited (0) 5 weeks ago                                          epic_pasteur

• 容器的删除

powershell 复制代码
# 删除 e7c33d9f5c61 这个容器
root@LAPTOP-H2EI4I6A:~# docker container rm e7c33d9f5c61
e7c33d9f5c61
# 查看当前容器列表 可以发现 e7c33d9f5c61 该容器已经被删除
root@LAPTOP-H2EI4I6A:~# docker container ls -a
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS                     PORTS                               NAMES
e249ad15d7fe   nginx:1.23.3   "/docker-entrypoint...."   4 weeks ago   Exited (255) 4 weeks ago   0.0.0.0:80->80/tcp, :::80->80/tcp   brave_raman
8c5bbb5a7a3c   nginx:1.23.3   "/docker-entrypoint...."   4 weeks ago   Exited (255) 4 weeks ago   80/tcp                              mynginx
97eb88ba8c20   d2c94e258dcb   "/hello"                 5 weeks ago   Exited (0) 5 weeks ago                                         epic_pasteur

容器状态迁移

  1. 首先我们创建容器
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker create --name mynginx1 -p 80:80 nginx:1.22.1
Unable to find image 'nginx:1.22.1' locally
1.22.1: Pulling from library/nginx
Digest: sha256:fc5f5fb7574755c306aaf88456ebfbe0b006420a184d52b923d2f0197108f6b7
Status: Downloaded newer image for nginx:1.22.1
4877bec6d520594290e0891a090f167f681bd30798e26e982bfd2362862b0b28
  1. 通过 docker ps 我们可以看到容器状态为已经创建
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker ps -a | grep mynginx1
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   43 seconds ago   Created                                                        mynginx1
  1. 通过 docker start 启动容器
powershell 复制代码
root@139-159-150-152:~# docker start mynginx1
mynginx1
  1. 通过 docker ps 可以看到容器为已经运行
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS                               NAMES
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   2 minutes ago   Up 33 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1
  1. 通过 docker stop 可以停止容器
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker stop mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker ps -a |grep mynginx1
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   3 minutes ago   Exited (0) 36 seconds ago                                       mynginx1
  1. 再次启动容器,然后 kill 容器
powershell 复制代码
root@139-159-150-152:/data/var/lib/docker# docker start mynginx1
mynginx1
root@139-159-150-152:/data/var/lib/docker# docker kill mynginx1
mynginx1
root@139-159-150-152:/data/var/lib/docker# docker ps -a |grep 
mynginx1
11fc874cea79 nginx:1.22.1 "/docker-entrypoint...." 3 minutes 
ago Exited (137) 5 seconds ago mynginx1

这里的137表示容器进程接收到了退出码(137=128+9)也就是接收到SIGKILL的信号

  1. 启动容器,然后暂停容器
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker start mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker pause mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                   PORTS                               NAMES
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   8 minutes ago   Up 39 seconds (Paused)   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1
  1. 恢复容器
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker unpause mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS              PORTS                               NAMES
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   8 minutes ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1
  1. 重启容器,可以看到容器的启动时间变短了。
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS              PORTS                               NAMES
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   9 minutes ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1
root@LAPTOP-H2EI4I6A:~# docker restart mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
4877bec6d520   nginx:1.22.1   "/docker-entrypoint...."   9 minutes ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1
  1. 通过 docker rm 可以删除容器
powershell 复制代码
root@LAPTOP-H2EI4I6A:~# docker stop mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker rm mynginx1
mynginx1
root@LAPTOP-H2EI4I6A:~# docker ps -a | grep mynginx1
root@LAPTOP-H2EI4I6A:~# 

容器批量处理技巧

命令 解释
docker container ls -qf name=xxx 根据名称过滤得到容器编号
docker container ls --filter status=running 根据状态过滤容器信息,这里是筛选出状态为正在运行的容器相关信息
docker container ls -aq 静默获取全部容器 id,即不显示额外的表头之类信息,仅输出所有容器的 id
docker container ls --filter ancestor=xxx(按镜像名) 过滤镜像名为 xxx 的容器信息,通过指定的镜像名来筛选对应的容器情况
docker container ls --filter ancestor=xxx(按镜像 id 过滤镜像 idxxx 的容器信息,以特定的镜像 id 为依据来筛选出相关容器情况

• -a:表示打印所有的容器信息, 包括正在运行和已经退出的

• -q: 表示只返回容器 ID

• -f: 表示基于给的条件过滤 等价于 --filter 选项

Shell

powershell 复制代码
# 案例一: 批量删除容器
# 查看当前容器列表
[zsc@VM-8-12-centos ~]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED 
STATUS PORTS NAMES
438d82615e61 nginx "/docker-entrypoint...." 34 minutes ago 
Exited (0) 2 seconds ago hardcore_sanderson
491c6961474b nginx "/docker-entrypoint...." 57 minutes ago 
Exited (130) 51 minutes ago elastic_nobel
50147dca69d7 nginx "/docker-entrypoint...." About an hour 
ago Exited (0) 24 minutes ago happy_curie
433359f24804 nginx "/docker-entrypoint...." 2 hours ago 
Exited (0) 2 hours ago infallible_pasteur
b24b38c58f71 nginx "/docker-entrypoint...." 2 hours ago 
Exited (0) 2 hours ago priceless_meitner
156aba06663a nginx "/docker-entrypoint...." 2 hours ago 
Exited (0) 2 hours ago nervous_hawking
5bdc2c5ced7e nginx "/docker-entrypoint...." 27 hours ago 
Exited (0) 27 hours ago condescending_thompson
b2a843ee6635 nginx "/docker-entrypoint...." 6 days ago 
Exited (0) 5 days ago elegant_archimedes
# 方法一: 删除命令后边加多个容器 ID,比较麻烦, 不建议使用
[zsc@VM-8-12-centos ~]$docker container rm 43 49 50 ...
# 方法二: 通过参数传递方式批量删除容器, 建议使用
[zsc@VM-8-12-centos ~]$ docker container rm $(docker container ls -aq)
438d82615e61
491c6961474b
50147dca69d7
433359f24804
b24b38c58f71
156aba06663a
5bdc2c5ced7e
b2a843ee6635
# 查看当前容器列表, 发现已经批量删除完毕
[zsc@VM-8-12-centos ~]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 
NAMES
# 案例二: 按照状态过滤删除已经退出的容器
# 查看当前容器列表

[zsc@VM-8-12-centos ~]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1ade609ac36 nginx "/docker-entrypoint...." 33 seconds ago Up 31 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp optimistic_keldysh
95c493f5d2b3 nginx "/docker-entrypoint...." 38 seconds ago Exited (0) 33 seconds ago nervous_yalow
d9483e5664c0 nginx "/docker-entrypoint...." 42 seconds ago Exited (0) 39 seconds ago epic_kalam
bdb52c88cd0a nginx "/docker-entrypoint...." 42 minutes ago Exited (0) 43 seconds ago magical_bhaskara
# 按照状态过滤删除已经退出的容器
[zsc@VM-8-12-centos ~]$ docker container rm $(docker container ls -q --filter status=exited)
95c493f5d2b3
d9483e5664c0
bdb52c88cd0a
# 确认是否删除
[zsc@VM-8-12-centos ~]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1ade609ac36 nginx "/docker-entrypoint...." 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp optimistic_keldysh

注:其他命令在做批量处理的时候同样可以类比, 比如批量停止 docker container stop $(docker container ps -aq)

容器交互模式

attached 模式

powershell 复制代码
# 通过 nginx 镜像创建一个容器, 映射 80 端口
[zsc@VM-8-12-centos ~]$ docker container run -p 80:80 nginx

-p 80:80 表示端口映射,第一个端口表示映射到宿主机的端口,第二个端口表示映射到 Docker 容器的端口

• 通过上述方式创建容器,就是 attached 模式,这样容器会在前台运行

• 访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器的日志会实时的展现到窗口并且占用此端口

• 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式
• attached 模式仅适用于容器和程序的调试阶段

下面实践一下 attached 模式的用法

• 第一步: 以 attached 模式创建运行容器, 映射到宿主机的 80 端口

powershell 复制代码
[zsc@VM-8-12-centos ~]$ docker container run -p 80:80 nginx

• 第二步: 访问服务器的 80 端口,用浏览器访问服务器 ip 或者域名,默认访问 80端口

可以看到 nginx 主页已经展现在浏览器上。当我们刷新访问后发现在标准输出上会打印一些相关的 log 出来。

• 第三步: 键入 Ctrl + C

powershell 复制代码
# 键入 Ctrl + C
# 执行命令查看当前容器状态, 可以发现该容器已经退出掉了
[zsc@VM-8-12-centos ~]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
433359f24804 nginx "/docker-entrypoint...." 15 minutes ago Exited (0) 27 seconds ago infallible_pasteur
b24b38c58f71 nginx "/docker-entrypoint...." 19 minutes ago Exited (0) 15 minutes ago priceless_meitner
156aba06663a nginx "/docker-entrypoint...." 42 minutes ago Exited (0) 35 minutes ago  nervous_hawking
5bdc2c5ced7e nginx "/docker-entrypoint...." 25 hours ago Exited (0) 25 hours ago  condescending_thompson
b2a843ee6635 nginx "/docker-entrypoint...." 6 days ago Exited (0) 5 days ago elegant_archimedes

detached 模式

在 docker container run -p 80:80 nginx 命令基础上加一个-d 或者--detach选项表示 detached 模式 , 即在后台执行

• 在后台运行,启动后只显示容器 ID,并且可以输入任何命令
• 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作

• 比起 attached 模式更建议使用

下面来实践一下 detached 模式的用法

• 第一步: 以 detached 模式创建容器, 并映射 80 端口

powershell 复制代码
[zsc@VM-8-12-centos ~]$ docker container run -d -p 80:80 nginx
# 执行结果 返回容器 ID
50147dca69d7d84271476def3a10e030001e3bcd4f2f5c6cb6a7f8b93b8d9a3b

• 第二步: 浏览器访问服务器网址,并查看后台日志

# 查看后台日志
[zsc@VM-8-12-centos ~]$ docker container logs 501

刷新浏览器可以看到此时在后台已经打印出来相关的日志

• 动态跟踪日志:后台日志窗口只会打印一次日志。如果想动态跟踪日志,可以加-f选项;如果想关闭日志跟踪模式,可以键入 Ctrl+C 结束

powershell 复制代码
[zsc@VM-8-12-centos ~]$ docker container logs -f 501

• detached 模式转 attached 模式

powershell 复制代码
[zsc@VM-8-12-centos ~]$ docker container attach 501 

interactive 模式

当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。

例如创建一个 Ubuntu 容器之后,需要到系统里输入各种Shell 命令和系统进行交互就需要进入交互式模式才可以完成。

• 创建运行容器并进入到交互模式

powershell 复制代码
[zsc@VM-8-12-centos ~]$ docker container run -it nginx sh
# 进入到容器的交互 shell 中,可以在该 shell 下执行对应的命令
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh 
etc home lib lib64 media mnt opt proc root run 
sbin srv sys tmp usr var

○ -i:保持容器运行。通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭

○ -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

• 针对一个已经运行的容器里进入到交互模式

powershell 复制代码
# 在后台创建运行 nginx 容器
[zsc@node ~]$ docker container run -d -p 80:80 nginx
50147dca69d7d84271476def3a10e030001e3bcd4f2f5c6cb6a7f8b93b8d9a3b
# 进入该容器的交互模式
[zsc@node ~]$ docker container exec -it 501 sh
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc 
home lib lib64 media mnt opt proc root run sbin srv sys
tmp usr var

• 退出交互式模式: 在交互式 shell 中输入 exit

powershell 复制代码
exit

容器与宿主机内容复制

  1. 我们启动一个 nginx 服务
powershell 复制代码
root@139-159-150-152:/data/var/lib/docker# docker run --name mynginx1 -p 80:80 -d nginx:1.22.1
7608f60572f0c575d077a2ea60b4a90377f7b8f97d83aa37d3f2598be3d8b263
root@139-159-150-152:/data/var/lib/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED 
STATUS PORTS NAMES
7608f60572f0 nginx:1.22.1 "/docker-entrypoint...." 3 seconds 
ago Up 1 second 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1
  1. 在宿主机上编译一个 index.html 文件
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# mkdir -p 
/data/myworkdir/container
root@139-159-150-152:/data/myworkdir/container# cd 
/data/myworkdir/container
root@139-159-150-152:/data/myworkdir/container# echo "Hello bit 
from my container" > index.html
  1. 拷贝宿主机文件到容器中
powershell 复制代码
docker cp /data/myworkdir/container/index.html 
mynginx1:/usr/share/nginx/html/
  1. 进入容器中查看
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker exec -it mynginx1 bash
root@7608f60572f0:/usr/share/nginx/html# cd /usr/share/nginx/html/
root@7608f60572f0:/usr/share/nginx/html# ls -l
total 8
-rw-r--r-- 1 root root 497 Oct 19 08:02 50x.html
-rw-r--r-- 1 root root 28 Mar 24 07:13 index.html
root@7608f60572f0:/usr/share/nginx/html# cat index.html 
Hello bit from my container
  1. 从外部页面访问
  2. 在容器中编辑 index.html
powershell 复制代码
root@7608f60572f0:/usr/share/nginx/html# echo " after edit" >> 
index.html 
root@7608f60572f0:/usr/share/nginx/html# cat index.html 
Hello bit from my container
after edit
root@7608f60572f0:/usr/share/nginx/html# exit
exit
  1. 执行 docker cp 将内容拷贝出来,查看内容,发现文件已经覆盖
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker cp 
mynginx1:/usr/share/nginx/html/index.html ./
Preparing to copy...
Successfully copied 2.048kB to /data/myworkdir/container/./
root@139-159-150-152:/data/myworkdir/container# cat index.html 
Hello bit from my container
after edit
  1. 清理容器,释放空间
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker stop 
mynginx1
mynginx1
root@139-159-150-152:/data/myworkdir/container# docker rm mynginx1
mynginx1

容器自动删除

  1. 启动一个 nginx,我们指定--rm 选项
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run --name mynginx1 -d --rm -p 80:80 nginx:1.22.1
44f865b89919625e539a9fb41d841efa363017a08d9a84194c0046f2e871fe43
root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44f865b89919 nginx:1.22.1 "/docker-entrypoint...." 11 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1
  1. 停止容器
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker stop mynginx1
mynginx1
  1. 再次查看容器是否存在,发现容器自动删除了
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

容器自动重启

容器重启选项如下:

docker run --restart=no [容器名] :默认值不自动重启

docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃

docker run --restart=always [容器名] :always 容器退出时总是重启

docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器

如果容器启动时没有设置--restart 参数,则通过下面命令进行更新:

docker update --restart=always [容器名]

  1. 启动 nginx 服务,指定总是重启
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run --name mynginx1 -d -p 80:80 --restart always nginx:1.22.1
93e8aede76ac7cc09f34e3510b590abae6161eceb2d39cdbcf8d64f86154f9ca
root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED 
STATUS PORTS NAMES
93e8aede76ac nginx:1.22.1 "/docker-entrypoint...." 2 seconds 
ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1
  1. 进入 nginx 服务,kill 启动进程
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker exec -it mynginx1 bash
root@93e8aede76ac:/# kill 1
root@93e8aede76ac:/# 
  1. 查看进程状态,可以看到进程还是启动状态
powershell 复制代码
root@93e8aede76ac:/# root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93e8aede76ac nginx:1.22.1 "/docker-entrypoint...." 22 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1
  1. 释放空间
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker stop mynginx1
mynginx1
root@139-159-150-152:/data/myworkdir/container# docker rm mynginx1
mynginx1

容器环境变量设置

  1. 启动一个 nginx 容器,配置环境变量,TEST=1
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run --name mynginx1 -d -p 80:80 -e TEST=1 nginx:1.22.1
a5bc48b9560b0cc0aa0018af3572ce2024a9d7e37859c4f905c1f6ff11401b8e
  1. 进入容器查看环境变量
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker exec -it mynginx1 bash
root@a5bc48b9560b:/# env |grep TEST
TEST=1
root@a5bc48b9560b:/# exit
exit
  1. 清理空间
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker stop 
mynginx1
mynginx1
root@139-159-150-152:/data/myworkdir/container# docker rm mynginx1
mynginx1

容器详情查看

我们可以查看一个容器的详细信息,比如我们可以查看所有设置的环境变量

  1. 启动容器
powershell 复制代码
root@139-159-150-152:~# docker run --name mynginx1 --rm -p 80:80 -e TEST=1 -d nginx:1.22.1
ad2d90c76b774f3f0d8d72bae8c4dee25d46c74dc5bfad3f3f8bcf3b7f93734a
root@139-159-150-152:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad2d90c76b77 nginx:1.22.1 "/docker-entrypoint...." 3 seconds ago Up 1 second 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx11
  1. 查看容器信息
powershell 复制代码
hacha@LAPTOP-H2EI4I6A:~/test$ docker container inspect mynginx1


  1. 释放资源
powershell 复制代码
docker stop mynginx1
docker rm mynginx1 

容器执行单行命令

我们可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机上没有这个时候借助容器可以完成某些任务。

powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run --rm -p 80:80 nginx:1.22.1 echo "Hello bit"
Hello bit
root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

容器镜像导入导出

  1. 我们创建目录,并编辑一个自定义首页
powershell 复制代码
mkdir -p /data/myworkdir/container/
cd /data/myworkdir/container/
vi index.html
  1. 首页输入以下内容
powershell 复制代码
<html>
<h1>Hello bit!</h1>
</html>
  1. 我们运行一个 nginx 镜像,然后通过 docker cp 修改首页
powershell 复制代码
docker run -d --name mynginx4 -p 80:80 nginx:1.22.1
docker cp /data/myworkdir/container/index.html mynginx4:/usr/share/nginx/html/
  1. 访问首页看到的内容如下
  2. 我们通过 docker export 保存镜像
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker export -o mynginx4.tar mynginx4
root@139-159-150-152:/data/myworkdir/container# ll
total 140900
drwxr-xr-x 2 root root 4096 Mar 15 17:07 ./
drwxr-xr-x 4 root root 4096 Mar 15 16:36 ../
-rw-r--r-- 1 root root 35 Mar 15 16:37 index.html
-rw------- 1 root root 144269312 Mar 15 17:07 mynginx4.tar
  1. 我们通过 docker import 导入镜像
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker import mynginx4.tar mynginx:v0.4
sha256:d95c9d02716925e084774a15b812b3305da0826b3a0b97f6f0c063643d926811
  1. 停止我们现在的容器,重新启动容器
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker stop mynginx4
mynginx4
  1. 使用导出的镜像启动一个新的容器
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run -d --name mynginx5 -p 80:80 mynginx:v0.4 nginx -g "daemon off;"
d1f5c5990c95bf386bd9a70d391dfbc5b5ea53bd0cc03fb55f4a70369b418726
root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1f5c5990c95 mynginx:v0.4 "nginx -g 'daemon of..." 3 seconds ago Up 1 second 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx5

如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。我们必须指定启动命令。因为 export 丢失了元数据信息。
所以一般不推荐使用export/import 而是采用save/load命令

容器日志查看

  1. 启动一个 nginx
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker run --name mynginx1 -d --rm -p 80:80 nginx:1.22.1
e4a283560e71e52579c0b19641f5ce7eff4d784603104d36a765804afb7086a8
root@139-159-150-152:/data/myworkdir/container# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4a283560e71 nginx:1.22.1 "/docker-entrypoint...." 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1
  1. 查看全部日志
powershell 复制代码
hacha@LAPTOP-H2EI4I6A:~/test$ docker logs mynginx1
  1. 实时查看日志
powershell 复制代码
root@139-159-150-152:/data/myworkdir/container# docker logs -f

刷新访问几次页面,日志又会新增几行

  1. 查看最新的 3 行日志
powershell 复制代码
hacha@LAPTOP-H2EI4I6A:~/test$  docker logs -f -n 3 mynginx1
2024/12/02 05:16:03 [notice] 1#1: start worker process 42
2024/12/02 05:16:03 [notice] 1#1: start worker process 43
2024/12/02 05:16:03 [notice] 1#1: start worker process 44
  1. 停止容器释放资源
powershell 复制代码
docker stop mynginx1

容器资源查看

  1. 我们运行一个 nginx
powershell 复制代码
docker run -d --name mynginx5 -p 80:80 nginx:1.22.1
  1. 我们可以通过 docker top 查看容器中有哪些进程,添加 aux,可以看到占用的内存和 CPU 信息
powershell 复制代码
root@139-159-150-152:~# docker top mynginx5 aux
  1. 通过 docker stats 可以看到资源的实时占用变化
powershell 复制代码
root@139-159-150-152:~# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d1f5c5990c95 mynginx5 0.00% 2.648MiB / 1.936GiB 0.13% 6.99kB / 2.57kB 2.29MB / 4.1kB 2
  1. 释放资源
powershell 复制代码
docker stop mynginx5 
docker rm mynginx5
相关推荐
懒阳羊23 分钟前
Docker(一)
docker·云原生·eureka
漫天转悠1 小时前
Docker保存镜像和导入镜像文件(图文详解)
ubuntu·docker
fen_fen2 小时前
Docker如何运行一个python脚本Hello World
运维·docker·容器
檀越剑指大厂2 小时前
【Docker系列】Docker 构建多平台镜像:arm64 架构的实践
docker·容器·架构
阿moments4 小时前
Docker - 速成
运维·docker·云原生·容器
落寞书生4 小时前
docker安装mysql 实现主从同步
运维·mysql·docker·主从同步·docker 安装mysql
寰梦5 小时前
Docker(Nginx) 部署 uniapp
nginx·docker·uni-app
neeef_se8 小时前
【Linux】WG-Easy:基于 Docker 和 Web 面板的异地组网
linux·前端·docker
LeonNo1110 小时前
k8s,operator
云原生·容器·kubernetes
云川之下10 小时前
【k8s源码】kubernetes-1.22.3\staging 目录作用
云原生·容器·kubernetes