Docker 常用命令

目录

基本命令

安装

Centos

cd /etc/yum.repos.d
wget https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y

如果安装过程中报错: package docker-ce-3:19.03.5-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed,需要安装containerd.io

Ubuntu

sudo apt update

#第一种方式
apt install -y docker.io

#第二种方式
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

查看版本/详细信息/版本

docker -v/info/version

启动/关闭/重启

Centos

说明 命令
启动 systemctl start docker
关闭 systemctl stop docker
重启 systemctl restart docker
设置docker开机自启 systemctl enable docker
重新加载服务配置文件 systemctl daemon-reload
删除docker所有资源 docker system prune

Ubuntu

--启动/停止/重启/查看状态 
sudo service docker start/stop/restart/status

卸载

docker system prune
yum remove docker-ce
rm -rf /var/lib/docker

配置全局容器DNS

 sudo  vi /etc/default/docker

找到下面这行数据,去掉#取消注释,如果没有就手动添加

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

或者修改/etc/docker/daemon.json文件,没有就新增

vi /etc/docker/daemon.json

新增以下内容

{
  "dns" : [
    "172.17.45.209",
    "8.8.8.8"
  ]
}

然后重启docker

sudo service docker restart

查看docker使用资源情况

docker stats --no-stream
docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

Daemon.json

Docker全局配置文件,默认不创建,需手动创建。位置:/etc/docker/daemon.json

{
  "registry-mirrors" : [
    "https://cr.console.aliyun.com",
    "http://mirrors.tuna.tsinghua.edu.cn",
    "http://mirrors.aliyun.com",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug" : true,
  "experimental" : true
}

镜像

拉取镜像

--不加版本号默认最新版本
docker pull mcr.microsoft.com/dotnet/core/sdk
docker pull mcr.microsoft.com/dotnet/core/sdk:3.0

创建镜像

docker build -f Dockerfile  -t  [镜像名称]  . 
docker build --no-cache --build-arg env="test" --build-arg name="demo" -f Dockerfile  -t  [镜像名称]  . 
  • -t代表tag,指定新的镜像的用户信息
  • --no-cache代表不使用缓存,可以不用加此参数
  • -f指定Dockerfile文件名称,默认使用当前路径的Dockerfile可以不用加此参数
  • . 是 Dockerfile 所在的路径(当前目录)
  • --build-arg变量,在Dockerfile中需要声明变量ARG env="Default_Value"ENV env=${env},使用${env}获取变量值。如果没有传递变量值,以"Default_Value"为主。

根据容器构建镜像

docker commit -a="rainfate" -m="build image" b2a3  redis:1.0
  • -a代表作者信息
  • -m代表备注
  • b2a3代表容器ID
  • redis代表新的镜像

查询本地镜像

语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:

  • -a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  • --digests:显示镜像的摘要信息
  • --no-trunc:显示完整的镜像信息
  • -q:只显示镜像ID

案例:

--查询所有镜像
docker images 
--模糊搜索(d代表名称,l代表tag)
docker images   d*:l*
--查询某个镜像
docker images   mcr.microsoft.com/dotnet/core/sdk
docker images   mcr.microsoft.com/dotnet/core/sdk:3.0
--只显示镜像ID
docker images -q mcr.microsoft.com/dotnet/core/sdk

删除镜像

docker rmi -f   [镜像ID1] [镜像ID2] [镜像ID3] ...

删除查询到的镜像

docker rmi -f $(docker images -q [镜像ID] )

删除所有镜像

docker rmi `docker images -q`

删除包含关键字的镜像

docker rmi -f `docker images | grep redis | awk '{print $3}'`

删除所有未被 tag 标记和未被容器使用的镜像

docker image prune

删除所有未被容器使用的镜像

docker image prune -a

删除名称或标签为none的镜像

docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`
docker rmi $(docker images -f "dangling=true" -q)

删除所有无用数据卷

 docker volume prune

删除 docker 所有资源

docker system prune

修改镜像文件

--镜像文件拷贝到本地
docker cp  redis:/app /ect
docker cp  redis:/usr/test.yml  /tmp

--本地文件拷贝到镜像
docker cp   /ect  redis:/app
docker cp  test.yml redis:/usr/test.yml

导出镜像

--建议使用名称,使用ID会导致镜像导入的时候名称为none
docker save -o  文件名称.tar  镜像名称/ID 
docker save  镜像名称/ID  -o  文件名称.tar
  • -o:保存路径

导入镜像

docker load -qi   文件名称.tar
  • -q:精简输出信息
  • -i:指定导入的文件
    当导入镜像名称为none时重新附上名称和标签
docker tag  镜像id  镜像名称:镜像标签

查看镜像元数据

docker inspect -s   [镜像ID]

容器

创建容器

参考链接:

创建一个立即运行的容器

docker run -p  映射端口:容器端口  [镜像ID]

创建一个后台运行的容器

docker run -d -p  映射端口:容器端口  [镜像ID] 

创建一个自定义DNS的容器

docker run --dns=8.8.8.8 --dns=8.8.4.4 -d  [镜像ID] 

创建一个指定用户的容器

docker run -u root  [镜像ID] 

创建一个root权限的容器

docker run --privileged=true [镜像ID] 

创建一个最大2G内存的容器

docker run -m 2g -d  [镜像ID] 
docker run -m 512m -d  [镜像ID] 

创建一个共享宿主机网络和端口的容器

docker run -net host  -p 3307:3307 -d --name=web-api  [镜像ID] 

创建一个自定义名称的容器

docker run --name=web-api  [镜像ID] 

创建一个指定网络和IP的容器

docker run --net=my-network --ip 172.17.0.10 container1

开机自启

docker run --restart=always  [镜像ID] 
docker update  [镜像ID]  --restart=always

容器目录和宿主机目录映射(目录共享)

docker run -v /sharedfile:/sharedfile
  • 宿主机的/sharedfile目录挂载到容器的/sharedfile目录
  • 语法:/宿主机目录:/容器目录
  • docker inspect查看Mounts部分,Source为宿主机目录,Destination为容器目录

环境变量

docker run -e  "ASPNETCORE_ENVIRONMENT=development"  [镜像ID] 

run一个容器

docker run  -v /sharedfile:/sharedfile -d  -p 5000:80 -e  ASPNETCORE_URLS=http://*:80 --name=webHost --restart=always   testImages:1.0

查询容器

参考链接:

语法:docker ps [OPTIONS]OPTIONS说明:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • --no-trunc :显示完成内容。
  • -q :只显示容器编号。
  • -s :显示总的文件大小。

查询正在运行中的容器

docker ps

查询所有容器

docker ps -a

通过grep内容过滤

docker ps -a | grep ID/Name/Port

容器ID进行过滤

docker ps --filter id=[容器ID]

查询容器格式化输出

docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}"
名称 含义
.ID 容器ID
.Image 镜像ID
.Command 执行的命令
.CreatedAt 容器创建时间
.RunningFor 运行时长
.Ports 暴露的端口
.Status 容器状态
.Names 容器名称
.Label 分配给容器的所有标签
.Mounts 容器挂载的卷
.Networks 容器所用的网络名称

容器名称进行过滤

docker ps --filter name=[容器名称]

查询最近创建的5个容器信息

docker ps -n 5

镜像ID进行过滤

docker ps --filter ancestor=[镜像ID]

镜像名称进行过滤

 docker ps --filter ancestor= <image-name>[:<tag>]

容器状态进行过滤

docker ps --filter status=running

状态类型:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

端口号进行过滤

docker ps -a | grep 8100

进入容器

进入容器方式

容器必须正在运行

#进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker exec -it [容器id]  bash
docker exec -it [容器id]  sh

进入容器之后可以使用以下命令:

  • ls:列出目录
  • cat 1.txt:查看文件
  • cat > 1.txt:新增/修改文件

退出容器:

  • exit
  • Ctrl + p + q

进入容器(管理员权限)

docker exec -it -u root [容器id]  /bin/bash

宿主环境执行容器内部命令

docker exec -it mysql  ls -la

安装package

需要root权限
修改镜像源可以通过查看Linux-Ubuntu-镜像源
可以通过lsb_release -a命令查看Linux发行版本
不同的版本安装package命令不同

  1. apt update
  2. yum update
  3. apk update
apt-get update 
apt-get install vim

进入容器方式2

容器必须正在运行

# 进入容器正在执行某个命令的终端,不能在里面操作
docker attach  --sig-proxy=false  [容器id]

进入容器方式3-进入镜像创建的伪容器

docker run -it  [镜像ID]  /bin/bash

首先,docker run -it centos 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash,对指定的容器执行 bash。

进入容器后访问 URL 查看是否成功

 curl  -I  http://0.0.0.0:8001

宿主机执行容器命令

docker exec -it nginx echo 1

查看容器元数据

docker inspect -s   [容器ID]

查看容器IP

docker inspect [容器ID] |grep "IPAddress"
docker inspect --format '{{.NetworkSettings.IPAddress }}'  [容器ID]
docker inspect -f '{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' [容器ID]

查看容器DNS

docker exec  -it  [容器ID] /bin/bash
cat /etc/default/docker

容器日志

Shell 含义
docker logs CONTAINER_ID 查看容器日志
docker logs -f CONTAINER_ID 实时查看日志
docker logs -t CONTAINER_ID 查看日志+时间戳
docker logs --since 30m CONTAINER_ID 查看最近30分钟的日志
docker logs -t --since="2021-08-18T11:46:37" CONTAINER_ID 查看某个时间之后的日志
docker logs --tail=100 CONTAINER_ID 查看最新的100条日志

查看容器所在网络

docker inspect containerId -f "{{json .NetworkSettings.Networks }}"`

导出容器

docker export  -o  ./centos.tar   [容器ID]

导入容器

docker import centos.tar  centos:1.0

暂停/恢复/启动/停止/重启 容器

docker pause/unpause/start/stop/restart [容器ID] [容器ID]...

杀掉一个或多个运行中的容器

docker kill -s  KILL  [容器ID] [容器ID]...

删除容器

删除一个或多少容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -f :强制删除一个运行中的容器
  • -l :移除容器间的网络连接,而非容器本身
  • -v :删除与容器关联的卷

强制删除容器

docker rm -f  [容器ID] [容器ID]...

强制删除筛选出的容器

docker rm -f $( docker ps -aq --filter id=[容器ID] )

删除最近创建的5个容器

docker rm -f $( docker ps -aq -n 5 )

删除所有容器

docker rm -f `docker ps -a -q`

删除所有停止运行的容器

docker container prune

删除异常停止的容器

docker rm `docker ps -a | grep Exited | awk '{print $1}'`

容器与主机之间的文件拷贝

主机目录拷贝至容器目录

--将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/

--将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www

容器目录拷贝至主机目录

--将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/www /tmp/

网络

参考文档:

容器之间通过127.0.0.1通讯

此通讯模式是joined网络通讯模式
语法:docker run --network container:containerId ...

--创建容器A
docker run -d  mysql

--创建容器B访问容器A
--通过127.0.0.1可以访问的是容器A的端口,而不是宿主机端口
 docker run -d --network container:mysql  net6app

创建网络

docker network create [OPTIONS] NETWORK
名称,简写 默认 说明
--attachable false 启用手动容器安装
--aux-address map[] 网络驱动程序使用的辅助IPv4或IPv6地址
--driver, -d bridge 驱动程序管理网络
--gateway 用于主子网的IPv4或IPv6网关
--internal false 限制对网络的外部访问
--ip-range 从子范围分配容器ip
--ipam-driver default IP地址管理驱动程序
--ipam-opt map[] 设置IPAM驱动程序的具体选项
--ipv6 false 启用IPv6网络
--label 在网络上设置元数据
--opt, -o map[] 设置驱动程序特定选项
--subnet 表示网段的CIDR格式的子网

创建一个网络

# 默认bridge格式创建网络
docker network create -d bridge  my-network

创建指定网段网络

# 默认bridge格式创建网络
docker network create  --subnet=172.18.0.0/16 my-network

创建指定网段网络和规定IP范围

# 默认bridge格式创建网络
docker network create  --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20  my-network

连接网络

容器连接网络后,容器通讯可以直接ping容器名称/网络别名

docker network connect [OPTIONS] NETWORK CONTAINER
名称,简写 说明
--alias 为容器添加网络范围的别名
--ip 指定IP地址
--ip6 指定IPv6地址
--link 添加链接到另一个容器
--link-local-ip 添加容器的链接本地地址

将正在运行的容器连接到网络

 docker network connect my-network container1

启动时将容器连接到网络

docker run -d --net=my-network container1
docker run -d --network my-network container1

指定容器的IP地址

docker network connect --ip 10.10.36.122 my-network container1

启动时将容器连接到网络并指定IP

docker run -itd --net my-network --ip 172.17.0.10 container1

容器创建网络别名

docker network connect --alias db --alias mysql my-network container1

一个容器与另一个容器别名链接

#container2容器可以使用container1名称访问container1
docker run -d -p 15001:80 --link container1 container2

# 或者使用自定义别名访问
docker run -d -p 15001:80 --link container1:c1 container2


# container2 必须没有加入此网络
docker network connect --link container1:c1 my-network container2

创建网络容器名称通讯

#创建网络
docker network create -d bridge testnet

#创建容器加入网络必须指定容器名称 --name
docker run -d  -p 15002:80 --name=testa --net=testnet  net6config
docker run -d  -p 15003:80 --name=testb --net=testnet  net6config

#进入容器
ping  testa/testb

#这里是容器端口,不是宿主机端口
curl -I http://testa:80

断开连接网络

docker network disconnect命令用于断开容器的网络。容器必须运行才能将其与网络断开连接。

docker network disconnect -f my-network container1

查看网络信息

docker network inspect  my-network

查看网络所有容器

docker network inspect  my-network | jq  .[].Containers

查看所有网络

docker network ls 

删除所有网络

docker network prune

删除网络

# 如果有容器连接网络需要先断开容器网络连接或删除容器再删除网络
docker network rm  my-network
posted @ 2022-08-14 17:10  雨水的命运  阅读(278)  评论(0编辑  收藏  举报