当我们下载了一个docker应用镜像后,当应用镜像运行起来的时候就形成了一个docker的容器(容器就是镜像运行起来的实例)。需要说明的是容器比镜像多了一个可写的文件层,如下图所示:
镜像下载是通过分层下载进行实现的,所以镜像可以看成是由多个镜像层叠加起来的一个文件系统。与容器的唯一区别在于容器的最上面那一层是可读可写的,而镜像层是只读的。
当下载应用镜像完成后运行此镜像就创建了一个容器对象,例如下载一个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可以进行省略。
交互启动应用
上面通过-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 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 port 容器id或容器名称
80/tcp -> 0.0.0.0:8090
80/tcp -> :::8090
docker port my-nginx
查看容器日志
借助logs命令可以查看一个运行的应用容器产生的日志,例如查看my-nginx容器的运行日志:
可以看到日志输出内容笔记多,假设只需要读取其中最后的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