应用举例
镜像应用
搜索镜像
- 命令
docker search mysql
- 解释
NAME #镜像的名称
DESCRIPTION #镜像的描述
STARS #镜像的受欢迎程度
OFFICIAL #镜像是否为官方镜像,[OK]表示是官方镜像
拉取镜像
- 命令
docker pull mysql
- 解释
Using default tag: latest #使用默认的标签
latest: Pulling from library/mysql #镜像的来源信息
a2abf6c4d29d: Pull complete #镜像的分层概念,此Nginx镜像共分为6层并下载
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 #镜像的哈希值,用于校验镜像
Status: Downloaded newer image for mysql:latest #镜像下载状态
docker.io/library/mysql:latest #
查看镜像
- 命令
docker images
docker image ls
#查看镜像详情
docker image inspect mysql:latest
- 解释
REPOSITORY #镜像所属仓库
TAG #镜像的版本
IMAGE ID #镜像的ID
CREATED #镜像创建时间
SIZE #镜像的大小
删除镜像
- 命令
docker rmi mysql:5.6.51
- 解释
Untagged: mysql:5.6.51 #镜像删除的过程
Untagged: mysql@sha256:fc5f5fb7574755c306aaf88456ebfbe0b006420a184d52b923d2f0197108f6b7
Deleted: sha256:0f8498f13f3adef3f3c8b52cdf069ecc880b081159be6349163d144e8aa5fb29
Deleted: sha256:1157a8fe80ce7a83101aa2364ca1758215873a32da11ab707161a4dc5613004e
Deleted: sha256:8eaa6e373c644088743d81d89291c01ef6790a21d83139bf7e919b01c070dec6
Deleted: sha256:6871e36d10c3a8334e6bf8af5c799245354a3ccbf0f324478e9894b465db523c
Deleted: sha256:91aa4ea35a8a6f0c5f85f0840b612064e2956bdef9c6cdda4cfac33c37010210
Deleted: sha256:061cb4f48d1eaf5424d5d7b4d0c65102f24530b9f1e01ec5e72a06966263c965
Deleted: sha256:3af14c9a24c941c626553628cf1942dcd94d40729777f2fcfbcd3b8a3dfccdd6
容器应用
创建容器
- 命令
docker run -it -d --rm --name mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/mysql-files:/var/lib/mysql-files \
-v /data/mysql/logs:/var/log/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-p 33066:3306 \
-e MYSQL_ROOT_PASSWORD='1qaz!QAZ' \
-e MYSQL_DATABASE='practice_db' \
-e MYSQL_USER='Practice' \
-e MYSQL_PASSWORD='Pra@db_123' \
--restart=always \
--cpus=0.5 \
--memory=4G \
mysql:latest
- 解释
- 指定容器名称:–name
- 示例:–name mysql
- 指定退出时删除容器(一般用于无状态的服务,此处MySQL仅演示使用)
- 示例:–rm
- 环境变量
- 格式:-e 环境变量的Key=环境变量的Value
- 格式:–env 环境变量的Key=环境变量的Value
- 示例:-e MYSQL_ROOT_PASSWORD=‘1qaz!QAZ’
- 路径映射
- 精确路径映射
- 格式:-v 宿主机路径:容器内部路径
- 示例:-v /data/mysql/data:/var/lib/mysql
- 端口映射
- 随机端口映射
- 格式:-P
- 示例:docker run -itd -P --name nginx_001 nginx:1.20
- 解释:可以随机分配一个端口映射,给nginx_001的对外端口
- 随机映射端口到指定地址
- 格式:-P 宿主机IP地址:宿主机随机端口:容器端口
- 示例:docker run -itd -P 192.169.1.34::80 --name nginx_003 nginx:1.20
- 解释:可以随机分配一个端口映射,给nginx_003的对外端口。但是只能使用指定的192.169.1.34加上随机端口,才能访问到此容器
- 精确端口映射
- 格式:-p 宿主机端口:容器内部端口
- 示例:docker run -itd -p 8888:80 --name nginx_002 nginx:1.20
- 解释:可以指定一个端口映射,给nginx_002的对外端口
- 精确映射端口到指定地址
- 格式:-p 宿主机IP地址:宿主机端口:容器内部端口
- 示例:docker run -it -d -p 192.168.108.128:8989:80 --name nginx_004 nginx:1.20
- 解释:可以指定一个端口映射,给nginx_004的对外端口。但是只能使用指定的192.169.1.34加上指定的8989端口,才能访问到此容器
- 指定UDP/TCP的映射
- 格式:-p 宿主机IP地址:宿主机端口:容器内部端口/[tcp|udp]
- 示例:docker run -it -d -p 192.168.108.128:8989:80/udp -p 192.168.108.128:8989:80/tcp --name nginx_004 nginx:1.20
- 指定重启策略,可以指定的策略有:
- **always:**当容器退出时,Docker 总是重启容器。
- 示例:–restart=always
- **on-failure:**当容器退出时,Docker 只在容器失败时重启容器(可以指定重启尝试次数)。容器成功退出(如正常停止或退出)时不会重启。
- 示例:–restart=on-failure:3
- **unless-stopped:**当容器退出时,Docker 只在容器非正常停止时重启容器。如果容器被 Docker 停止(如通过 docker stop 命令),它不会重启。
- 示例:–restart=unless-stopped
- **no:**禁用重启策略,容器退出时不会自动重启。
- 示例:–restart=no
- 指定资源限制,可以限制的资源有:
- CPU限制:
- 使用 --cpu-shares 或 --cpus 选项来限制容器的CPU使用。
- –cpu-shares 是一个相对值,表示相对于其他容器的权重。例如,–cpu-shares=512 表示该容器将占用宿主机CPU的512份。
- –cpus 是一个绝对值,表示容器可以使用的CPU核心数。例如,–cpus=0.5 表示容器可以使用宿主机CPU的50%。
- 内存限制:
- 使用 --memory 或 --memory-swap 选项来限制容器的内存使用。
- –memory 表示容器的内存使用上限。例如,–memory=1G 表示容器可以使用1GB的内存。
- –memory-swap 表示容器的内存和交换空间总使用上限。例如,–memory-swap=2G 表示容器可以使用最多2GB的内存或交换空间。
- I/O限制:
- 使用 --blkio-weight 或 --blkio-weight-device 选项来限制容器的块I/O权重。
- –blkio-weight 是一个相对值,表示相对于其他容器的权重。例如,–blkio-weight=512 表示该容器将占用宿主机I/O的512份。
- –blkio-weight-device 是一个绝对值,表示针对特定设备(如硬盘)的I/O权重。例如,–blkio-weight-device=8:256 表示针对设备 /dev/sdb 的I/O权重为256。
- 网络限制:
- 使用 --network-disable 选项来禁用容器的网络接口。
- 使用 --device 选项来限制容器的网络设备访问。例如,–device=/dev/net/tun 表示容器可以使用 /dev/net/tun 设备。
查看容器
- 命令
docker ps
docker ps -a
- 解释
CONTAINER ID #容器的ID
IMAGE #容器使用的镜像
COMMAND #容器使用的命令
CREATED #容器的创建时间
STATUS #容器的运行状态
PORTS #容器的映射端口
NAMES #容器的名称
删除容器
删除容器时,可以依据容器名称或容器ID
- 命令
docker rm mysql
docker rm -f mysql
停止容器
停止容器时,可以依据容器名称或容器ID
- 命令
docker stop mysql
启动容器
启动容器时,可以依据容器名称或容器ID
- 命令
docker start mysql
docker restart mysql
进入容器
进入容器时,可以依据容器名称或容器ID
- 命令
docker exec -it mysql /bin/bash
查看日志
查看容器日志时,可以依据容器名称或容器ID
docker logs mysql
docker logs -f mysql
网络应用
网络模式
- bridge
- bridge是桥接模式,在宿主机网络中docker创建了Docker0网卡,主要负责宿主机与Docker的网络交互。
- 所有创建的容器默认情况下都会加入Docker0网络,所以Docker0网络上会有一对一对虚拟网卡。
- 示意图
- host
- host是主机模式,容器不再有自己的网络,而是直接与主机共享网络。
- 主机模式下创建的容器对应的IP与宿主机在同一网段。
- 只要与宿主机同一网络的所有容器或主机都可以访问。
- 示意图
- none
- none是本地模式,docker会拥有自己的网络,并且不与主机共享网络。
- 在none网络模式下,容器不会被分配网卡、路由、IP等相关信息。
- 容器会被完全隔离,且容器中仅存在lo网卡。
- container
- container是容器模式,不会创建自己的网络,而是与其他容器共享网络。
- 示意图
- 自定义(推荐使用)
- 不使用docker自带的网络模式,而是自己特有的网络模式。
- 使用docker network create创建一个自定义网络模式。
自定义网络模式
- 格式
docker network create [OPTIONS] NETWORK
#参数
--attachable
--aux-address map
--config-from string
--config-only
--driver string #指定网络模式,bridge、host、none
--gateway strings #指定网关地址
--ingress
--internal
--ip-range strings
--ipam-driver string
--ipam-opt map
--ipv6
--label list
--opt map
--scope string
--subnet strings #指定子网
- 创建网络
- 命令
docker network create \
--driver bridge \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
work-network
- 解释
--driver #指定网络的模式
--subnet #指定网络的子网范围
--gateway #指定网络的网关
work-network #该网络的名称
- 查看网络
- 命令
docker network ls
- 解释
NETWORK ID #网络的ID
NAME #网络的名称
DRIVER #网络的模式
SCOPE #网络作用范围
- 查看网络详细信息
docker network inspect work-network
- 应用网络
- 命令
docker run -d --rm -p 8881:80 --name nginx-web01 --net work-network nginx:latest
- 解释
--net #指定使用的网络名称
容器互联
- 桥接模式下的容器连通
- 运行一个名字为centos-1的容器
- 命令
docker run -d --rm --name centos-1 centos:latest ping 127.0.0.1
- 解释
-d #后台运行容器
--rm #退出容器时删除容器
--name #定义容器的名称
ping 127.0.0.1 #容器执行的命令,让centos镜像持续运行
- 再运行一个名字为centos-2容器可以与名字为centos-1容器连通
- 命令
docker run -d --rm --name centos-2 --link centos-1 centos:latest ping 127.0.0.1
- 解释
-d #后台运行容器
--rm #退出容器时删除容器
--name #定义容器的名称
--link #指定容器连接centos-1
ping 127.0.0.1 #容器执行的命令,让centos镜像持续运行
- 检查容器是否运行
docker ps | grep centos
- 验证容器之间连通
- centos-1容器连通centos-2
docker exec -it centos-1 ping centos-2
# ping: centos-2: Name or service not known
- centos-2容器连通centos-1
docker exec -it centos-2 ping centos-1
# PING centos-1 (172.17.0.6) 56(84) bytes of data.
# 64 bytes from centos-1 (172.17.0.6): icmp_seq=1 ttl=64 time=0.090 ms
# 64 bytes from centos-1 (172.17.0.6): icmp_seq=2 ttl=64 time=0.058 ms
# 64 bytes from centos-1 (172.17.0.6): icmp_seq=3 ttl=64 time=0.060 ms
# ^C
# --- centos-1 ping statistics ---
# 3 packets transmitted, 3 received, 0% packet loss, time 2000ms
# rtt min/avg/max/mdev = 0.058/0.069/0.090/0.016 ms
- 自定义模式下的容器互联
- 创建网络
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 work-network
- 应用网络
- centos-1容器创建
docker run -d --rm --name centos-1 --net work-network centos:latest ping 127.0.0.1
- centos-2容器创建
docker run -d --rm --name centos-2 --net work-network centos:latest ping 127.0.0.1
- 检查容器是否运行
docker ps | grep centos
- 验证容器之间互通
- centos-1容器连通centos-2
docker exec -it centos-1 ping centos-2
# PING centos-2 (192.168.1.3) 56(84) bytes of data.
# 64 bytes from centos-2.work-network (192.168.1.3): icmp_seq=1 ttl=64 time=0.095 ms
# 64 bytes from centos-2.work-network (192.168.1.3): icmp_seq=2 ttl=64 time=0.066 ms
# ^C
# --- centos-2 ping statistics ---
# 2 packets transmitted, 2 received, 0% packet loss, time 1003ms
# rtt min/avg/max/mdev = 0.066/0.080/0.095/0.017 ms
- centos-2容器连通centos-1
docker exec -it centos-2 ping centos-1
# PING centos-1 (192.168.1.2) 56(84) bytes of data.
# 64 bytes from centos-1.work-network (192.168.1.2): icmp_seq=1 ttl=64 time=0.067 ms
# 64 bytes from centos-1.work-network (192.168.1.2): icmp_seq=2 ttl=64 time=0.071 ms
# ^C
# --- centos-1 ping statistics ---
# 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
# rtt min/avg/max/mdev = 0.067/0.069/0.071/0.002 ms
跨容器互联
- 创建容器
- 创建centos-1容器
docker run -d --rm --name centos-1 centos:latest ping 127.0.0.1
- 创建centos-2容器
docker run -d --rm --name centos-2 centos:latest ping 127.0.0.1
- 连接网络
- 创建网络
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 work-network
- 将网络与容器连接
docker network connect work-network centos-1
docker network connect work-network centos-2
- 检查容器是否运行
docker ps | grep centos
- 验证互通
- centos-1容器连通centos-2
docker exec -it centos-1 ping centos-2
# PING centos-2 (192.168.1.3) 56(84) bytes of data.
# 64 bytes from centos-2.work-network (192.168.1.3): icmp_seq=1 ttl=64 time=0.063 ms
# 64 bytes from centos-2.work-network (192.168.1.3): icmp_seq=2 ttl=64 time=0.061 ms
# ^C
# --- centos-2 ping statistics ---
# 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
# rtt min/avg/max/mdev = 0.061/0.062/0.063/0.001 ms
- centos-2容器连通centos-1
docker exec -it centos-2 ping centos-1
# PING centos-1 (192.168.1.2) 56(84) bytes of data.
# 64 bytes from centos-1.work-network (192.168.1.2): icmp_seq=1 ttl=64 time=0.045 ms
# 64 bytes from centos-1.work-network (192.168.1.2): icmp_seq=2 ttl=64 time=0.070 ms
# ^C
# --- centos-1 ping statistics ---
# 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
# rtt min/avg/max/mdev = 0.045/0.057/0.070/0.014 ms
数据卷应用
数据卷绑定方式
Docker中的数据卷绑定时,有三种类型
- 匿名绑定
- 匿名绑定的volume在容器被删除时,数据卷也会被删除,无法实现数据持久化。
- 将宿主机的目录或文件挂载到容器的指定目录,而无需指定宿主机的具体路径。
- 通常用于共享文件系统,以便容器可以访问宿主机的文件和目录。
- 具名绑定
- 具名绑定指定了数据卷的名称,在容器被删除时,数据卷不会删除,可以实现数据持久化。
- 允许容器和宿主机之间的文件系统进行交互。
- Bind Mount
- 将宿主机的目录挂载到容器中,在删除容器时,数据卷不会删除,可以实现数据持久化。
- 是项目部署最常用的一种方式。
匿名绑定
- 格式:-v 容器的目录
- 示例:docker run -d --name nginx-01 -p 8888:80 -v /usr/share/nginx nginx:latest
- 解释:将容器内“/usr/share/nginx”绑定到宿主机上
- 查看匿名绑定的路径:使用命令docker inspect nginx-01查看容器中Mounts下的Source信息。
具名绑定
- 格式:-v 数据卷名称:容器的目录
- 示例:docker run -d --name nginx-01 -p 8888:80 -v nginx-html:/usr/share/nginx nginx:latest
- 解释:将容器内“/usr/share/nginx”绑定到宿主机上,名称为nginx-html
- 查看匿名绑定的路径:使用命令docker inspect nginx-01查看容器中Mounts下的Source信息。
Bind Mount
- 格式:-v 宿主机的目录:容器的目录
- 示例:docker run -d --name nginx-01 -p 8888:80 -v /data/nginx/html:/usr/share/nginx nginx:latest
- 解释:将容器内“/usr/share/nginx”绑定到宿主机的“/data/nginx/html”
部署举例
下载镜像
docker pull redis
部署服务
docker run -d --name redis -p 6380:6379 -v /data/redis/data:/data redis:latest
管理容器
查看日志
docker logs redis
启停容器
- 启动
docker start redis
- 停止
docker stop redis
- 重启
docker restart redis
- 状态
docker stats redis
进入容器
- 进入容器
docker exec -it redis /bin/bash
- 命令容器
docker exec -it redis ls -l
容器内安装工具
#更新容器apt-get
apt-get update
#安装工具
apt-get install -y vim