您现在的位置是:首页 >技术交流 >Docker容器网站首页技术交流
Docker容器
目录
1、前台运行容器时进入容器,使用exit退出后,容器就停止了。
2、后台运行容器,之后使用docker exec进入容器,exit退出,容器不会停止。
docker system events 等同于 docker events
docker system info 等同于 docker info
1、创建容器
就是将镜像加载到容器的过程。
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell
2、查看容器的运行状态
格式
docker ps [选项]
docker ps #查看当前运行状态的容器
选项
-q #只显示运行状态的容器的ID
-a #显示所有的容器
-aq #显示所有容器的IP
-s #显示总的文件大小
-as #显示所有容器的大小
-n 6 #查看最后创建的6个镜像
-f #根据条件过滤显示的内容
-format #指定返回值的模版文件
-l #显示最近创建的容器
-no-trunc #不间断输出
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f9f69b097a0 nginx:latest "/docker-entrypoint.…" 16 seconds ago Created recursing_swanson
容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
3、启动容器
格式:docker start 容器的ID/名称
docker start 2b3a87b5eeaa
docker ps -a
4、创建并启动容器
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
格式
docker run [选项] 镜像 [命令] [参数]
选项
-a 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
-d 后台运行容器,并返回容器ID
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P 随机端口映射,容器内部端口 随机 映射到主机的端口
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
--name= 为容器指定一个名称
-dns-search 指定容器DNS搜索域名,默认和宿主一致
-h 指定容器的hostname
-m 设置容器使用内存最大值
-link=[ ] 连接到另一个容器
--privileged=true 授予此容器扩展特权,也就是开启特权模式; 这种模式下容器对docker宿主机拥有root访问权限。慎用!
--net/--network 指定网络模式
[root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
[root@localhost ~]# docker ps -a #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
834ca8d0b7c8 centos:7 "/usr/bin/bash -c ls…" 19 seconds ago Exited (0) 19 seconds ago upbeat_hamilton
5、在后台持续运行 docker run 创建的容器
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。(容器中的命令仍然在前台运行)
使用-itd选项,可以创建并持续运行容器,即便进入容器后使用exit命令退出容器,也不会停止容器。
[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
31f9e237cec784175cd9599356c1d4d96ca1e4d1e7682e204b86f029dcecb26f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f9e237cec7 centos:7 "/usr/bin/bash -c 'w…" 3 seconds ago Up 2 seconds flamboyant_liskov
[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
da55f60024564b9e2134df12824c8657b95d9e33fc224deed59397026f35ace2
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da55f6002456 centos:7 "/bin/bash" 7 seconds ago Up 5 seconds test1
6、终止容器运行
格式:
docker stop 容器的ID/名称 #正常停止,可以给容器一个等待时间,以防止数据的丢失。
docker kill 容器的ID/名称 #强制停止,不给容器反应时间,可能造成数据丢失。
docker stop $(docker ps -aq) #批量停止容器
docker ps -a | awk 'NR>=2 {print $1}' | xargs docker stop #批量停止容器
7、删除容器
不能删除运行状态的容器,需要先停止再删除。或者使用-f强制删除。
格式:docker rm <容器ID/名称> [-f] #删除容器
docker rm $(docker ps -aq) #批量删除所有容器
docker ps -a |awk 'NR>=2 {print $1}' | xargs docker rm #批量删除所有容器
已停止的可以直接删
8、进入容器
要进入容器进行命令操作时,可以使用 docker exec 命令进入运行中的容器。进入容器前,确保容器正在运行。
- 我们通常会使用 docker exec -it bash 进入容器并开启一个bash环境的伪终端。也可以将bash 换成其他一条命令,让容器执行完后,将结果输出到屏幕
- 后面可以跟上 -c 选项 “命令序列" ,命令序列可以是多个命令,使用分号隔开,可以一次性执行多条命令。
docker run -it 会创建前台进程,但是会在输入exit后终止进程。
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程。
docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开。
-t 选项表示让 Docker 分配一个伪终端。
-it /bin/bash:进入容器时需要指定一个shell环境。
1、前台运行容器时进入容器,使用exit退出后,容器就停止了。
[root@localhost ~]# docker run -it --name t3 centos:7 /bin/bash
[root@e909cb89aa4d /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e909cb89aa4d centos:7 "/bin/bash" 19 seconds ago Exited (0) 4 seconds ago t3
517344b41eab centos:7 "/bin/bash" 21 hours ago Exited (137) About a minute ago t2
da55f6002456 centos:7 "/bin/bash" 21 hours ago Up 21 hours test1
2b3a87b5eeaa nginx:latest "/docker-entrypoint.…" 29 hours ago Up 30 minutes 80/tcp heuristic_thompson
2、后台运行容器,之后使用docker exec进入容器,exit退出,容器不会停止。
[root@localhost ~]# docker run -itd --name t4 centos:7
8b65edd88c09981bbbf716c4b24a5a9c9ba5e6ce233d4cf66a76c0245acd0c08
[root@localhost ~]# docker exec -it t4 /bin/bash
[root@8b65edd88c09 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b65edd88c09 centos:7 "/bin/bash" 51 seconds ago Up 50 seconds t4
e909cb89aa4d centos:7 "/bin/bash" 7 minutes ago Exited (0) 7 minutes ago t3
517344b41eab centos:7 "/bin/bash" 21 hours ago Exited (137) 8 minutes ago t2
9、查看容器的元数据--docker inspect
格式:docker inspect 容器id/容器名称
[root@localhost ~]# docker inspect 8b65edd88c09
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 容器ID
#查看进程号
10、docker system
[root@localhost ~]# docker system --help
Usage: docker system COMMAND
Manage Docker
Commands:
df Show docker disk usage #显示docker磁盘使用情况
events Get real time events from the server #从服务器获取实时事件
info Display system-wide information #显示系统信息
prune Remove unused data #删除不使用的数据
docker system df
提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 2 345.4MB 0B (0%)
Containers 3 3 1.174kB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Images #所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
Containers #运行的容器占用的空间,表示每个容器的读写层的空间。
Local Volumes #容器挂载本地数据卷的空间。
Build Cache #镜像构建过程中产生的缓存空间(只有在使用BuildKit时才有,Docker18.09以后可用)。
docker system events 等同于 docker events
获取docker系统实时事件,不包括容器内的。
docker system info 等同于 docker info
查看整个docker系统的信息
docker system prune
删除生成缓存
[root@localhost ~]# docker system prune --help
Usage: docker system prune [OPTIONS]
Remove unused data
Options:
-a, --all Remove all unused images not just dangling ones #删除所有未使用的构建缓存,而不仅仅是悬空的缓存
--filter filter Provide filter values (e.g. "label=<key>=<value>") #提供过滤值
-f, --force Do not prompt for confirmation #不提示确认
--volumes Prune volumes #数据卷
[root@localhost ~]# docker system prune
WARNING! This will remove:
- all stopped containers #所有停止的容器
- all networks not used by at least one container #所有没有容器使用的网络
- all dangling images #所有悬空镜像即无tag的镜像
- all dangling build cache #所有悬空创建的缓存
[root@localhost ~]# docker system prune -a
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them #所有没有容器使用的镜像
- all build cache #所有创建的缓存
11、容器日志
格式:
docker logs 容器ID/容器名
[root@localhost ~]# docker run -itd -P nginx:latest
d6ca0d729ab071d820d6fd623e43017ec738e2b31d5919f9c64ab08f96a232bc
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6ca0d729ab0 nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:32769->80/tcp, :::32769->80/tcp determined_nobel
浏览器使用宿主机IP加映射端口:192.168.247.160:32769
[root@localhost ~]# docker logs d6ca0d729ab0 #查看容器日志
192.168.247.1 - - [20/Apr/2023:10:32:03 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.247.160:32769/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48" "-"
12、宿主机和容器之间文件复制
1、将宿主机的文件复制到容器中
[root@localhost ~]# echo 222 > /opt/1.txt
[root@localhost ~]# docker cp /opt/1.txt d6ca0d729ab0:/tmp/ #将文件复制到容器
Successfully copied 2.05kB to d6ca0d729ab0:/tmp/
[root@localhost ~]# docker exec -it d6ca0d729ab0 /bin/bash
root@d6ca0d729ab0:/# cd /tmp
root@d6ca0d729ab0:/tmp# ls #文件存在,复制成功
1.txt
root@d6ca0d729ab0:/tmp# cat 1.txt
222
2、将容器的文件复制到宿主机
root@d6ca0d729ab0:/# cd /tmp
root@d6ca0d729ab0:/tmp# echo 666 > ./6.txt
root@d6ca0d729ab0:/tmp# ls
1.txt 6.txt
root@d6ca0d729ab0:/tmp# exit
exit
[root@localhost ~]# docker cp d6ca0d729ab0:/tmp/6.txt ~/
Successfully copied 2.05kB to /root/
[root@localhost ~]# ls
6.txt
[root@localhost ~]# cat 6.txt
666
13、容器的导出与导入(容器的迁移)
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。
可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。(注意:导入文件后会生成镜像,但不会自动创建容器。)
#导出格式:
docker export 容器ID/名称 > 导出文件名
#导入格式:
cat 导出文件名 | docker import – 镜像名称:标签
导出主机
[root@localhost ~]# docker export d6ca0d729ab0 > mycentos7
[root@localhost ~]# scp ~/mycentos7 192.168.247.160:/root/
导入主机
[root@zbx-agent1 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg mycentos7
[root@zbx-agent1 ~]# cat mycentos7 | docker import - centos7:test
sha256:7c1ebe5d74ad7e89c3f366de73c0f27ccd5b6f2d8a925a74a8a067b6e9ff92dd
[root@zbx-agent1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zbx-agent1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 test 7c1ebe5d74ad 48 seconds ago 140MB