docker笔记
一、docker简介
1.什么是docker
Docker 是一个开源的应用容器引擎,由于docker影响巨大,今天也用"Docker" 指代容器化技术。
无论是单个程序还是多个程序组成的复杂服务,或者分布式系统,都可以使用 docker run 或 docker compose up命令一键部署,省去了大量搭建、配置环境、调试和排查错误的时间。
一次打包,到处运行
Docker 为容器创建了行业标准,使容器成为了软件交付过程中的一种标准化格式,将软打包成容器镜(image),能够使软件在不同环境下运行一致,应用程序可以快速可靠地从一个环境移植到另外一个环境,并确保在所有的部署目标(例如开发、测试、生产环境)上都按预期运行,从而避免了“在我电脑上是好的,怎么到你那却不能用了?”的问题。
3.容器与虚拟机
容器包括应用程序及其所有依赖项。容器运行时,与宿主机共享操作系统内核,容器在linux内核层面(使用 Cgroups 和 namespaces)来实现进程间的隔离,容器在主机操作系统上的用户空间中作为独立进程运行。
因此,容器相比于虚拟机更加轻量化,它体积小,启动快,占用资源少,性能好。
虚拟机使用虚拟化技术,应用程序运行在完整的操作系统(OS)之上,因此占用的资源更多,安装更复杂。
但是由于容器与宿主机共享内核,所以在隔离性和安全性方面不如虚拟机。
因此,容器相比于虚拟机更加轻量化,它体积小,启动快,占用资源少,性能好。
虚拟机使用虚拟化技术,应用程序运行在完整的操作系统(OS)之上,因此占用的资源更多,安装更复杂。
但是由于容器与宿主机共享内核,所以在隔离性和安全性方面不如虚拟机。
二、安装docker
1.Windows下安装Docker
容器主要使用linux内核技术,因此Windows下安装docker可能会有遇到各种问题,建议刚入门的同学先在linux虚拟机里安装docker,学完之后在windows下安装,免得遇到问题后,还没入门就放弃了。
2.linux下安装Docker
安装环境:CentOS 7.3+
如果之前安装了旧版docker,请先删除。
新建/etc/docker/daemon.json文件,输入如下内容:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://fsp2sfpr.mirror.aliyuncs.com/"
]
}
sudo systemctl restart docker
sudo systemctl enable docker
sudo systemctl enable containerd
三、docker run 开箱即用
1.docker架构
registry 镜像仓库
registry可以理解为镜像仓库,用于保存docker image。
Docker Hub 是docker官方的镜像仓库,docker命令默认从docker hub中拉取镜像。我们也可以搭建自己的镜像仓库。
registry可以理解为镜像仓库,用于保存docker image。
Docker Hub 是docker官方的镜像仓库,docker命令默认从docker hub中拉取镜像。我们也可以搭建自己的镜像仓库。
image 镜像
image可以理解为一个只读的应用模板。image包含了应用程序及其所需要的依赖环境,例如可执行文件、环境变量、初始化脚本、启动命令等。
container 容器
容器是image的一个运行实例。当我们运行一个image,就创建了一个容器。
2.docker pull 拉取镜像
从镜像仓库拉取镜像到本地
使用docker images命令查看本地镜像
docker pull nginx 不写默认是latest
docker pull nginx:latest
docker pull nginx:1.22
docker pull nginx:1.22.0-alpine
一般不建议使用latest,因为最新的镜像是滚动更新的,过一段时间,可能跟你本地的不是同一个。使用docker images命令查看本地镜像
3.docker run 命令
docker run [可选参数] 镜像名:版本 []
公开端口:-p 宿主机ip:容器ip
默认情况下,容器无法通过外部网络访问。需要使用-p参数将容器的端口映射到宿主机端口,才可以通过宿主机IP进行访问。浏览器打开 http://192.168.56.106:8080
docker run --name some-nginx -d -p 8080:80 nginx:1.22
默认情况下,容器无法通过外部网络访问。需要使用-p参数将容器的端口映射到宿主机端口,才可以通过宿主机IP进行访问。浏览器打开 http://192.168.56.106:8080
-p 8080-8090:8080-8090 公开端口范围,前后必须对应
-p 192.168.56.106:8080:80 如果宿主机有多个ip,可以指定绑定到哪个ip
docker run --name db-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
使用run命令,部署mysql,docker先去本地查找镜像,如果找不到,就去docker hub中拉取镜像
●--name 定义容器的名称
●-e 声明环境变量
●-d容器在后台运行
●查看容器ip
●-e 声明环境变量
●-d容器在后台运行
●查看容器ip
docker start db-mysql 启动容器
docker stop 关闭容器
docker restart 重启容器
docker rm 删除容器
创建一个新的容器,使用mysql客户端docker run -it --rm mysql:5.7 mysql -h172.17.0.2 -uroot -p
-it 使用交互模式,可以在控制台里输入、输出
--rm在容器退出时自动删除容器。一般在使用客户端程序时使用此参数。
如果每次使用客户端都创建一个新的容器,这样将占用大量的系统空间。其中mysql -h172.17.0.2 -uroot -p
表示启动容器时执行的命令。
docker exec
在运行的容器中执行命令,一般配合-it参数使用交互模式,docker exec -it db-mysql /bin/bash
常用命令:
●docker ps -a 查看所有容器,包括正在运行和停止的
●docker inspect 查看容器的信息
●docker logs查看日志
●docker cp 在容器和宿主机间复制文件
四、docker 网络
默认网络
docker会自动创建三个网络,bridge,host,none
bridge桥接网络
如果不指定,新创建的容器默认将连接到bridge网络。
默认情况下,使用bridge网络,宿主机可以ping通容器ip,容器中也能ping通宿主机。
容器之间只能通过 IP 地址相互访问,由于容器的ip会随着启动顺序发生变化,因此不推荐使用ip访问。
host
慎用,可能会有安全问题。
容器与宿主机共享网络,不需要映射端口即可通过宿主机IP访问。(-p选项会被忽略)
主机模式网络可用于优化性能,在容器需要处理大量端口的情况下,它不需要网络地址转换 (NAT),并且不会为每个端口创建“用户空间代理”。
none
禁用容器中所用网络,在启动容器时使用。
用户自定义网络
创建用户自定义网络
用户自定义网络使用 Docker 的嵌入式 DNS 服务器将容器名解析成 IP。
docker network create my-net
将已有容器连接到此网络docker network connect my-net db-mysql
创建容器时指定网络。docker run -it --rm --network my-net mysql:5.7 mysql -hdb-mysql -uroot -p
在用户自定义网络上,容器之间可以通过容器名进行访问。用户自定义网络使用 Docker 的嵌入式 DNS 服务器将容器名解析成 IP。
主机名解析
hostname
容器的hostname默认为容器的 ID。
docker run -it -d --hostname my-alpine --name my-alpine alpine:3.15
docker inspect \
--format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-alpine
要是/etc/hosts修改生效,使用--add-host
docker run --add-host=my-alpine:172.17.0.3 -it --rm alpine:3.15
五、docker存储
将数据存储在容器中,一旦容器被删除,数据也会被删除。同时也会使容器变得越来越大,不方便恢复和迁移。
将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容器里,就可以快速的恢复。
将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容器里,就可以快速的恢复。
存储方式
docker 提供了以下存储选项
volume 卷
卷存储在主机文件系统分配一块专有存储区域,由 Docker(在 Linux 上)管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分。卷是在 Docker 中持久保存数据的最佳方式
bind mount 绑定挂载
绑定挂载可以将主机文件系统上目录或文件装载到容器中,但是主机上的非 Docker 进程可以修改它们,同时在容器中也可以更改主机文件系统,包括创建、修改或删除文件或目录,使用不当,可能会带来安全隐患
tmpfs 临时挂载
tmpfs挂载仅存储在主机系统的内存中,从不写入主机系统的文件系统。当容器停止时,数据将被删除。
绑定挂载(bind mount)
绑定挂载适用以下场景:
●将配置文件从主机共享到容器。
●在 Docker 主机上的开发环境和容器之间共享源代码或编译目录。
○例如,可以将 Maven 的target/目录挂载到容器中,每次在主机上用 Maven打包项目时,容器内都可以使用新编译的程序包。
●将配置文件从主机共享到容器。
●在 Docker 主机上的开发环境和容器之间共享源代码或编译目录。
○例如,可以将 Maven 的target/目录挂载到容器中,每次在主机上用 Maven打包项目时,容器内都可以使用新编译的程序包。
-v
绑定挂载将主机上的目录或者文件装载到容器中。绑定挂载会覆盖容器中的目录或文件。如果宿主机目录不存在,docker会自动创建这个目录。但是docker只自动创建文件夹,不会创建文件。
例如,mysql的配置文件和数据存储目录使用主机的目录。可以将配置文件设置为只读(read-only)防止容器更改主机中的文件。
●卷可以在多个正在运行的容器之间共享数据。仅当显式删除卷时,才会删除卷。
●当你想要将容器数据存储在外部网络存储上或云提供商上,而不是本地时。
●卷更容易备份或迁移,当您需要备份、还原数据或将数据从一个 Docker 主机迁移到另一个 Docker 主机时,卷是更好的选择。
绑定挂载将主机上的目录或者文件装载到容器中。绑定挂载会覆盖容器中的目录或文件。如果宿主机目录不存在,docker会自动创建这个目录。但是docker只自动创建文件夹,不会创建文件。
例如,mysql的配置文件和数据存储目录使用主机的目录。可以将配置文件设置为只读(read-only)防止容器更改主机中的文件。
tmpfs 临时挂载
volume卷
●当你想要将容器数据存储在外部网络存储上或云提供商上,而不是本地时。
●卷更容易备份或迁移,当您需要备份、还原数据或将数据从一个 Docker 主机迁移到另一个 Docker 主机时,卷是更好的选择。
创建和挂载卷:
创建nfs卷
posted on 2022-11-24 16:49 passionConstant 阅读(97) 评论(0) 编辑 收藏 举报