Docker使用(一)Docker命令

Docker使用

一、 Docker命令

1、基本命令
# docker version

========================================================

# docker info

查看docker详细信息

========================================================

# docker --help

查看docker 帮助命令

========================================================

# 容器详情

#docker network inspect bridge

查看容器的IP为 172.17.0.2

========================================================

2、镜像命令
# docker images

查看docker镜像

PEPOSITORY:镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一个仓库源可以有多个TAG,表示这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的版本标签,例如只使用tomcat,docker将默认使用tomcat:latest镜像

========================================================

# docker images -a

列出本地所有的镜像

docker images -p只显示镜像ID # docker images -q

这个指令很有用

========================================================

# docker images --digests

显示镜像的摘要信息

========================================================

# docker images --no-trunc

显示完整的镜像信息

========================================================

从Docker Hub(阿里云镜像)上查找tomcat镜像

========================================================

# docker pull tomcat

从Docker Hub上下载tomcat镜像。等价于:docker pull tomcat:latest

========================================================

# docker rmi

docker rmi hello-world:latest 从Docker中删除hello-world镜像

docker rmi -f hello-world 从Docker中强制删除hello-world镜像

docker rmi -f hello-world nginx 从Docker中强制删除hello-world镜像和nginx镜像

docker rmi -f $(docker images -q) 通过docker images -q查询到的镜像ID来删除所有镜像

========================================================

3、容器命令
新建容器

#docker run [OPTIONS] IMAGE根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称

OPTIONS说明:

--name="容器新名字":为容器指定一个名称

-d:后台运行容器,并返回容器ID,也即启动守护式容器

-i:以交互模式运行容器,通常与-t同时使用

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-P:随机端口映射

-p:指定端口映射,有以下四种格式:

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

举例:

3.1) 启动容器时,选择一个端口映射到容器内部开放端口上

-p 小写p表示docker会选择一个具体的宿主机端口映射到容器内部开放的网络端口上。

-P 大写P表示docker会随机选择一个宿主机端口映射到容器内部开放的网络端口上。

root@localhost \~\]# docker run -it -d --name my-nginx -p 8088:80 nginx \[root@localhost \~\]# docker run -it -d --name my-nginx2 -P nginx ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/505afe450a21f49b8c1135526972bd39.webp) **由上面可知:** 容器my-nginx启动时使用了-p,选择宿主机具体的8088端口映射到容器内部的80端口上了,访问http://localhost/8088即可 curl 127.0.0.1:8088 curl localhost:8088 curl 192.168.110.128:8088 都可以访问。 容器my-nginx2启动时使用了-P,选择宿主机的一个随机端口映射到容器内部的80端口上了,这里随机端口是49153,访问http://localhost/49153即可 测试: ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/54fc9771c9e9724e863db5353a1809c1.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/51fd8f20bea15716fb5fc686cb2dc254.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/eaddebba78dba5c6cd5458baff41b38c.webp) 3.2)启动创建时,绑定外部的ip和端口(宿主机ip是192.168.110.128) \[root@localhost \~\]# docker run -it -d --name my-nginx3 -p 127.0.0.1:8888:80 nginx \[root@localhost \~\]# docker run -it -d --name my-nginx4 -p 192.168.110.128:9999:80 nginx ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/1c23e54b0d1283c7bdd2bdfb192c7fc8.webp) **由上面可知:** 容器my-nginx3绑定的宿主机外部ip是127.0.0.1,端口是8888,则访问http://127.0.0.1:8888或http://localhost:8888都可以,访问http://192.168.110.128:8888就会拒绝! 容器my-nginx4绑定的宿主机外部ip是192.168.110.128,端口是9999,则访问http://192.168.110.128:9999就可以,访问http://127.0.0.1:9999或http://localhost:9999就会拒绝! 3.3) 查看容器绑定和映射的端口及Ip地址 \[root@localhost \~\]# docker port my-nginx4 ​ 80/tcp -\> 192.168.110.128:9999 \[root@localhost \~\]# docker inspect my-nginx4 \| grep IPAddress ​ "SecondaryIPAddresses": null, ​ "IPAddress": "172.17.0.5", ​ "IPAddress": "172.17.0.5", 3.4)容器启动绑定多IP和端口(跟多个-p) \[root@localhost \~\]# docker run -it -d --name my-nginx5 -p 192.168.110.128:7777:80 -p 127.0.0.1:7788:80 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/535a5a80b759643948324e6d0b71e6d4.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/b78b0b7f2d0e15dcd854ffb2f419ce7c.webp) 3.5)容器除了在启动时添加端口映射关系,还可以通过宿主机的iptables进行nat转发,将宿主机的端口映射到容器的内部端口上,**这种方式适用于容器启动时没有指定端口映射的情况!** \[root@localhost \~\]# docker run -it -d --name my-nginx6 nginx ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/755cf67dc339d0902a62bc5d67cdf399.webp) 这个时候,由于容器my-nginx6在启动时没有指定其内部的80端口映射到宿主机的端口上,所以默认是没法访问的! 现在通过宿主机的iptables进行net转发来解决。 首先获得容器的ip地址 \[root@localhost \~\]# docker inspect my-nginx6 \| grep IPAddress ​ "SecondaryIPAddresses": null, ​ "IPAddress": "172.17.0.7", ​ "IPAddress": "172.17.0.7", \[root@localhost \~\]# ping 172.17.0.7 PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data. 64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.105 ms 64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.061 ms ... \[root@docker-test \~\]# telnet 172.17.0.7 80 Trying 172.17.0.7... Connected to 172.17.0.7. Escape character is '\^\]' ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/dfa8e5bdfc9f2b40a0c6ba34c0d40838.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/5057f60e6e45d41c1127ced02f50a31c.webp) centos7下部署iptables环境纪录(关闭默认的firewalle) 参考:http://www.cnblogs.com/kevingrace/p/5799210.html 将容器的80端口映射到dockers宿主机的9998端口 \[root@localhost \~\]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9998 -j DNAT --to-destination 172.17.0.7:80 \[root@localhost \~\]# iptables -t nat -A POSTROUTING -d 172.17.0.7/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.110.128 \[root@localhost \~\]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 9998 -j ACCEPT 保存以上iptables规则 \[root@localhost \~\]# iptables-save \> /etc/sysconfig/iptables 查看/etc/sysconfig/iptables文件,注意下面两行有关icmp-host-prohibited的设置一定要注释掉!否则nat转发会失败! \[root@docker-test \~\]# cat /etc/sysconfig/iptables \[root@localhost \~\]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.21 on Sun Jan 17 20:49:29 2021 \*filter :INPUT ACCEPT \[4:272

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [3:308]

:DOCKER - [0:0]

:DOCKER-ISOLATION-STAGE-1 - [0:0]

:DOCKER-ISOLATION-STAGE-2 - [0:0]

:DOCKER-USER - [0:0]

-A INPUT -p tcp -m state --state NEW -m tcp --dport 9998 -j ACCEPT

-A FORWARD -j DOCKER-USER

-A FORWARD -j DOCKER-ISOLATION-STAGE-1

-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -o docker0 -j DOCKER

-A FORWARD -i docker0 ! -o docker0 -j ACCEPT

-A FORWARD -i docker0 -o docker0 -j ACCEPT

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

-A DOCKER -d 172.17.0.4/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

-A DOCKER -d 172.17.0.5/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

-A DOCKER -d 172.17.0.6/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2

-A DOCKER-ISOLATION-STAGE-1 -j RETURN

-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP

-A DOCKER-ISOLATION-STAGE-2 -j RETURN

-A DOCKER-USER -j RETURN

COMMIT

Completed on Sun Jan 17 20:49:29 2021

Generated by iptables-save v1.4.21 on Sun Jan 17 20:49:29 2021

*nat

:PREROUTING ACCEPT [1:243]

:INPUT ACCEPT [1:243]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:DOCKER - [0:0]

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

-A PREROUTING -p tcp -m tcp --dport 9998 -j DNAT --to-destination 172.17.0.7:80

-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE

-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE

-A POSTROUTING -s 172.17.0.4/32 -d 172.17.0.4/32 -p tcp -m tcp --dport 80 -j MASQUERADE

-A POSTROUTING -s 172.17.0.5/32 -d 172.17.0.5/32 -p tcp -m tcp --dport 80 -j MASQUERADE

-A POSTROUTING -s 172.17.0.6/32 -d 172.17.0.6/32 -p tcp -m tcp --dport 80 -j MASQUERADE

-A POSTROUTING -d 172.17.0.7/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.110.128

-A DOCKER -i docker0 -j RETURN

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8088 -j DNAT --to-destination 172.17.0.2:80

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 49153 -j DNAT --to-destination 172.17.0.3:80

-A DOCKER -d 127.0.0.1/32 ! -i docker0 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 172.17.0.4:80

-A DOCKER -d 192.168.110.128/32 ! -i docker0 -p tcp -m tcp --dport 9999 -j DNAT --to-destination 172.17.0.5:80

-A DOCKER -d 127.0.0.1/32 ! -i docker0 -p tcp -m tcp --dport 7788 -j DNAT --to-destination 172.17.0.6:80

-A DOCKER -d 192.168.110.128/32 ! -i docker0 -p tcp -m tcp --dport 7777 -j DNAT --to-destination 172.17.0.6:80

COMMIT

Completed on Sun Jan 17 20:49:29 2021

最后重启iptbales服务(发现启动不成功!)

root@docker-test \~\]# systemctl restart iptables ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/dc09f1c523215253962cc922a88dd4f5.webp) #systemctl restart iptables.service ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/9b9a3109e49225e9866a7f7a1d761630.webp) 没有安装iptables 查看iptables规则 # iptables -L -t nat 但是最后,然后访问http://192.168.110.128:9998/,就能转发访问到my-nginx6容器的80端口了!!! ======================================================== ###### 启动所有容器 # docker start $(docker ps -a -q) 【启动所有容器】 \[root@localhost \~\]# docker start $(docker ps -a -q) ======================================================== ###### 查看容器 #docker ps 列出当前所有正在运行的容器 docker ps -a 【列出所有的容器】 docker ps -l 【列出最近创建的容器】 docker ps -n 3 【列出最近创建的3个容器】 docker ps -q 【只显示容器ID】 docker ps --no-trunc 【显示当前所有正在运行的容器完整信息】 ======================================================== ###### 退出容器 exit 【退出并停止容器】 Ctrl+p+q 【只退出容器,不停止容器】 ======================================================== ###### 启动/停止容器 docker start 容器ID或容器名称 【启动容器】 docker restart 容器ID或容器名称 【重新启动容器】 docker stop 容器ID或容器名称 【停止容器】 docker kill 容器ID或容器名称 【强制停止容器】 ======================================================== ###### 删除容器 # docker rm 容器ID或容器名称【删除容器】 # docker rm -f 容器ID或容器名称【强制删除容器】 # docker rm -f $(docker ps -a -q)【删除多个容器】 ======================================================== ###### docker日志 # docker logs -f -t --since --tail 容器ID或容器名称【查看容器日志】 如:docker logs -f -t --since="2018-09-10" --tail=10 f9e29e8455a5 -f : 查看实时日志 -t : 查看日志产生的日期 --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志 --tail=10 : 查看最后的10条日志 ======================================================== ###### 查看容器细节 # docker top 容器ID或容器名称【查看容器内运行的进程】 # docker inspect 容器ID或容器名称【查看容器内部细节】 ======================================================== ###### 进入容器细节 # docker attach 容器ID 【进到容器内】 进入正在运行的容器 # docker exec 容器ID 【进到容器内】 开启一个新的终端 例如: ​ \[root@localhost \~\]# docker exec -it 11e0d671f9e6 /bin/bash ​ \[root@localhost \~\]# docker attach e4dcbd52904f ======================================================== ###### 容器文件拷贝 # docker cp 容器ID:容器内的文件路径 宿主机路径 【从容器内拷贝文件到宿主机】 如:docker cp f9e29e8455a5:/tmp/yum.log /root ======================================================== ##### 4、其他常用命令 ###### 查看日志 # docker run -d centos /bin/sh -c "while true;do echo cheristhuan;sleep 1;done" ![在这里插入图片描述](https://file.jishuzhan.net/article/1768876122663030786/95321518bdd633bcfe4cf466f275de16.webp) docker logs -tf --tail 100 7daf0b02abfc -tf # 显示日志 --tail # 后面跟上日志条数 ======================================================== ###### 查看进程 # docker inspect 7daf0b02abfc

相关推荐
duration~1 小时前
K8S自定义CRD
容器·贪心算法·kubernetes
程序员 小柴2 小时前
docker的与使用
java·docker·eureka
ghostwritten2 小时前
Docker Registry Clean
运维·docker·容器
宋冠巡3 小时前
Windows安装Docker(Docker Desktop)
windows·docker·容器
阿噜噜小栈4 小时前
最新国内可用的Docker镜像加速器地址收集
运维·笔记·docker·容器
云上艺旅4 小时前
K8S学习之基础六十八:Rancher创建deployments资源
学习·云原生·容器·kubernetes·rancher
rider1894 小时前
【4】搭建k8s集群系列(二进制部署)之安装master节点服务(kube-apiserver)
云原生·容器·kubernetes
海鸥816 小时前
podman和与docker的比较 及podman使用
docker·容器·podman
GreenMountainEcho12 小时前
Kubernetes 入门篇之 Node 安装与部署
云原生·容器·kubernetes
zyk_52013 小时前
Docker desktop如何汉化
运维·docker·容器