基本组成
概念
镜像(images):好比一个模板,可通过该模板来创建多个容器服务。
容器(container):利用容器技术可以独立运行一个和一个组应用,使用镜像来创建,类似于实例化镜像。
仓库(repository):存放镜像的地方。
http://hub-mirror.c.163.com
https://registry.docker-cn.com
https://cr.console.aliyun.com/
官方文档地址:https://docs.docker.com/
- 安装docker:
# root用户下操作
su root
# 升级包管理系统 #
# Ubuntu/Debian
apt-get update
apt-get upgrade
# CentOS,redhat
yum update
yum upgrade
# install docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
- 配置镜像站点:
# 查看当前Linux系统版本
cat /etc/os-release
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://dockerproxy.com",
"https://docker.nju.edu.cn",
"https://cr.console.aliyun.com/"
]
}
# 重启docker服务
systemctl daemon-reload
systemctl restart docker
# 查看当前docker的配置,会显示配置的镜像仓库地址
docker info
原理
联合文件系统
联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来进行继承。例如,用户基于基础镜像(用来生成其他镜像的基础,往往没有父镜像)来制作各种不同的应用镜像。这些镜像共享同一个基础镜像层,提高了存储效率。此外,当用户改变了一个Docker镜像(比如升级程序到新的版本),则会创建一个新的层(layer)。因此,用户不用替换整个原镜像或者重新建立,只需要添加新层即可。用户分发镜像的时候,也只需要分发被改动的新层内容(增量部分)。
这让Docker的镜像管理变得十分轻量级和快速。
- 对于个精简的 OS , rootfs 可以很小,只需要包合最基本的命令,工具和程序库就可以了
- 因为底层直接用主机的 kernel,自己只需要提供 rootfs 就可以了
- 由此可见对于不同的 Linux 发行版, boots 基本是一致的, rootfs 会有差別,因此不同的发行版可以公用 bootfs
- 所以虚拟机启动是分钟级别,容器是秒级!
存储引擎:
- Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统
- Linux 上可用的存储引撃有 AUFS、 Overlay2、 Device Mapper、Btrfs 以及 ZFS
- 每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,井且每种存储引擎都有其独有的性能特点
- Docker 在 Windows上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和CoW
# 查看镜像由哪些层组成
docker history
----------------------
┌──(root㉿kali)-[/home/kali]
└─# docker history trexcisco/trex:latest
IMAGE CREATED CREATED BY SIZE COMMENT
360ccbda0573 5 years ago /bin/bash 0B
<missing> 5 years ago /bin/bash 414B
<missing> 5 years ago /bin/bash 438kB
<missing> 5 years ago /bin/bash 521MB
<missing> 6 years ago /bin/bash 450MB
<missing> 6 years ago /bin/bash 209kB
<missing> 6 years ago /bin/bash 365B
<missing> 6 years ago /bin/bash 277kB
<missing> 6 years ago /bin/bash 1.57kB
<missing> 6 years ago /bin/bash 0B
<missing> 6 years ago /bin/bash 422MB
<missing> 6 years ago /bin/bash 22.7MB
<missing> 6 years ago /bin/bash 901MB
<missing> 6 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 6 years ago /bin/sh -c #(nop) ADD file:d6a1da927f0b7a710… 197MB
┌──(root㉿kali)-[/home/kali]
└─#
镜像分层
基本命令
帮助命令
docker version
docker info
docker 命令 --help
https://docs.docker.com/reference/
https://docs.docker.com/reference/cli/docker/
镜像命令
# 查看本地主机的镜像
docker images
docker images -a # 列出全部镜像
docker images -q # 仅显示镜像ID
-----------------------------------
REPOSITORY # 镜像仓库
TAG # 镜像标签
IMAGE ID # 镜像ID
CREATED # 镜像创建时间
SIZE # 镜像大小
=======================================
# 搜索镜像
docker search trex
-----------------------------------
docker search trex --filter=STARS=10
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
trexcisco/trex Officials Cisco TRex traffic generator for 19
========================================
# 拉取镜像
docker pull trexcisco/trex # docker pull 镜像名:tag即版本
# 版本一定是docker hub仓库上有的
------------------------------------
# docker pull trexcisco/trex
Using default tag: latest # image version, default latest
latest: Pulling from trexcisco/trex
1e51505fc96b: Pull complete # 分层下载
4f4fb700ef54: Pull complete
d15406b20a40: Pull complete
7f09b5ac4d98: Pull complete
41b7e4d0bd88: Pull complete
b97754ad857e: Pull complete
69e41ec4c5b1: Pull complete
b7b07546871e: Pull complete
869f3e123971: Pull complete
a9035b3e27b8: Pull complete
7b12b431e47a: Pull complete
e66b750e1013: Pull complete
f0d25c6c461c: Pull complete
fb2d80dca5af: Pull complete
Digest: sha256:651739b0feade4bbe1f5a6f373b1dbbe9823ffeb90507a5227897d16c20b8cbe # 签名, sha id
Status: Downloaded newer image for trexcisco/trex:latest
docker.io/trexcisco/trex:latest # 真实下载地址
===================================================
# 删除镜像
docker rmi -f 镜像ID/名称 # -f强制删除
docker rmi -f $(docker images -aq) # 递归删除所有镜像
容器命令
有相关的镜像才能创建对应的容器,即有类才能创建这个类的实例。
- 创建并启动容器
docker run [可选参数]
-------------------------
--name="name" # 给容器指定名称
-d # 后台方式运行容器,没有前台进程会自动停止
-td # 后台方式启动并运行容器
-it # 使用交互方式运行容器,启动成功后进入容器内部
-p # 指定容器端口及映射主机端口,如 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P # 随机指定端口
=============================
# docker run -it centos /bin/bash
[root@aeb996c2537a /]# ls
anaconda-post.log dev home lib64 media opt root sbin sys usr
bin etc lib lost+found mnt proc run srv tmp var
[root@aeb996c2537a /]# whoami
root
[root@aeb996c2537a /]# exit # 直接退出容器,容器会停止工作
[root@aeb996c2537a /]# CTRL + P + Q # 退出容器但不停止容器
------------------------------
# 后台方式启动并运行容器
└─# docker run --name="demo_centos1" -td centos
08042a5bdc08b9a8205027d93971bdebe7c17151cfe88e9e391c41a1652b4c97
Option如下
-i 以交互模式运行容器,通常与 -t 同时使用
-t 启动容器后,为容器分配一个命令行,通常与 -i 同时使用
-v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d
守护进程,后台运行该容器
-p 指定端口映射,格式:主机(宿主)端口:容器端口
-P 随机端口映射,容器内部端口随机映射到主机的端口
-u 以什么用户身份创建容器
--name "nginx-lb" 容器名字
-m, --memory bytes 设置容器使用内存最大值
-h, --hostname string 指定容器的 host name
--dns 8.8.8.8 指定容器 dns 服务器
-e username="ritchie" 设置环境变量
--restart Docker 重启后,容器是否自动重启
--restart=always
--privileged 容器内是否使用真正的 root 权限
--privileged=true
- 查看并进入容器
# 查看正在运行的容器
docker ps # 列出当前正在运行的容器
docker ps -a # 列出当前正在运行的容器及历史创建的容器
docker ps -n=? # 显示最近创建的n个容器
docker ps -q # 以容器ID方式显示正在运行的容器
# ls -lh /var/lib/docker/containers
# 进入容器
docker exec -it 08042a5bdc08 /bin/bash
[root@08042a5bdc08 /]#
- 删除容器
rm 容器ID # 删除指定容器,不能删除正在运行的容器
docker rm -f 容器ID # 强制删除正在运行的容器
docker rm -f $(docker ps -aq) # 递归强制删除全部容器
docker ps -a -q | xargs docker rm # 删除全部容器
- 启动和停止容器
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止当前正在运行的容器
docker kill 容器ID # 强制停止当前容器
常用命令
- 后台启动容器
└─# docker run -d centos # 启动成功后使用docker ps -a查看会发现容器停止,没有提供服务
31ebce8fcd5bd121deb8668fd7cac6a186a697175afaaffdd9c77eda5555b5ae
┌──(root㉿kali)-[/home/kali]
└─# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31ebce8fcd5b centos "/bin/bash" 4 seconds ago Exited (0) 3 seconds ago hungry_dubinsky
┌──(root㉿kali)-[/home/kali]
└─#
----------------------------------
# 容器使用后台运行方式启动,必须有一个前台进程,否则会自动停止
- 查看日志
└─# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for
42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m
for 42 minutes)
┌──(root㉿kali)-[/home/kali]
└─# docker logs -f -t -n 10 容器ID # 显示指定容器的指定行数的日志信息
- 查看容器进程
└─# docker top 08042a5bdc08
UID PID PPID C STIME TTY TIME CMD
root 4056 4011 0 03:39 pts/0 00:00:00 /bin/bash
┌──(root㉿kali)-[/home/kali]
└─#
- 查看容器内部元数据
docker inspect 容器ID
-------------------------------
┌──(root㉿kali)-[/home/kali]
└─# docker inspect 08042a5bdc08
[
{
"Id": "08042a5bdc08b9a8205027d93971bdebe7c17151cfe88e9e391c41a1652b4c97",
"Created": "2024-05-02T07:39:08.990327617Z",
"Path": "/bin/bash",
"Args": [],
"State": {
...
}
┌──(root㉿kali)-[/home/kali]
└─#
- 进入容器
docker exec -it 容器ID /bin/bash # 进入容器开启一个新的终端进程
docker attach 容器ID # 进入容器正在运行的进程终端,会进入正在运行的一个命令行
- 拷贝容器文件到主机
docker cp 容器ID:待拷贝容器文件路径 目的主机存放文件路径
- 查看容器CPU占用情况
docker stats
- portainer
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer
- 提交镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
---------------------------
-a 提交镜像的作者
-c 使用 Dockerfile 指令来创建镜像
-m 提交时的说明文字
-p commit 时,将容器暂停
---------------------------
docker commit -m="commit a new images for centos" -a="Bruce" 容器ID 目标镜像名称:TAG(版本)
# 将操作过的容器使用commit提交为一个新的镜像
=========================
# 容器中安装 vim ping ifconfig
apt-get update
apt-get install vim #安装vim
apt-get install iputils-ping #安装ping
apt-get install net-tools #安装ifconfig
容器数据卷
# 启动一个centos docker镜像并挂在家目录到主机的/home/ceshi下
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 容器ID # 查看指定容器的元数据
-----------------------
# Mounts下显示挂载的情况
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
容器数据卷
基本命令
# 启动一个centos docker镜像并挂在家目录到主机的/home/ceshi下
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 容器ID # 查看指定容器的元数据
-----------------------
# Mounts下显示挂载的情况
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
案例:MySQL数据持久化存储
官方镜像地址:https://hub.docker.com/_/mysql?tab=description
# *获取镜像* #
# 最新版
docker pull mysql
docker pull mysql:latest
# 8
docker pull mysql:8.0
# 5.7
docker pull mysql:5.7
# 5.6
docker pull mysql:5.6
# *启动容器* #
docker run -d -p 3306:3306 -v /home/kali/Downloads/DockerVolume/mysql/conf:/etc/mysql/conf.d -v /home/kali/Downloads/DockerVolume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d # 后台运行
-p # 端口映射
-v # 挂在数据卷
-e # 指定环境变量
--name # 配置容器名称
---------------------------
(root㉿kali)-[/home/kali]
└─# docker run -d -p 3306:3306 -v /home/kali/Downloads/DockerVolume/mysql/conf:/etc/mysql/conf.d -v /home/kali/Downloads/DockerVolume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
91c25a8eb9a9d498d56f9bfdaf949479625df16263c7d3c0db69b4b88f87ceb0
┌──(root㉿kali)-[/home/kali]
└─# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91c25a8eb9a9 mysql:5.7 "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql01
┌──(root㉿kali)-[/home/kali]
└─# netstat -anp | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1789/docker-proxy
tcp6 0 0 :::3306 :::* LISTEN 1807/docker-proxy
- 指定数据库容器名及初始密码
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 挂在MySQL容器默认配置目录
docker run --name mysql01 -v /home/kali/Downloads/DockerVolume/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 更改默认编码
docker run --name mysql_name -e MYSQL_ROOT_PASSWORD=my_password -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
- MySQL常见环境变量
MYSQL_ROOT_PASSWORD
必需的,它指定将为 MySQL root 超级用户帐户设置的密码
MYSQL_DATABASE
可选的,允许指定要在 docker run mysql 时创建的数据库的名称
如果提供了用户/密码,则该用户将被授予对该数据库的超级用户访问权限(对应于 GRANT ALL)
MYSQL_USER, MYSQL_PASSWORD
可选的,结合使用来创建新用户和密码
该用户将被授予对 MYSQL_DATABASE 变量指定的数据库的超级用户权限
创建用户需要这两个变量
MYSQL_ALLOW_EMPTY_PASSWORD
这是一个可选变量,设置为非空值,如 yes,允许使用 root 用户的空白密码启动容器
MYSQL_RANDOM_ROOT_PASSWORD
可选的,设置为非空值,如 yes,为 root 用户生成随机初始密码
生成的 root 密码将打印到 stdout
MYSQL_ONETIME_PASSWORD
初始化完成后,将 root(不是 MYSQL_USER 中指定的用户!)用户设置为过期,强制在首次登录时更改密码
任何非空值都将激活此设置
MYSQL_INITDB_SKIP_TZINFO
默认情况下,入口点脚本会自动加载 CONVERT_TZ() 函数所需的时区数据
如果不需要,任何非空值都会禁用时区加载
匿名挂载和具名挂载
- 匿名挂载
即不指定挂载到主机上的路径,只指定容器内部需要挂载的目录
docker volume ls # 查看所有卷挂载情况
- 具名挂载
给挂载位置添加名字,即具名挂载。
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 注意:这里 -v juming-nginx: 代表直接给定名字,但是没有指定路径,
# 如果在juming-nginx前面你添加/,则代表指定路径。
# 查看数据卷挂载信息
docker volume inspect 数据卷id
- 区分挂载类型
-v 容器内部路径 # 匿名挂载
-v 卷名:器内部路径 # 具名挂载
-v /宿主机路径:容器内部路径 # 指定路径挂载
--volumes-from 容器ID # 多重挂载其他容器的数据卷,可进行容器数据共享
-----------------------------------
# 定义容器权限
# ro权限--->只读模式, 该路径只能通过宿主机进行操作,容器内部无法操作
docker run -d -P --name ningix01 -v hello:/etc/nginx:ro nginx
docker run -d -P --name ningix01 -v hello:/etc/nginx:rw nginx
容器卷的生命周期一直持续到没有使用为止,一旦持久化到本地,那么本地数据不会伴随容器的删除而删除。
DockerFile
DockerFile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
指令 | 说明 |
---|---|
FROM | 指明当前的镜像基于哪个镜像构建 |
ARG | 定义构建镜像过程中使用的变量 |
LABEL | 标记镜像信息,添加元数据 |
EXPOSE | 通知 Docker 容器在运行时监听指定的网络端口 |
ENV | 指定环境变量 |
ENTRYPOINT | 指定镜像的默认入口命令 |
VOLUME | 创建一个数据卷挂载点 |
USER | 指定运行容器时的用户名或 UID |
WORKDIR | 配置工作目录 |
RUN | 运行指定命令 |
CMD | 启动容器时指定默认执行的命令 |
ADD | 添加内容到镜像 |
COPY | 复制内容到镜像 |
ONBUILD | 创建子镜像时指定自动执行的操作指令 |
STOPSIGNAL | 指定退出的信号值 |
HEALTHCHECK | 配置启动容器如何进行健康检查 |
SHELL | 指定默认 shell 类型 |
Docker File:构建文件,定义一切步骤,源代码。
Docker Images:通过DockerFile构建生成镜像。
Docker Container:镜像运行,提供对应的服务的服务器。
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像作者
RUN # 镜像构建时需要运行的命令
ADD # 步骤,添加内容
WORKDIR # 镜像工作目录,启动后默认进入的目录
VOLUME # 挂在目录
EXPOSE # 暴露端口配置
CMD # 指定容器启动的时候要运行的命令,但是只有最后一条命令生效
ENTRYPOINT # 定容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的镜像,Docker File就会运行ONBUILD指令
COPY # 将文件拷贝到镜像中
ENV # 构建镜像的时候设置环境变量
CMD,指定容器启动的时候要运行的命令,但是只有最后一条命令生效。
ENTRYPOINT,定容器启动的时候要运行的命令,可以追加命令。
案例:
# 编写DockerFile文件
─$ cat mydockerfile-centos
FROM centos
MAINTAINER bruce<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo ">_<Build Finished!>_<"
CMD /bin/bash
┌──(kali㉿kali)-[~/Downloads/DockerFile]
-------------------------------
# 构建镜像
docker build -f mydockerfile-centos -t mycentos:1.0 .
...
---> 75a7933a8baa
Step 9/10 : CMD echo ">_<Build Finished!>_<"
---> Running in 24c77aa84098
Removing intermediate container 24c77aa84098
---> d68d047cfbe4
Step 10/10 : CMD /bin/bash
---> Running in 2ccc6f403972
Removing intermediate container 2ccc6f403972
---> 77b69e77eecd
Successfully built 77b69e77eecd
Successfully tagged mycentos:1.0
---------------------
┌──(root㉿kali)-[/home/kali/Downloads/DockerFile]
└─# docker images # 查看当前构建的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 77b69e77eecd About a minute ago 740MB
centos latest 328edcd84f1b 6 years ago 193MB
mysql 5.7 9e64176cd8a2 7 years ago 407MB
=====================================
(root㉿kali)-[/home/kali/Downloads/DockerFile]
└─# docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
77b69e77eecd 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
d68d047cfbe4 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
75a7933a8baa 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
50a7cdc0f2c0 7 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
ad88fb98bb76 7 minutes ago /bin/sh -c yum -y install net-tools 246MB
68c0e83cfddf 7 minutes ago /bin/sh -c yum -y install vim 301MB
c11b7dee7543 7 minutes ago /bin/sh -c #(nop) WORKDIR /MYPATH 0B
00dab235bdb2 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
066eeecab682 7 minutes ago /bin/sh -c #(nop) MAINTAINER bruce<bruce@ha… 0B
328edcd84f1b 6 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 6 years ago /bin/sh -c #(nop) ADD file:63492ba809361c51e… 193MB
docker build命令官方文档:https://docs.docker.com/reference/cli/docker/image/build/
docker build .
- 指定 PATH 为 . ,因此本地目录中的所有文件都会被延迟并发送到 Docker 守护程序
- PATH 指定在哪里可以找到 Docker 守护程序上构建的“上下文”的文件
- 请记住,守护进程可以在远程机器上运行,并且不会在客户端(运行 docker build 的地方)解析 Dockerfile
- 这意味着 PATH 中的所有文件都会被发送,而不仅仅是 Dockerfile 中列出的 ADD 文件
- 当看到 Sending build context 消息时,docker 客户端的意思是将上下文从本地机器传输到 Docker 守护进程。
将一个空目录作为上下文起点,并将 Dockerfile 保存在该目录中,仅添加构建 Dockerfile 所需的文件。
Dockerfile的官方文件夹命名:****Dockerfile
┌──(root㉿kali)-[/home/kali/Downloads]
└─# ls
Dockerfile DockerVolume
Docker网络
┌──(root㉿kali)-[/home/kali/Downloads/Dockerfile]
└─# ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:ae:f8:90:c9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:aeff:fef8:90c9/64 scope link
valid_lft forever preferred_lft forever
┌──(root㉿kali)-[/home/kali/Downloads/Dockerfile]
└─#
================================
- 默认网络模式(bridge):
Docker 默认使用 bridge 网络模式,创建一个名为 docker0 的虚拟网桥,并为每个容器分配一个 IP 地址。容器间可以通过 IP 地址相互通信 。
- 主机模式(host):
使用主机模式时,容器直接使用宿主机的网络,与宿主机共享网络接口。容器的网络配置与宿主机相同,可以通过宿主机的 IP 地址直接访问容器。
- 容器间通信:
Docker 提供了容器间通信的功能,可以通过容器名称或 IP 地址进行通信。例如,可以使用容器名称作为主机名,在容器间建立连接。
- 端口映射(Port Mapping):
Docker 允许将容器内的端口映射到宿主机的端口上,以便容器服务可以通过宿主机 IP 和端口访问。可以使用 -p 或 --publish 参数来指定映射规则。
- 自定义网络(Custom Networks):
Docker 允许创建自定义网络,以便在一个自定义的网络中连接多个容器。自定义网络可以提供更好的隔离和网络管理。可以使用 docker network create 命令创建自定义网络。
- DNS 解析:
Docker 提供了内置的 DNS 服务,容器可以使用容器名称作为主机名进行 DNS 解析。容器可以通过主机名访问其他容器或外部服务
每启动一个容器,Docker都会给容器分配一个IP,只要安装了Docker,都会新增一个网卡docker0,默认桥接模式,使用的是evth-pair技术,流量都会经过docker0网卡。
网卡都是成对的新增。
# ==================================================
bridge:桥接(docker默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的很少,不建议使用,局限性很大)
# ==================================================
┌──(root㉿kali)-[/home/kali]
└─# docker run -td --name="bruce-centos-demo01" --net bridge centos:latest
09063829f0ee2a55167df960fc58acf5ed4be5b3aad2398ead61fa82e53e04d7
- 自定义网络
**docker network**
命令用法
自定义的网络,docker帮我们维护好了对应的关系,docker0则没有这个功能。
只要在一个网络中,就能保证互联互通。
# docker network create --help
# --driver bridge
# --subnet 172.31.0.0/24 172.31.0.2--->172.31.0.255
# --gateway 172.31.0.1
docker network create --driver bridge --subnet 172.31.0.0/24 --gateway 172.31.0.1 bruce-network
------------------
┌──(root㉿kali)-[/home/kali]
└─# docker network create --driver bridge --subnet 172.31.0.0/24 --gateway 172.31.0.1 bruce-network
3873249efb7dd0de76c453e590e3391aee8cd28849ff07da9fc9dc607bc3785c
┌──(root㉿kali)-[/home/kali]
└─# docker network ls
NETWORK ID NAME DRIVER SCOPE
10bb7463d8a8 bridge bridge local
3873249efb7d bruce-network bridge local
840550a945ee host host local
f531b596f6b0 none null local
┌──(root㉿kali)-[/home/kali]
└─# docker network inspect bruce-network
--------------------------
容器与网络之间互联
一个容器连接绑定两个网络,那么此容器就与该网络下的容器互通,本容器将会有两个IP。
docket network connect [可选选项] 网络 容器
┌──(root㉿kali)-[/home/kali]
└─# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
┌──(root㉿kali)-[/home/kali]
└─#
┌──(root㉿kali)-[/home/kali]
└─# docker network connect -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
┌──(root㉿kali)-[/home/kali]
└─#
标签:bin,容器,--,kali,网卡,镜像,Docker,docker
From: https://blog.csdn.net/taxuebufeng/article/details/141063973