于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
导出容器是为了方便进行备份或迁移
三、容器使用
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端口,访问宿主机该端口后,再来查看容器日志如下
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容器的信息,但我这显示完全没有
3)验证
使用--link会更新webapp容器的环境变量,使其能连接到数据库容器mysql
docker run --rm --name web2 --link mysql:db training/webapp env
除此之外docker还添加了host信息到web容器的/etc/hosts文件中
docker run -it --rm --link mysql:db training/webapp cat /etc/hosts
:'
--rm:该容器运行完命令就自动删除
'
这里的/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
五、容器总结
关于容器需要注意的是
- 镜像是只读文件,是不可写的,相当于模板;
- 我们进行操作都是在容器里的,容器运行时带有可写文件层,每执行一个命令就会多一层。
- 容器如果没有运行的服务,执行完命令后会直接停止。
- 容器停止后再启动,数据是不会丢失的。
六、参考资料
《Docker技术入门与实践》第三版
docker清理命令
狂神说docker