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

由上面可知:

容器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

相关推荐
TsengOnce1 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器
无为扫地僧2 小时前
三、ubuntu18.04安装docker
ubuntu·docker
谷莠子9053 小时前
hadoop实验之创业有感
hadoop·docker·团队开发
G丶AEOM3 小时前
Docker快速入门
docker
大熊程序猿3 小时前
airflow docker 安装
运维·docker·容器
带电的小王5 小时前
Docker在Ubuntu上安装
ubuntu·docker
fanruitian5 小时前
docker 为单个容器设置代理
运维·docker·容器
梁萌5 小时前
Docker快速安装Tomcat
docker·容器·tomcat·镜像
Doker 多克7 小时前
IntelliJ IDEA Docker集成
spring cloud·docker·intellij-idea
筏镜13 小时前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka