Docker命令(用法说明详解)

一、常见Docker容器命令

#根据image创建一个新容器并运行(若本地没有image,则会自动从dockerhub上下载image)
#每执行一次run,就会再创建一个新容器,即使该image已经存在容器
docker run IMAGE_NAME
#根据image创建一个新容器并运行。 
#选项-d:指定容器为后台运行,--name自定义该容器名
docker run -d --name myname IMAGE_NAME
#根据image创建一个新容器并运行。
#选项-p:指定将容器内的80端口通过外部宿主机的2288端口暴露出去
docker run -d --name myname -p 2288:80 IMAGE_NAME
#根据image创建一个新容器并运行。
#选项-e:指定环境变量key=value。可以多个-e选项以指定多个环境变量
docker run -d --name myname -p 2288:80 -e Key1=Value1 -e Key2=Value2 IMAGE_NAME
#选项--add-host=:增加容器内的hostname:ip的映射关系,既容器内的/etc/hosts文件增加映射关系,使得在容器内可通过域名hostname来访问对应的ip
#因host-gateway默认指向default bridge的IP,所以下面host.docker.internal:host-gateway的作用是在容器内可以通过host.docker.internal域名访问外部宿主机
docker run -d --name myname -p 2288:80 --add-host=host.docker.internal:host-gateway IMAGE_NAME

#交互模式进入容器内部(可以指定CONTAINER_ID或者容器名)
docker exec -it CONTAINER_ID /bin/bash

#查看正在运行中的容器
docker ps
#查看所有容器(各种状态)
docker ps -a
#停止容器
docker stop CONTAINER_ID
#启动容器
docker start CONTAINER_ID
#重启容器
docker restart CONTAINER_ID
#查看正在运行容器占用CPU、MEM、网络等资源情况(可以指定CONTAINER_ID)
docker stats
#查看容器日志
docker logs CONTAINER_ID
#删除指定容器
docker rm CONTAINER_ID
#强制删除指定容器(可强制删除正在运行中的容器)
docker rm -f CONTAINER_ID

# 查看指定容器/镜像/卷/网络等对象的详细信息
docker inspect CONTAINER_ID
docker inspect IMAGE_NAME:TAG
docker inspect VOLUME
docker inspect NETWORK
docker inspect ......

二、常见Docker镜像命令

#下载镜像。不显示指定TAG,则TAG默认为:latest。
docker pull IMAGE_NAME
#下载指定版本(Tag)镜像
docker pull IMAGE_NAME:TAG
#查看本地所有镜像
docker images
#删除本地指定镜像
docker rmi IMAGE_ID

# 以指定容器ID(或获容器名)的当前现状,创建一个新镜像
docker commit -a "Author名" -m "提交说明" CONTAINER_ID NEW_IMAGE_NAME:TAG
# 将指定镜像,导出保存为tar文件
docker save -o myimage.tar IMAGE_NAME:TAG
# 从本地tar文件加载作为镜像
docker load -i mynginx.tar 
# 删除本地多个镜像
docker rmi bde7d154a67f 94543a6c1aef e784f4560448

#在线搜索镜像
docker search IMAGE_NAME

# 查看指定容器/镜像/卷/网络等对象的详细信息
docker inspect CONTAINER_ID
docker inspect IMAGE_NAME:TAG
docker inspect VOLUME
docker inspect NETWORK
docker inspect ......

三、镜像发布至DockerHub

    首先需在DockerHub网页上完成用户注册(http://hub.docker.com/)

# 首先需在DockerHub网页上完成用户注册(http://hub.docker.com/)

# 通过以下命令,按提示登录至DockerHub
docker login

# 对本地镜像,增加一个TAG。新TAG应符合DockerHub规范:用户名/镜像名:TAG
docker tag LOCAL_IMAGE_NAME:TAG username/NEW_IMAGE_NAME:TAG
#注意增加TAG后,同一个IMAGE_ID会有多个TAG名

# 推送镜像至DockerHub(这里不同通过IMAGE_ID指定,因为同一个IMAGE_ID会有多个TAG名)
docker push 用户名/镜像名:TAG
#推送成功后,在DockerHub网页上可以看到

四、容器:目录挂载

   容器涉及磁盘有两种挂载方式:目录挂载卷挂载。以下分别说明

    在创建容器时,可以有两种方式将外部宿主机目录挂载至容器中:

  • docker run --mount type=bind,src=<host-path>,dst=<container-path>
  • docker run --volume <host-path>:<container-path>

    命令示例说明如下:

# 根据image创建一个新容器并运行。
# 选项--mount:将外包宿主机的/app/outdir目录(若目录不存在则报错)mount至容器内的/usr/share/nginx/html挂载点
# 选项--mount可以多次出现,实现多个目录mount挂载
docker run -d --mount type=bind,src=/app/outdir,dst=/usr/share/nginx/html IMAGE_NAME

# 根据image创建一个新容器并运行。
# 选项--volume(既-v):将外包宿主机的/app/outdir目录(若目录不存在则自动创建)mount至容器内的/usr/share/nginx/html挂载点
# 选项--volume(既-v)可以多次出现,实现多个目录mount挂载
docker run -d -v /app/outdir:/usr/share/nginx/html IMAGE_NAME

挂载后,容器看到的内容为外部宿主机目录内容(容器内原内容被obscured掩盖) 

  • --mount方式。 除以上选项外,还支持readonly、bind-propagation选项。若外部宿主机目录不存在则会报错,不会自动创建
  • --volume方式。外部宿主机目录host-path必须是目录形式,若外部宿主机目录不存在则会自动创建。

五、容器:卷映射

    在Docker官方更推荐使用Volume卷映射方式进行数据生成和存储。

    Volume卷为外部宿主机上的概念,可与容器内指定目录进行映射。 有两者方式创建卷Volume:

  • docker volume create   直接创建卷(卷在外部宿主机默认/var/lib/docker/volumes下)
  • docker run --volume <value-name>:<container-path>   在创建容器时创建卷并映射

     在外部宿主机上直接创建卷,命令说明如下:

# 创建一个名为my-vol的卷(卷在外部宿主机默认/var/lib/docker/volumes下)
docker volume create my-vol

# 列出卷
docker volume ls

# 删除没有被容器使用的卷
docker volume prune

# 查看某个卷已被哪些容器使用
docker ps -a --filter "volume=卷名"

# 删除my-vol卷
docker volume rm my-vol

# 查看指定容器/镜像/卷/网络等对象的详细信息
docker inspect CONTAINER_ID
docker inspect IMAGE_NAME:TAG
docker inspect VOLUME
docker inspect NETWORK
docker inspect ......

  在创建容器时同时创建卷并映射,命令说明如下:

# 根据image创建一个新容器并运行。
# 选项-v:将my-vol卷(若卷不存在则创建卷)映射至容器内的/etc/nginx目录。映射后,容器看到的内容为卷内容(容器内原内容被obscured掩盖)
#         若my-vol为空卷empty volume,则自动将容器内映射目录下内容拷贝propagated(copied)至该卷。也可通过选项volume-nocopy禁止拷贝。
#         若my-vol已存在内容,既非空卷non-empty volume,则不会拷贝propagated(copied)。
# 选项-v可以多次出现,实现多个卷映射
docker run -d -v my-vol:/etc/nginx IMAGE_NAME

将my-vol卷(若卷不存在则创建卷)映射至容器内的/etc/nginx目录。映射后,容器看到的内容为卷内容(容器内原内容被obscured掩盖)

  • 若卷my-vol无数据,既空卷empty volume,则自动将容器内容映射目录下内容拷贝propagated(copied)至该卷也可通过选项volume-nocopy禁止不拷贝
  • 若卷my-vol已存在数据,既非空卷non-empty volume,则不会进行拷贝propagated(copied)。

六、网络

    在Docker自动创建了名为“bridge”、“host”等网络。在创建容器时不特别指定,则容器默认使用名为“bridge”网络。

   通过查看名为“bridge”网络详细信息如下。包括该网络IP段、已分配IP的容器、该网络在宿主机上Linux的网络接口名(可以通过Linux操作系统的ifconfig命令查看)等信息。

    通过名为“bridge”网络,可以在各个容器内,通过的IP地址互访(对于上图,通过172.17.0.x地址进行容器之间互访)。

    然而,默认的名为“bridge”网络只能通过IP地址互访,无法通过域名进行容器之间互访。解决方式是:

  • ①自行创建一个网络;
  • ②在创建容器时指定使用自建的网络,即可实现通过域名进行容器之间互访。

命令过程示例如下,这样cntr001和cntr002容器即可通过IP互访,也可以通过容器名互访。

# 自建一个网络:名为“mynet”,Driver为bridge,不纳入Linux操作系统网卡管理
docker network create mynet
# 或者
docker network create --driver bridge --subnet=172.99.99.0/24 --gateway=172.99.99.1 mynet


# 根据image创建一个新容器并运行。
# 选项--network:指定网络。不指定默认使用名为“bridge”的网络
docker run -d --network mynet --name "cntr001" IMAGE_NAME
docker run -d --network mynet --name "cntr002" IMAGE_NAME
# 这样cntr001和cntr002容器即可通过IP互访,也可以通过“容器名”互访

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值