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