四、容器管理

于2021年9月27日重新编辑

一、容器查询

1.1 查看正在运行的容器

docker ps

1.2 查看所有容器

docker ps -a

1.3 查看最近启动的容器

docker ps -l

1.4 查看容器IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 54d7c82097a8

1.5 查看端口映射情况

docker container port  fab11574764e

1.6 查看容器其他信息

#查看容器每一层的信息
docker container inspect fab11574764e

#查看容器内进程
docker top fab11574764e

#查看CPU,内存,存储,网络等使用情况
docker stats fab11574764e
-a:输出所有容器统计信息
--format string:格式化输入信息
--no-stream:不持续输出,默认实时更新结果
--no-trunc:不截断输出信息

#查看容器内文件系统的变更
docker container diff  fab11574764e

二、容器管理

2.1 创建容器

1)使用create创建容器

docker create -it ubuntu:latest
docker start ubuntu #启动容器

2)使用run命令创建容器

run相当于先执行create再执行start,创建启动容器一步到位。

#使用centos:latest镜像创建一个名为c1的容器,并进入终端进行交互
docker run -it --name=c1 centos:latest /bin/bash #也可以写为

#退出容器但不停止
ctrl + p + q

:'
--name:给创建的容器取名,如果不指定name,容器名会随机生成
centos:latest:镜像名
/bin/bash:在容器里执行的命令
-i:开启交互模式
-t:分配一个终端
'

2.2 启动容器

1)启动容器

#查看所有容器
docker ps -a

#启动多个容器
docker start c1 c2

#使用ID启动容器
docker start 508c6f234df0 #可简写为
docker start 5

2)启动一个后台运行的容器

-d选项后台启动容器,此时会执行完输出Hello World命令后容器就会停止,想要容器一直运行需要运行服务。

docker run -d ubuntu /bin/echo 'Hello World’

2.3 进入容器

1)容器必须先启动才能进入

docker start c1
docker attach c1

进入容器需要注意的是容器必须先启动,像下面这种"短命"容器是进不去的,因为很快就执行完命令停止了!

docker run centos:latest /bin/echo "Hello World"

如下容器是可以进入的

#使用交互终端的容器
docker run -it --name=c1 centos:latest /bin/bash

#可以执行很久的命令的容器
docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

#运行服务的容器
docker run -d  nginx:alpine

:'
使用-d参数,容器启动后会进入后台模式
'

2)进入容器并启动一个bash

exec:在容器里执行命令

docker start c1
docker exec –it 243c32535da7 /bin/bash

2.4 退出容器

1)仅退出容器交互终端,但不停止容器运行

#运行一个容器
docker run -it --name=c1 centos:latest /bin/bash

#退出容器但不停止容器
ctrl + p +q

2)停止容器运行,需要进入容器执行

ctrl + d
exit

2.5 停止容器

1)停止正在运行的容器

docker stop d56146c41f3a #可简写为
docker stop d

2)停止所有正在运行的容器

kill:强行终止容器

docker kill $(docker ps -a -q)

4)暂停,恢复容器

docker pause c1
docker unpause c1

容器停止后再启动数据是不会丢失的,在一个运行的容器创建文件,停止该容器再启动,文件还是存在的。

2.5 导出容器

1)导出容器

#运行一个容器,名为c1
docker run -it --name=c1 centos:latest /bin/bash

#将名为c1容器进行打包
docker export -o centos-httpd.tar c1 #也可写为
docker export c1 > centos-httpd.tar

#查看导出容器的大小
du –sh centos-httpd.tar
ll –sh

2)导入容器

将容器导入为镜像,-m为备注,镜像取名为centos-httpd,v1为标签名方便区分

docker import -m httpd centos-httpd.tar centos-httpd:v1

#查看备注,用于查看-m参数效果
docker history centos-httpd:v1

image-20210926183310811

导出容器是为了方便进行备份或迁移

三、容器使用

3.1 查看日志

docker logs -f ce554267d7a4

:'
-details:打印详细信息
-f:持续保持输出
-since string:从某个时间开始的日志
-tail string:输出最近的日志
-t:显示时间戳信息
-untul string:输出某个时间之前的日志
'

3.2 复制文件

将宿主机路径的1.txt文件复制到名为c1容器的/tmp路径下

docker cp  1.txt  c1:/tmp/

3.3 端口映射

我们有时候需要从外部访问容器服务,这时候就需要将容器的端口映射到宿主机上,让我们能够通过宿主机访问到容器服务。

1)将容器的80端口映射到随机宿主机端口

dokcer run -it -p 80 --name=c1 centos:latest /bin/bash

宿主机随机端口范围:49000~49900

2)将容器的80端口映射到宿主机的80端口

#左边的80是宿主机端口,右边80是容器端口
dokcer run -it -p 80:80 --name=c1 centos:latest /bin/bash

3)映射到指定地址的任意端口

适用于多网卡多IP地址的服务器

dokcer run -it -p 10.154.0.110::80 --name=c1 centos:latest /bin/bash

#映射到指定地址的指定udp端口
docker run -d -p 10.154.0.110:5000:5000/udp training/webapp python app.py

4)-P,大写的P,容器的服务端口映射到宿主机随机端口

docker run -d -P nginx:alpine
docker run -d -P training/webapp python app.py

运行webapp容器,可以看到该容器的5000端口随机映射到了宿主机49153端口,访问宿主机该端口后,再来查看容器日志如下

image-20211001163637198

5)查看映射的端口配置

查看naughty_poitras容器映射端口情况

docker port naughty_poitras
docker port naughty_poitras 5000

可参考:端口映射

3.4 自定义容器名

之前不指定容器名,系统会自动分配一串英文加数字的容器名,使用--name参数为容器自定义命名

docker run -d -P --name web training/webapp python app.py

使用如下命令验证修改后的容器名,还有容器名是唯一的,不可重名

docker ps -l
docker inspect -f "{{.Name}}" 19c841267937

使用docker run命令添加--rm参数时,容器终止后会立刻删除,但不能跟-d同时使用

docker run --rm --name test01 centos:latest /bin/bash

3.5 容器互联

顾名思义就是容器的互相访问,通过容器名快速访问而不用指定具体的IP地址,相当于修改/etc/hosts文件。

使--link参数让容器互联,格式--link name:alias,name是要链接的容器名,alias是别名。

1)先创建一个新的数据库容器,名为mysql

docker run -d --name mysql bingozhou/mysql5.7

2)再创建一个web容器与他互联

docker run -d -P --name web --link mysql:db training/webapp python app.py

:'
--link mysql:db
mysql是之前创建的数据库容器
db是mysql容器的别名
'

使用docker ps 查看,这一点跟书里的不一样,书上说可以看到db容器的names列有db也有web/db,表示web容器可以链接到db容器,web可以访问db容器的信息,但我这显示完全没有

image-20211001172002067

3)验证

使用--link会更新webapp容器的环境变量,使其能连接到数据库容器mysql

docker run --rm --name web2 --link mysql:db training/webapp env

image-20211001172140677

除此之外docker还添加了host信息到web容器的/etc/hosts文件中

docker run -it --rm --link mysql:db training/webapp cat /etc/hosts

:'
--rm:该容器运行完命令就自动删除
'

image-20211001172307339

这里的/etc/hosts文件是不断更新的,如果mysql容器因为某些原因ip地址改变了,这里webapp容器的hosts文件也会同步改变为mysql新的ip地址。

3.6 容器时间同步

让名为c2的容器跟宿主机时间同步

docker run -it -v /etc/localtime:/etc/localtime #或者
docker cp -L /usr/share/zoneinfo/Asia/Shanghai c2:/etc/localtime

可参考:容器时间同步

四、删除容器

4.1 普通删除

删除容器前需要停止容器

#先停止运行的容器,再删除
docker stop c1
docker rm c1

:'
-f:强制删除运行中的容器
-l:删除容器连接保留容器
-v:删除容器挂载的数据卷
'

4.2 强制删除

docker rm –f ubuntu:18.04

4.3 删除全部

docker rm -f $(docker ps -a -q)

4.4 删除已停止的容器

docker container prune

五、容器总结

关于容器需要注意的是

  1. 镜像是只读文件,是不可写的,相当于模板;
  2. 我们进行操作都是在容器里的,容器运行时带有可写文件层,每执行一个命令就会多一层。
  3. 容器如果没有运行的服务,执行完命令后会直接停止。
  4. 容器停止后再启动,数据是不会丢失的。

六、参考资料

《Docker技术入门与实践》第三版
docker清理命令
狂神说docker

今天的学习是为了以后的工作更加的轻松!
原文地址:https://www.cnblogs.com/tz90/p/12233993.html