什么是docker
Docker 是一种开源的平台即服务(PaaS)工具,用于轻松地在容器中构建、打包、部署和管理应用程序。通过 Docker,开发人员可以将应用程序与其依赖项打包到一个称为容器的独立运行环境中,并在任何支持 Docker 的环境中运行这些容器。这种轻量级的虚拟化技术使得应用程序在不同环境中的部署更加简单、快速和一致。
以下是 Docker 的一些关键概念和特点:
- 容器(Container):容器是一个独立运行的应用程序及其依赖项的封装,它们共享主机操作系统的内核,但在独立的用户空间中运行。容器可以快速启动、停止和迁移,提供了一种轻量级、可移植的部署方式。
- 镜像(Image):镜像是容器的模板,包含了运行容器所需的文件系统、代码和依赖项。通过 Docker 镜像,可以快速创建和部署多个相同的容器实例。
- Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责构建、运行和管理容器。它包括 Docker 守护进程(daemon)、客户端(client)和一系列工具。
- Docker Compose:Docker Compose 是 Docker 的一个工具,用于定义和运行多个容器组成的应用程序。通过一个单独的配置文件,可以定义应用程序的服务、网络设置等,简化了多容器应用程序的管理。
- Docker Hub:Docker Hub 是一个集中存储 Docker 镜像的公共注册表,开发人员可以在其中找到并分享各种镜像。同时,也可以在 Docker Hub 上构建私有镜像仓库。
通过 Docker,开发团队可以实现快速部署、扩展和管理应用程序,提高开发效率和应用程序的可移植性。它已经成为现代软件开发中不可或缺的一部分。
Docker CE 和 Docker EE 是 Docker 公司提供的两个不同版本的 Docker 软件,Docker CE 是面向个人开发者、小型团队和中小型企业的免费版本,目前我们经常使用的版本是docker-ce。
Docker CE的安装
ubuntu系统安装(参考清华镜像站和阿里镜像站)
1. 更新系统:使用以下命令更新 Ubuntu 系统的软件包列表和已安装软件的版本:
sudo apt update
sudo apt upgrade
2. 安装依赖库:执行以下命令安装 Docker 所需的依赖库:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
3. 添加 Docker 官方 GPG 密钥:通过以下命令添加 Docker 官方 GPG 密钥以验证下载软件包的完整性:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4. 添加 Docker 软件源:执行以下命令添加 Docker 软件源到系统的软件源列表中:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 更新软件包列表:运行以下命令更新软件包列表,使系统能够识别 Docker 软件源中的软件包:
sudo apt update
6. 安装 Docker Engine:使用以下命令安装 Docker Engine:
sudo apt install docker-ce docker-ce-cli containerd.io
7. 验证安装:执行以下命令验证 Docker 是否已成功安装并正在运行:docker version
。
centos系统安装(参考清华镜像站和阿里镜像站)
如果你之前安装过 docker,请先删掉
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装依赖,下载 repo 文件,并把软件仓库地址替换为镜像站:
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
最后安装:
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动 docker 并设置自动启动
systemctl start docker
systemctl enable docker
docker容器和镜像展示如下图:
Docker Compose安装
- Docker Compose 是 Docker 官方提供的工具,用于定义和运行多个 Docker 容器的应用。
- 它使用 YAML 格式的文件来定义应用的服务、网络和卷等配置信息。
- Docker Compose 允许你通过一个单独的命令(
docker-compose up
)启动整个应用,并可以轻松管理多个容器之间的依赖关系和通信。
安装
参考:如何在 Ubuntu 22.04 LTS 中安装 Docker 和 Docker Compose | Linux 中国 – 知乎 (zhihu.com)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果有更新版本,只需要将上述命令中的 v2.6.1
替换为最新的版本号即可。请不要忘记数字前的 “v” 。
最后,使用下列命令赋予二进制文件可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
验证:docker-compose version
。
YAML文件解析
version: '3'
services:
project1:
image: images:tag #镜像
container_name: containerName #定义容器名称
restart: always #开机启动,失败也会一直重启
environment:
MYSQL_ROOT_PASSWORD : 123456
MYSQL_USER : root
MYSQL_PASSWORD : 123456
MYSQL_DATABASE : project1
volumes:
- ./storage/:/var/www/html #挂载项目文件
ports:
- 9200:9200
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- project2 #project1在project2启动之后再启动
networks:
- net #自定义网络
networks:
net:
driver: bridge
参数说明:
version
:为了方便帮助我们记录这个docker-compose.yml是什么版本,并不参与docker的实际进程;image
:指定镜像,会从docker hub自动下载;container_name
:容器名,不指定会有默认;restart
:指定容器开机自启;有两种形式,下文详解;volumes
:设置持久化,将容器目录映射到宿主机目录;ports
:指定端口映射。links
:depends_on
:有多个容器项目时,指定容器启动顺序;networks
:容器网络,不指定时默认为项目目录名_default
,项目目录名是指你的docker-compose.yml所在的文件夹名称。显示定义网络也会默认使用项目目录名作为前缀加上_
,然后再加上你指定的网络名称,如上文件网络名为:项目目录名_net
;driver: bridge
:指定网络的模式。
docker-compose.yml文件中容器自启设置有两种,区别如下:
restart : unless-stopped
:容器意外停止或退出时,Docker 会重新启动容器
restart : always
:无论容器是如何停止的,都会自动重新启动【即使是手动停止的】
容器启动
docker-compose up 和 docker-compose up -d 都用于启动 Docker Compose 中定义的服务,但它们之间有一些区别:
docker-compose up
:这个命令会启动 Docker Compose 文件中定义的所有服务,并在终端中实时输出它们的日志。当你使用此命令时,你可以看到每个服务的输出,以便及时了解它们的状态和日志信息。通常在开发或调试过程中使用,因为可以即时查看服务的输出。
docker-compose up -d
:这个命令也会启动 Docker Compose 文件中定义的所有服务,但是使用 -d 参数,它会在后台运行服务,不会将服务的输出显示在终端上。与 docker-compose up 不同,它不会实时输出服务的日志信息,而是将服务放在后台运行。
通常在生产环境中使用,因为在生产环境中通常不需要即时查看服务的日志,而是希望服务在后台默默地运行。
总的来说,docker-compose up 更适合开发和调试,而 docker-compose up -d 更适合生产环境中的部署。
要完全关闭堆栈并删除所有持久化数据,请使用以下 Docker Compose 命令:
docker-compose down -v
Docker基本命令
帮助命令
docker version #显示docker详细信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #docker帮助命令手册
镜像命令
docker images #查看所有本地主机的镜像
docker search 镜像名 #搜索镜像
docker pull 镜像名 [标签] #下载镜像(如果不写tag,默认是latest)
docker rmi 镜像名 [标签] #删除镜像 docker rmi -f $(docker images -aq) 删除全部镜像
docker tag 镜像名:版本 新镜像名:版本 #复制镜像并且修改名称
docker inspect <镜像名:tag> #查看镜像的详细信息
docker commit -a "xxx" -c "xxx" 镜像ID 名字:版本 #提交镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
#提交镜像,根据现有镜像生成自己的镜像
docker commit -a "xiemuhou" -m "yes.i do" 647c38921d6f tomcat02:1.0
docker load -i /xxx/xxx.tar #导入镜像
docker save -o /xxx/xxx.tar #保存一个镜像为一个tar包
容器命令
docker build #创建镜像 -f:指定dockerfile文件路径 -t:镜像名字以及标签
docker logs 容器实例的ID #查看容器日志
docker rename 旧名字 新名字 # 给容器重新命名
docker top 容器实例的ID #查看容器内进程
docker ps -a #列出所有容器(不加-a就是在运行的)
docker rm 容器实例的ID #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill 容器实例的ID #杀掉容器
docker history 容器实例的ID #查看docker镜像的变更历史
docker start 容器实例的ID #启动容器
docker restart 容器实例的ID #重启容器
docker stop 容器实例的ID #停止正在运行的容器
docker attach /docker exec 容器实例的ID #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会启动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect 容器名称:容器标签 #查看容器内源数据
docker cp 容器id:容器内路径 目的主机路径 #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
docker stop $(docker ps -aq) #停止所有容器
docker rm $(docker ps -aq) #删除所有容器
exit #直接退出容器
crlt + P + Q #退出容器但是不终止运行
其他命令
查询容器最后20条日志:
docker logs <app> --tail=20 -f
查询docker-compose应用最后20条日志(需要在Docker-compose.yml文件同级目录下):
docker-compose logs --tail=20 -f
计算目前正在运行的容器数量:
echo "Docker Running $(expr $(docker ps --all --format "table {{.Names}} {{.Status}} " -f status=running | wc -l) - 1)"
Docker常用设置
拉取镜像
docker pull [options] NAME:[TAG]
,通过此命令可以从docker远程仓库拉取镜像到本地.
name
是拉取镜像的名称,TAG
表示是可选的,如果不选表明时latest,如果选择表明是指定版本的options
是拉去的一些参数
例:docker pull celaraze/chemex:latest
启动容器
docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
#参数说明
--name = "Name" 容器名字
-c 后面跟待完成的命令
-d 以后台方式运行并且返回ID,启动守护进程式容器
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
-p 指定容器端口 -p 物理机端口:容器端口 映射端口
-P 随机指定端口
-v 给容器挂载存储卷
大家注意-i 、 -t 、 -d这几个参数。一般it连用表示给我一个可以操作的前台终端。第二个呢就是id,以后台守护进程的方式运行容器。这样,我们就可以总结出两种运行容器的命令模式。
第一种:交互方式创建容器,退出后容器关闭。
docker run -it 镜像名称:标签 /bin/bash
第二种:守护进程方式创建容器。
docker run -id 镜像名称:标签
通过这种方式创建的容器,我们不会直接进入到容器界面,而是在后台运行了容器,
如果我们需要进去,则还需要一个命令。
docker exec -it 镜像名称:标签 /bin/bash
通过这种方式运行的容器,就不会自动退出了。
示例:
docker run -itd --name mysql-chemex --restart=always --net=host -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
命令说明如下:
-itd
:以交互式、终端和守护进程模式启动容器;--name mysql-chemex
:指定容器的名称为 mysql-chemex;--restart=always
:当容器退出时,自动重启容器;--net=host
:使用主机网络模式,容器将共享主机的网络栈;-p 3307:3306
:将容器的 3306 端口映射到主机的 3307 端口;如果有多个mysql,可以将3306端口映射到不同的主机端口-e MYSQL_ROOT_PASSWORD=123456
:设置 MySQL 的 root 用户密码为 123456;mysql
:指定要运行的镜像为 MySQL
进入容器
语法:docker exec -it 容器ID(容器名) /bin/bash
- -i, –interactive:保持标准输入打开,即使没有附加到容器上。这允许您与容器进行交互。
- -t, –tty:分配一个伪终端(pseudo-TTY),并将其连接到容器的标准输入。这使得可以在容器内部执行命令,就好像在本地终端中一样。
文件复制
将文件拷贝到容器内部:docker cp /宿主机文件 容器ID:/容器路径
将文件拷贝到宿主机:docker cp 容器ID:/容器路径 /宿主机文件
容器持久化
语法:docker run -itd --name 容器名 -v 宿主机目录:容器目录 镜像名
例:docker run -v /chemex:/var/www/html/laravel celaraze/chemex
要实现将目录映射到宿主机,你需要在启动容器时就进行目录映射设置。
设置自动重启
创建容器的时候设置容器为自动重启,命令行中加参数 --restart=always
语法:docker run -d --restart=always --name 设置容器名 使用的镜像
例:docker run -d --restart=always --name chemex celaraze/chemex
已有的容器更新为自动重启:docker update --restart=always 容器ID(或者容器名)
docker search命令
作用:搜索镜像,都是发布在docker hub上面的:https://hub.docker.com/
docker search nginx
,从docker hub中搜索docker名为nginx的镜像
name
:代表此镜像的名称description
:此镜像的描述stars
:下载次数official
:是否由官方提供(官方提供可放心下载,可以基于此镜像做自己的镜像)
使用阿里云docker镜像加速器
地址:https://cr.console.aliyun.com,登录,左侧加速器帮助页面会为你显示独立的加速地址,这个加速地址每个人的都不同。
把自己的专属加速地址替换文件所有内容就可以了。
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。
sudo mkdir -p /etc/docker
#创建并写入内容
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<加速器地址>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload #启动配置
sudo systemctl restart docker #重启docker服务
配置好了之后,使用docker info
,查看docker基本信息。查看一下是否新增了阿里云的地址。
镜像和容器的导入导出
.tar
或.tar.gz
格式的镜像文件。对于.zip 格式的文件,你需要先解压缩它,然后再加载解压缩后的镜像文件。load 导入镜像
比如把chemex.tar压缩包导入到镜像中,就需要用到docker load -i
命令。
语法:docker load -i 镜像路径
# 使用 -i 导入
docker load -i chemex.tar
# 使用 < 导入
docker load < chemex.tar
save 导出镜像
# -o /opt/images.tar.gz表示将镜像导出到/opt/images.tar.gz
# nginx:latest busybox:1.35.0表示将这两个镜像都导出在images.tar.gz里
docker save -o /opt/images.tar.gz nginx:latest busybox:1.35.0
# > -o /opt/images_new.tar.gz 表示将镜像导出到/opt/images_new.tar.gz
docker save > /opt/images_new.tar.gz nginx:latest busybox:1.35.0
import 导入容器
语法:docker import [options] file|URL|- [REPOSITORY[:TAG]]
#import导入之后是镜像(image)
docker import chemex-test.tar mychemex:v1.21
export 导出容器
语法:docker export [options] container
export 导出的是容器,不是镜像;save 导出的是镜像,不是容器。如果没有启动的容器,则需要启动容器。
docker export -o chemex-test.tar b6f479620115
区别
1.export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
2.文件大小不同:export 导出的镜像文件体积小于 save 保存的镜像
3.是否可以对镜像重命名
- docker import 可以为镜像指定新名称
- docker load 不能对载入的镜像重命名
4.是否可以同时将多个镜像打包到一个文件中
- docker export 不支持
- docker save 支持
5.是否包含镜像历史
- export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作
- 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
6.应用场景不同
- docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
- docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
Docker容器数据卷
容器数据卷介绍
docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷。
它还存在以下几种特点:
- 数据卷可在容器之间共享或者重用数据。
- 卷中的更改可以直接生效。
- 数据卷中的更改不会包含在镜像的更新中。
- 数据卷的生命周期一直持续到没有容器使用它为止。
语法:docker run -it -v 主机目录:容器目录
说明:主机目录会自动创建,两个目录是同步的状态,在任一目录中修改文件,都会同步至另一文件。
查看是否挂载成功:docker inspect 容器ID
找到这个Mounts
,它代表着挂载,type
是类型(绑定),source
是源(/cat/www)
,也就是把什么挂载到哪里(宿主机目录)。destination(/var/www)
就是挂载的目标路径了(容器目录)。
具名挂载与匿名挂载
查看所有卷的情况:docker volume ls
匿名挂载:docker run -d -P --name=nginx01 -v /etc/nginx nginx
将容器目录:/etc/nginx
挂载到宿主机:/var/lib/docker/volumes/
下。如下图:
具名挂载:docker run -d -P --name=nginx02 -v jumingguazai:/etc/nginx nginx
如何确定是具名挂载还是匿名挂载:
-v 容器内路径
:匿名挂载;
-v 卷名:容器内路径
:具名挂载;
-v /宿主机路径:容器内路径
:指定路径挂载。
拓展
通过-v 容器内路径:ro rw
可以改变读写权限
ro:readonly,即容器可以读取该目录中的文件,但不能往其中写入新文件或修改已有文件。
rw:readwrite,可写可读。
例:docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx
docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx
Dockerfile
什么是Dockerfile?
Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明,每条指令构建一层,通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容,就是描述该层如何构建。有了Dockefile,就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令,就可生成docker 镜像。
Dockerfile构建过程
docker容器、dockerfile、docker镜像的关系:
- dockerfile是面向开发的,发布项目做镜像的时候就要编写dockerfile文件。
- dockerfile:构建文件,定义了一切的步骤,源代码。
- dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品。
- docker容器:容器就是镜像运行起来提供服务的。
Dockerfile 指令选项
Dockerfile 指令选项:
FROM #基础镜像 。 (centos)
MAINTAINER #镜像的作者和邮箱。(已被弃用,结尾介绍代替词)
RUN #镜像构建的时候需要执行的命令。
CMD #类似于 RUN 指令,用于运行程序(只有最后一个会生效,可被替代)
EXPOSE #对外开放的端口。
ENV #设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ADD # 步骤:tomcat镜像,这个tomcat压缩包。添加内容。
COPY #复制指令,将文件拷贝到镜像中。
VOLUME #设置卷,挂载的主机目录。
USER #用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
WORKDIR #工作目录(类似CD命令)。
ENTRYPOINT #类似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,会追加命令。
ONBUILD #当构建一个被继承Dokcerfile,就会运行ONBUILD的指令。触发执行。
注意:CMD类似于RUN指令,用于运行程序,但二者运行的时间点不同:
CMD在docker run时运行。
RUN是在docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。
如果Dockerfile中如果存在多个CMD指令,仅最后一个生效。
LABEL(MAINTALNER已经被弃用了,目前是使用LABEL代替)
LABEL指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"
docker history <image名称>
:查看dockerfile制作镜像所执行的步骤
实战测试:制作镜像并且发布外网
注册docker hub 账号
服务器上使用命令行登录
docker login -u [账号名字]
#登陆命令
docker logout
#退出命令
看到Lgin Succeeded,就表示我们登陆成功了。
构建镜像
创建工作目录
mkdir dockerfile
编写dockerfile
首先,我们知道官方默认的镜像,比如centos镜像里面,没有vim、ifconfig等命令,因此我们可以创建一个拥有这些命令的镜像,然后打包发布到外网,别人就可以直接使用。
创建一个配置文件:vim mydockerfile
。
FROM centos:7
LABEL maintainer="xiemuhou<xiemuhou@gmail.com>"
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y update && \
yum -y install vim-enhanced && \
yum install -y net-tools
EXPOSE 80
#如果Dockerfile中如果存在多个CMD指令,仅最后一个生效,没有验证过
CMD echo #MYPATH
CMD echo "------------END-------------"
CMD ["/bin/bash"]
构建dockerfile
在工作目录下执行以下命令,注意最后面有一个.
。
docker build -f mydockerfile -t mycentos:2.0 .
到这里,我们就制作好了我们自己的镜像。现在再启动我们自己制作的镜像,进去看看我们写的dockerfile都生效了没有(vim、ifconfig命令是否能运行)。
注:不加标签默认是latest,所以docker run的时候要带上镜像标签,因为我们上面带了2.0的版本号。
docker run -it --name mycentos02 mycentos:2.0
生成容器并且进入容器,当然我们也可以用:docker exec -it mycentos02 /bin/bash
进入容器
同时,我们可以用docker history <image名称>
命令来进一步验证dockerfile的构建过程。
推送镜像至docker hub
官方文档要求,我们推送的镜像名字必须是YOUR_DOCKER_HUB_ID/XXXX
,所以我们需要给镜像换一个名字。
docker tag
镜像名:版本 新镜像名:版本
#复制镜像并且修改名称
docker tag mycentos:2.0 xiemuhou/mytomcat
#复制的镜像没有指定版本(tag)
docker pull 镜像名 [标签]
#下载镜像(如果不写tag,默认是latest)
docker push xiemuhou/mytomcat
#下载到docker hub
登陆docker hub就可以看到我们刚刚推送上去的镜像了,所有人都可以通过网络安装我的容器了。
docker网络
三种网络类型:
- Bridge模式:要使容器内的端口可以在主机上访问到,需要进行端口映射。
- Host模式:docker上使用网络和在主机上使用网络是一样的。
- None模式:也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯。
查询host网络类型的容器
特点:
- 在 Host 模式下,容器与主机共享网络命名空间,容器直接使用主机的网络接口(IP 地址、端口等),因此容器与主机之间的网络通信非常高效。
- 容器使用主机的网络配置,与主机上的服务相同网络环境,因此容器可以轻松访问主机上的服务并且不需要进行端口映射。
- 由于容器直接使用主机网络,所以在主机上已经存在的端口无法被容器再次使用。
查看网卡详细信息:docker network inspect host
查询bridge网络类型的容器
特点:
- 在 Bridge 模式下,Docker 会为每个容器创建一个独立的网络命名空间,并使用 Docker 守护进程作为网桥来实现容器之间的通信。
- 每个容器都有自己的 IP 地址,容器之间可以通过网络进行通信,但默认情况下需要进行端口映射才能让外部网络访问到容器内部的服务。
- Bridge 网络模式是 Docker 默认的网络模式,在这种模式下,Docker 会为容器创建一个虚拟网络并分配 IP 地址。
查看网卡详细信息:docker network inspect bridge
Host 模式和 Bridge 模式的容器可以互通,即使用 Host 模式的容器可以直接访问使用 Bridge 模式的容器,反之亦然。这是因为它们都处于同一个 Docker 守护进程管理的网络环境下,只是网络配置不同而已。
veth-pair技术
veth-pair就是一堆的虚拟设备接口,他们都是成对出现的,一端连接着协议,一端连接着彼此。使得它充当了一个桥梁的作用。host网络模式下容器已经与宿主机共享了同一个网络命名空间,所以veth-pair技术不会产生预期效果。
以下使用tomcat7镜像作为测试对象,因为tomcat7自带ip addr等常用命令。
查看本机网卡信息:ip addr
查看容器的网卡信息:docker exec -it tomcat01 ip addr
理解:我们每启动一个docker容器,docker就会给docker容器分配一个ip,安装docker之后,会产生一个叫docker0的网卡,这里使用的就是veth-pair技术。
启动容器后也会产生对应的网卡,并且是成对存在的,容器内的42对应着宿主机的43,容器内的44对应宿主机的45,等等以此类推。
docker网络模式
列出docker网卡:docker network ls
创建自定义网络的容器
我们直接启动命令, –net bridge,就是docker0(默认)
docker0特点:默认,域名不能访问,–link不建议使用
下面我们自己来创建一个bridge
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 testnet
验证:docker network ls
,会发现多了一个网卡testnet
,可以将容器发布在自己创建的网络里。
docker run -d -P --name=tomcat01-net --net=testnet tomcat:7
docker run -d -P --name=tomcat02-net --net testnet tomcat:7
自定义的网络,修复了docker0的缺点之一:不能通过域名访问。
docker exec -it tomcat01-net ping -c 3 IP地址
docker exec -it tomcat01-net ping -c 3 tomcat02-net
提示,ping -c可以自定义ping的次数。
国内访问 Docker 镜像拉取速度慢及拉取失败的问题
Docker官方源很早之前就被官方封禁了,国内拉取 Docker 镜像必须依赖国内镜像源:如:阿里、清华、网易,但是最近国内的镜像源好像也不行,经常会拉取失败。所以在网上找了一些暂时还能用的镜像源。
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors":[
"https://docker.m.daocloud.io",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://docker.1panel.live",
"https://docker.agsv.top",
"https://docker.agsvpt.work",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://mirror.ccs.tencentyun.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://status.1panel.top"]
}
EOF
重载Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
参考文章
docker入门,这一篇就够了。_docker学习-CSDN博客
docker–导出镜像 save/export、导入镜像 load/import -阿里云开发者社区 (aliyun.com)
评论