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 search tomcat
从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  **由上面可知:** 容器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即可 测试:    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  **由上面可知:** 容器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   3.5)容器除了在启动时添加端口映射关系,还可以通过宿主机的iptables进行nat转发,将宿主机的端口映射到容器的内部端口上,**这种方式适用于容器启动时没有指定端口映射的情况!** \[root@localhost \~\]# docker run -it -d --name my-nginx6 nginx  这个时候,由于容器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 '\^\]'   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  #systemctl restart iptables.service  没有安装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"  docker logs -tf --tail 100 7daf0b02abfc -tf # 显示日志 --tail # 后面跟上日志条数 ======================================================== ###### 查看进程 # docker inspect 7daf0b02abfc