Docker入门之操作容器(三)

文章目录

    • 前言
    • 创建容器
    • 启动与停止容器
    • 删除容器
    • 导出与导入容器
    • 查看容器
    • 其他命令
    • 总结

前言

当我们下载了一个docker应用镜像后,当应用镜像运行起来的时候就形成了一个docker的容器(容器就是镜像运行起来的实例)。需要说明的是容器比镜像多了一个可写的文件层,如下图所示:

Docker入门之操作容器(三)_第1张图片
镜像下载是通过分层下载进行实现的,所以镜像可以看成是由多个镜像层叠加起来的一个文件系统。与容器的唯一区别在于容器的最上面那一层是可读可写的,而镜像层是只读的。

创建容器

当下载应用镜像完成后运行此镜像就创建了一个容器对象,例如下载一个nginx镜像并运行,容器启动有两种:一种是交互式启动容器,另一种是后台启动容器。

  • 后台启动镜像

下载镜像:

root@VM-0-10-centos ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
e5ae68f74026: Pull complete 
21e0df283cd6: Pull complete 
ed835de16acd: Pull complete 
881ff011f1c9: Pull complete 
77700c52c969: Pull complete 
44be98c0fab6: Pull complete 
Digest: sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

后台运行镜像:

[root@VM-0-10-centos ~]# docker run -d -p 8090:80 --name my-nginx nginx 
3cb73ec4aebafeb85224366c79e0df400a3cf93ecde45824e8ea3e8ded63592b
[root@VM-0-10-centos ~]# netstat -nltp | grep 8090
tcp        0      0 0.0.0.0:8090            0.0.0.0:*               LISTEN      18614/docker-proxy  
tcp6       0      0 :::8090                 :::*                    LISTEN      18620/docker-proxy  

参数解释:
-p :port(宿主机)+port(容器内)
– name 为启动的容器设置名称
-d 后台运行
最后一个nginx代表的nginx:latest,默认latest可以进行省略。
Docker入门之操作容器(三)_第2张图片
交互启动应用

上面通过-d参数新启动了一个nginx镜像的实例,我们也可以使用交互界面启动:

docker run -it -p 主机端口号:容器端口号 --name 容器命名名称 镜像id或REPOSITORY:TAG

[root@VM-0-10-centos ~]# docker run -it -p 8090:80 --name my-nginx nginx /bin/bash
root@d50175151f9b:/# ll
bash: ll: command not found
root@d50175151f9b:/# ls -lsa
total 80
4 drwxr-xr-x   1 root root 4096 Dec 15 15:53 .
4 drwxr-xr-x   1 root root 4096 Dec 15 15:53 ..
0 -rwxr-xr-x   1 root root    0 Dec 15 15:53 .dockerenv
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 bin
4 drwxr-xr-x   2 root root 4096 Oct  3 09:15 boot
0 drwxr-xr-x   5 root root  360 Dec 15 15:53 dev
4 drwxr-xr-x   1 root root 4096 Dec  2 10:59 docker-entrypoint.d
4 -rwxrwxr-x   1 root root 1202 Dec  2 10:58 docker-entrypoint.sh
4 drwxr-xr-x   1 root root 4096 Dec 15 15:53 etc
4 drwxr-xr-x   2 root root 4096 Oct  3 09:15 home
4 drwxr-xr-x   1 root root 4096 Dec  1 00:00 lib
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 lib64
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 media
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 mnt
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 opt
0 dr-xr-xr-x 118 root root    0 Dec 15 15:53 proc
4 drwx------   2 root root 4096 Dec  1 00:00 root
4 drwxr-xr-x   3 root root 4096 Dec  1 00:00 run
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 sbin
4 drwxr-xr-x   2 root root 4096 Dec  1 00:00 srv
0 dr-xr-xr-x  13 root root    0 Dec  9 15:48 sys
4 drwxrwxrwt   1 root root 4096 Dec  2 10:59 tmp
4 drwxr-xr-x   1 root root 4096 Dec  1 00:00 usr
4 drwxr-xr-x   1 root root 4096 Dec  1 00:00 var

进入交互界面后是不是感觉有点像Linux界面的感觉?这是由于nginx镜像层依赖了Linux系统,当我们下载nginx镜像的时候顺便也将nginx能够运行的linux环境层也进行了下载。
参数解释

-i :在容器中指定一个终端。
-t:允许我们对容器的终端进行输出或输出
– name 为启动的容器设置名称
-p :port(宿主机)+port(容器内)
bin/bash指定终端交互的shell解释器

退出容器:

退出容器有两种:一种退出交互界面并终止容器运行,另一种是只退出交互界面不终止容器运行。

  • 退出交互界面且终止容器运行
[root@2ebdd1ceb0bd /]# exit
exit
## docker ps 查询当前运行的容器实例(类似在linux系统下ps命令)
[root@VM-32-10-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

可以清晰看到当前docker中没有容器实例运行中。

  • 只退出交互界面
## 使用crtl+p+q
## 退出去后发现应用仍在后台运行
[root@VM-32-10-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
bcc3bb7016a3   831691599b88   "/bin/bash"   25 seconds ago   Up 24 seconds             my-nginx
  • 进入一个正在运行的容器

docker exec -it 容器名称或容器id 执行命令

##  进入刚刚启动的nginx交互界面里
docker exec -it bcc3bb7016a3   /bin/bash

启动与停止容器

docker start 容器名称或镜像ID
docker stop 容器名称或镜像ID
docker restart 容器名称或镜像ID

# 启动nginx
[root@VM-32-10-centos ~]# docker start my-nginx
my-nginx
# 停止nginx
[root@VM-32-10-centos ~]# docker stop my-nginx
my-nginx
# 重启nginx
[root@VM-32-10-centos ~]# docker restart my-nginx
my-nginx
# 查看docker进程
[root@VM-32-10-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS         PORTS     NAMES
5f5ac938dd6a   831691599b88   "/bin/bash"   4 hours ago   Up 3 seconds               my-nginx

删除容器

docker rm -f 容器名称或容器id,其中-f为强制删除

## 删除单个实例docker容器(docker rm -f 容器名称或容器ID)
[root@VM-32-10-centos ~]# docker rm -f my-nginx
my-nginx
[root@VM-32-10-centos
## 批量删除docker容器进程
[root@VM-32-10-centos ~]# docker rm -f $(docker ps -q)
50e3b92a7b06
5f5ac938dd6a
## 使用xargs进行批量进行删除
[root@VM-32-10-centos ~]# docker ps -q | xargs docker rm -f

导出与导入容器

有时候会有将容器实例进行迁移的需求,这个时候可以使用docker提供的export命令帮助我们完成容器的导入与导出,例如现在我需要将目前运行的my-nginx容器进行迁移,导出命令为:

方式一: docker export -o xx.tar 容器名称或容器id
方式二:docker export 容器名称或容器id > xx.tar

## 查看当前docker的运行的容器实例
[root@VM-0-10-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS       PORTS                                   NAMES
3cb73ec4aeba   nginx     "/docker-entrypoint.…"   47 hours ago   Up 7 hours   0.0.0.0:8090->80/tcp, :::8090->80/tcp   my-nginx
## 导出容器my-nginx
[root@VM-0-10-centos ~]# docker export -o my-nginx.tar my-nginx
[root@VM-0-10-centos ~]# ll
total 140640
-rw------- 1 root root 144014848 Dec 17 22:22 my-nginx.ta[root@VM-0-10-centos ~]# docker export my-nginx > my-nginx1.tar
[root@VM-0-10-centos ~]# ll
total 281280
-rw-r--r-- 1 root root 144014848 Dec 17 22:23 my-nginx1.tar
-rw------- 1 root root 144014848 Dec 17 22:22 my-nginx.tar

my-nginx.tar导入容器的命令如下所示:

docker import xx.tar REPOSITORY:TAG

## 导入tar包
[root@VM-32-10-centos ~]# docker import my-nginx.tar -- my-mginx:1.0
sha256:38fdb836e36ec097d98e24ada8cec59840786796799f0c04a4c1c45c8f21695b
## 查看当前镜像
[root@VM-32-10-centos ~]# docker images
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
my-mginx                                                   1.0                 38fdb836e36e        23 seconds ago      140MB

查看容器

我们都知道在Linux系统下查询当前主机上的进程命令为top,在容器内也提供了次命令。

docker top 容器id或容器名称

## 查看当前所有运行的容器进程
[root@VM-0-10-centos ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS       PORTS                                   NAMES
3cb73ec4aeba   nginx     "/docker-entrypoint.…"   2 days ago   Up 9 hours   0.0.0.0:8090->80/tcp, :::8090->80/tcp   my-nginx
## 查看容器内进程
[root@VM-0-10-centos ~]# docker top my-nginx
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                19080               19061               0                   Dec17               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 19126               19080               0                   Dec17               ?                   00:00:00            nginx: worker process
101                 19127               19080               0                   Dec17               ?                   00:00:00            nginx: worker proce

如果想看容器内CPU、内存、存储或网络信息可以使用stats命令。

docker stats 容器id或容器名称

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O   PIDS
3cb73ec4aeba   my-nginx   0.00%     1.992MiB / 3.7GiB   0.05%     4.42kB / 5.29kB   0B / 0B     3

如果想要查看容器详情可以使用inspect命令:

docker inspect 容器id或容器名称


 docker inspect my-nginx

Docker入门之操作容器(三)_第3张图片

其他命令

复制容器文件到主机:

docker cp 容器id或容器名:容器中文件路径 主机路径

## 在容器创建test.txt文件并输出一段文字
[root@VM-0-10-centos ~]# docker exec -it my-nginx /bin/bash
root@3cb73ec4aeba:/# echo 'Copy file...test....' > /home/test.txt

退出容器然后在主机上进行拷贝操作:

[root@VM-0-10-centos ~]# docker cp my-nginx:/home/test.txt ./
[root@VM-0-10-centos ~]# ll
total 281292
-rw-r--r-- 1 root root        21 Dec 18 00:48 test.txt

拷贝主机的文件到容器中

docker cp 主机文件路径 容器id或容器名:容器中文件路径

## 主机上创建hello.yml
[root@VM-0-10-centos ~]# echo "haha" > hello.yml
## 将主机的文件拷贝到容器中
[root@VM-0-10-centos ~]# docker cp ./hello.yml my-nginx:/home/
## 查看
[root@VM-0-10-centos ~]# docker exec -it my-nginx ls -lsa /home
4 drwxr-xr-x 1 root root 4096 Dec 17 16:57 .
4 drwxr-xr-x 1 root root 4096 Dec 17 16:57 ..
4 -rw-r--r-- 1 root root    5 Dec 17 16:57 hello.yml
4 -rw-r--r-- 1 root root   21 Dec 17 16:48 test.txt

diff 看容器内文件系统的变更:

docker diff 容器id或容器名称

Docker入门之操作容器(三)_第4张图片
可以看到最后变更的文件是我们刚刚操作的文件系统。
查看容器占用的端口信息:
这个命令非常的重要,常常可以查看当前容器占用的端口信息:

docker port 容器id或容器名称

80/tcp -> 0.0.0.0:8090
80/tcp -> :::8090
docker port my-nginx

查看容器日志
借助logs命令可以查看一个运行的应用容器产生的日志,例如查看my-nginx容器的运行日志:
Docker入门之操作容器(三)_第5张图片
可以看到日志输出内容笔记多,假设只需要读取其中最后的10条。

[root@VM-0-10-centos ~]# docker logs --tail 10 my-nginx
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/12/17 16:47:13 [notice] 1#1: using the "epoll" event method
2021/12/17 16:47:13 [notice] 1#1: nginx/1.21.4
2021/12/17 16:47:13 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2021/12/17 16:47:13 [notice] 1#1: OS: Linux 3.10.0-1160.11.1.el7.x86_64
2021/12/17 16:47:13 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/17 16:47:13 [notice] 1#1: start worker processes
2021/12/17 16:47:13 [notice] 1#1: start worker process 24
2021/12/17 16:47:13 [notice] 1#1: start worker process 25

总结

下面是容器常用的命令如下所示:
Docker入门之操作容器(三)_第6张图片

你可能感兴趣的:(Docker,容器,docker,运维)