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
代表容器IDredis
代表新的镜像
查询本地镜像
语法: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
命令不同
- apt update
- yum update
- 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/
网络
参考文档:
- https://docs.docker.com/engine/reference/commandline/network/
- https://www.yiibai.com/docker/network.html
容器之间通过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