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