04. Docker基础-应用

应用举例

镜像应用

搜索镜像

  • 命令
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
  • 解释
  1. 指定容器名称:–name
    • 示例:–name mysql
  2. 指定退出时删除容器(一般用于无状态的服务,此处MySQL仅演示使用)
    • 示例:–rm
  3. 环境变量
    • 格式:-e 环境变量的Key=环境变量的Value
    • 格式:–env 环境变量的Key=环境变量的Value
    • 示例:-e MYSQL_ROOT_PASSWORD=‘1qaz!QAZ’
  4. 路径映射
    • 精确路径映射
    • 格式:-v 宿主机路径:容器内部路径
    • 示例:-v /data/mysql/data:/var/lib/mysql
  5. 端口映射
    • 随机端口映射
    • 格式:-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
  6. 指定重启策略,可以指定的策略有:
    • **always:**当容器退出时,Docker 总是重启容器。
    • 示例:–restart=always
    • **on-failure:**当容器退出时,Docker 只在容器失败时重启容器(可以指定重启尝试次数)。容器成功退出(如正常停止或退出)时不会重启。
    • 示例:–restart=on-failure:3
    • **unless-stopped:**当容器退出时,Docker 只在容器非正常停止时重启容器。如果容器被 Docker 停止(如通过 docker stop 命令),它不会重启。
    • 示例:–restart=unless-stopped
    • **no:**禁用重启策略,容器退出时不会自动重启。
    • 示例:–restart=no
  7. 指定资源限制,可以限制的资源有:
    • 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

网络应用

网络模式

  1. bridge
    • bridge是桥接模式,在宿主机网络中docker创建了Docker0网卡,主要负责宿主机与Docker的网络交互。
    • 所有创建的容器默认情况下都会加入Docker0网络,所以Docker0网络上会有一对一对虚拟网卡。
    • 示意图

  1. host
    • host是主机模式,容器不再有自己的网络,而是直接与主机共享网络。
    • 主机模式下创建的容器对应的IP与宿主机在同一网段。
    • 只要与宿主机同一网络的所有容器或主机都可以访问。
    • 示意图

  1. none
    • none是本地模式,docker会拥有自己的网络,并且不与主机共享网络。
    • 在none网络模式下,容器不会被分配网卡、路由、IP等相关信息。
    • 容器会被完全隔离,且容器中仅存在lo网卡。
  2. container
    • container是容器模式,不会创建自己的网络,而是与其他容器共享网络。
    • 示意图

  1. 自定义(推荐使用)
    • 不使用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					#指定子网
  1. 创建网络
  • 命令
docker network create \
--driver bridge \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
work-network
  • 解释
--driver				#指定网络的模式
--subnet				#指定网络的子网范围
--gateway				#指定网络的网关
work-network		#该网络的名称
  1. 查看网络
  • 命令
docker network ls
  • 解释
NETWORK ID			#网络的ID
NAME						#网络的名称
DRIVER					#网络的模式
SCOPE						#网络作用范围
  • 查看网络详细信息
docker network inspect work-network
  1. 应用网络
  • 命令
docker run -d --rm -p 8881:80 --name nginx-web01 --net work-network nginx:latest
  • 解释
--net				#指定使用的网络名称

容器互联

  • 桥接模式下的容器连通
  1. 运行一个名字为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镜像持续运行
  1. 再运行一个名字为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镜像持续运行
  1. 检查容器是否运行
docker ps | grep centos
  1. 验证容器之间连通
    • 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
  • 自定义模式下的容器互联
  1. 创建网络
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 work-network
  1. 应用网络
    • 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
  1. 检查容器是否运行
docker ps | grep centos
  1. 验证容器之间互通
    • 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

跨容器互联

  1. 创建容器
    • 创建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
  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
  1. 检查容器是否运行
docker ps | grep centos
  1. 验证互通
    • 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中的数据卷绑定时,有三种类型

  1. 匿名绑定
    • 匿名绑定的volume在容器被删除时,数据卷也会被删除,无法实现数据持久化。
    • 将宿主机的目录或文件挂载到容器的指定目录,而无需指定宿主机的具体路径。
    • 通常用于共享文件系统,以便容器可以访问宿主机的文件和目录。
  2. 具名绑定
    • 具名绑定指定了数据卷的名称,在容器被删除时,数据卷不会删除,可以实现数据持久化。
    • 允许容器和宿主机之间的文件系统进行交互。
  3. 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
  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值