Python开发加薪利器之Docker的使用实践
目录
- 1. Docker概述
- 1.1 虚拟机技术VS容器化技术
- 1.2 名词概念
- 2. Docker安装
- 2.1 环境查看
- 2.2 卸载旧的版本
- 2.3 安装必要的包
- 2.4 添加GPG密钥
- 2.6 安装Docker引擎
- 2.7 添加当前用户到 docker 用户组
- 2.9 配置阿里云镜像加速
- 3. Docker run 运行流程图
- 4. Docker工作原理
- 5. Docker常见命令
- 5.1 帮助命令
- 5.2 镜像命令
- 5.3 容器命令
- 5.4 常见其他命令
- 6. 实战
- 6.1 部署Nginx
- 6.2 端口暴露(端口转发)
- 6.3 部署Elasticsearch
- 6.4 可视化 Portainer
- 7. Docker镜像讲解
- 7.1 镜像是什么
- 7.2 Docker镜像加载原理
- 7.3 分层理解
- 7.4 commit镜像
- 总结:
- 8. 容器数据卷
- 8.1 容器数据卷是什么
- 8.2 使用数据卷
- 8.3 实战:安装MySQL
- 8.4 匿名挂载和具名挂载
1. Docker概述
- Docker为什么火,因为十分的轻巧。
- Docker是基于Go语言开发的。
1.1 虚拟机技术VS容器化技术
虚拟机技术:
- 资源占用
- 多冗余步骤多
- 启动慢
1.2 名词概念
镜像(image)
docker镜像好比是一个模版,可以通过这个模版来创建容器服务,mysql镜像==>run==>mysql01容器(提供服务),通过这个镜像可以创建多个容器。
容器(container)
docker利用容器技术,独立运行一个或者一组应用。通过镜像来创建的。
基本命令有启动、停止、删除等。
目前可以把容器理解为就是一个简易的Linux系统。
仓库(repository)
仓库就是存放镜像的地方。仓库分为公有仓库和私有仓库。默认是国外的仓库(DockerHub),国内有阿里云等(配置镜像加速)
2. Docker安装
2.1 环境查看
2.1.1 查看内核版本
uname -r
文章图片
2.1.2 查看系统信息
sudo cat /etc/os-release
文章图片
2.2 卸载旧的版本
sudo apt-get remove docker docker-engine docker.io containerd runc
2.3 安装必要的包
2.3.1 更新apt程序包索引
sudo apt-get update2.3.2 安装必要的包
sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release
2.4 添加GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
上面是官网提供的,但是速度很慢,建议使用阿里云的GPG Key。
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
2.5 添加稳定Docker-ce软件源
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
上面是官网提供的,但是速度很慢,建议使用阿里云提供的。
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release -cs) stable"
注意:添加错了可以用以下命令删除
#查询keyid,下图sudo apt-key list#keyid 就是9DC8那一串sudo apt-key del#加参数-r可以移除sudo add-apt-repository -r "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
文章图片
2.6 安装Docker引擎
2.6.1 安装apt包索引
这样就可以安装Docker Engine和containerd的最新版本
sudo apt-get update
2.6.2 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io
如果要安装指定版本的Docker引擎,在repo中列出可用版本,然后选择安装
apt-cache madison docker-ce
文章图片
sudo apt-get install docker-ce=docker-ce-cli= containerd.io
2.7 添加当前用户到 docker 用户组
添加后,以后就可以不用 sudo 运行 docker 了。
将当前用户添加到 docker 组
sudo gpasswd -a ${USER} docker
重新登录或者用以下命令切换到docker组(建议重启Ubuntu)
newgrp - docker
重启docker服务
sudo service docker restart
不加sudo直接执行docker命令检查效果
docker ps
2.8 测试是否安装成功
首先启动Docker
systemctl start docker
查看Docker版本来判断是否安装成功
docker version
文章图片
2.9 配置阿里云镜像加速
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://eko3tl65.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
3. Docker run 运行流程图
文章图片
4. Docker工作原理 Docker是一个Client·Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,DockerServer接受到DockerClient的指令,就会去执行这个指令。
文章图片
5. Docker常见命令
5.1 帮助命令
# 显示docker的版本信息docker version# 显示docker的系统信息 包括镜像和容器的数量docker info# 帮助命令docker 命令 --help
帮助文档地址:官方文档
5.2 镜像命令
5.2.1 docker images
查看所有本地的主机上的镜像
malulu@malulu:~/桌面$ docker imagesREPOSITORYTAGIMAGE IDCREATEDSIZEnginxlatest519e12e2a84a4 days ago133MBhello-worldlatestd1165f2212345 weeks ago13.3kB# 解释REPOSITORY 镜像的仓库源TAG镜像的标签IMAGE ID 镜像的IDCREATED镜像的创建时间SIZE镜像的大小# 可选项-a, --all# 列出所有镜像-q, --quiet# 只显示镜像的ID
5.2.2 docker search
搜索镜像
文章图片
# 可选项--filter=STARS=3000# 搜索出来的镜像就是STARS大于3000的
文章图片
5.2.3 docker pull
下载镜像
# 下载镜像docker pull 镜像名[:tag]malulu@malulu:~/桌面$ docker pull mysqlUsing default tag: latest# 如果不写tag(版本) 默认就是latestlatest: Pulling from library/mysqlf7ec5a41d630: Already exists # 分层下载 docker image的核心 联合文件系统 9444bb562699: Pull complete 6a4207b96940: Pull complete 181cefd361ce: Pull complete 8a2090759d8a: Pull complete 15f235e0d7ee: Pull complete d870539cd9db: Pull complete 5726073179b6: Pull complete eadfac8b2520: Pull complete f5936a8c3f2b: Pull complete cca8ee89e625: Pull complete 6c79df02586a: Pull complete Digest: sha256:6e0014cdd88092545557dee5e9eb7e1a3c84c9a14ad2418d5f2231e930967a38 # 签名Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest # 真实地址# 下面两条命令等价docker pull mysqldocker pull docker.io/library/mysql:latest# 指定版本下载 必须在仓库有这个版本malulu@malulu:~/桌面$ docker pull mysql:5.75.7: Pulling from library/mysqlf7ec5a41d630: Already exists 9444bb562699: Already exists 6a4207b96940: Already exists 181cefd361ce: Already exists 8a2090759d8a: Already exists 15f235e0d7ee: Already exists d870539cd9db: Already exists 7310c448ab4f: Pull complete 4a72aac2e800: Pull complete b1ab932f17c4: Pull complete 1a985de740ee: Pull complete Digest: sha256:e42a18d0bd0aa746a734a49cbbcc079ccdf6681c474a238d38e79dc0884e0eccStatus: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7
5.2.4 docker rmi
删除镜像
# 删除指定的镜像docker rmi -f 镜像ID# 删除多个镜像docker rmi -f 镜像ID 镜像ID 镜像ID 镜像ID # 删除全部镜像docker rmi -f $(docker images -aq)
5.3 容器命令
说明:我们有了镜像才可以创建容器。
这里下载一个centos镜像来测试学习。
docker pull centos
5.3.1 新建容器并启动
docker run [可选参数] image# 参数说明--name="Name" # 容器名字 mysql01 mysql02 用来区分容器-d# 后台方式运行-it# 使用交互方式运行(需要提供一个控制台) 进入容器查看内容-p# 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用) -p 容器端口 容器端口-P# 随机指定端口# 测试# 启动并进入容器malulu@malulu:~/桌面$ docker run -it centos /bin/bash[root@a8d9ce9627a4 /]# ls # 查看容器内的centos 基础镜像 很多命令都是不完善的binetcliblost+foundmntprocrunsrvtmpvardevhomelib64mediaoptrootsbinsysusr# 从容器中退回主机[root@a8d9ce9627a4 /]# exitexitmalulu@malulu:~/桌面$
5.3.2 列出所有的运行的容器
# 列出当前正在运行的容器docker ps# 可选项-a# 列出当前正在运行的容器 + 历史运行过的容器-n=? # 显示最近创建的n个容器-q# 只显示容器的编号
文章图片
5.3.3 退出容器
exit # 直接停止容器并退出ctrl+P+Q # 容器不停止退出
文章图片
5.3.4 删除容器
# 删除指定的容器 不能删除正在运行的容器 强制删除用rm -fdocker rm 容器ID# 删除所有的容器# 方式一 常用docker rm -f $(docker ps -aq)# 方式二docker ps -a -q|xargs docker rm
5.3.5 启动和停止容器的操作
docker start 容器ID # 启动容器docker restart 容器ID # 重启容器docker stop 容器ID # 停止当前正在运行的容器docker kill 容器ID # 强制删除当前容器
5.4 常见其他命令
5.4.1 后台启动容器
# 后台启动容器docker run -d 镜像名# 比如 后台启动centosdocker run -d centos# 问题 docker ps 时 发现 centos 停止了# 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止# 比如nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
文章图片
5.4.2 查看日志
docker logs -f -t --tail number 容器ID# 可选项 -tf# 显示日志 --tail number # 要显示日志条数# 自己编写一段shell脚本docker run -d centos /bin/sh -c "while true; do echo 666; sleep 1; done"
文章图片
5.4.3 查看容器中进程信息
docker top 容器ID
文章图片
5.4.4 查看镜像的元数据
docker inspect 容器ID
文章图片
5.4.5 进入当前正在运行的容器
我们通常容器都是使用后台方式运行的,有时需要进入容器,修改一些配置
# 方式一# 命令docker exec -it 容器ID bashShell# 测试malulu@malulu:~/桌面$ docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES9ff3b9c7ebd5centos"/bin/sh -c 'while t…"8 seconds agoUp 6 secondslucid_wrightmalulu@malulu:~/桌面$ docker exec -it 9ff3b9c7ebd5 /bin/bash[root@9ff3b9c7ebd5 /]# lsbinetcliblost+foundmntprocrunsrvtmpvardevhomelib64mediaoptrootsbinsysusr[root@9ff3b9c7ebd5 /]# # 方式二docker attach 容器ID# 测试malulu@malulu:~/桌面$ docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES9ff3b9c7ebd5centos"/bin/sh -c 'while t…"8 minutes agoUp 8 minuteslucid_wrightmalulu@malulu:~/桌面$ docker attach 9ff3b9c7ebd5666666666666666666# docker exec # 进入容器后开启一个新的终端 可以在里面操作(常用)# docker attach # 进入容器正在执行的终端 不会启动新的终端
5.4.6 从容器内拷贝文件到主机
注意:是从容器内拷贝到主机。
docker cp 容器Id:容器内路径 目的的主机路径
只要容器存在就可以,跟容器是否运行没有关系。
拷贝是一个手动过程,后面我们使用
-V
数据卷的技术,可以实现自动同步。文章图片
5.4.5 小结
文章图片
attachAttach local standard input, output, and error streams to a running containerbuildBuild an image from a DockerfilecommitCreate a new image from a container's changescpCopy files/folders between a container and the local filesystemcreateCreate a new containerdiffInspect changes to files or directories on a container's filesystemeventsGet real time events from the serverexecRun a command in a running containerexportExport a container's filesystem as a tar archivehistoryShow the history of an imageimagesList imagesimportImport the contents from a tarball to create a filesystem imageinfoDisplay system-wide informationinspectReturn low-level information on Docker objectskillKill one or more running containersloadLoad an image from a tar archive or STDINloginLog in to a Docker registrylogoutLog out from a Docker registrylogsFetch the logs of a containerpausePause all processes within one or more containersportList port mappings or a specific mapping for the containerpsList containerspullPull an image or a repository from a registrypushPush an image or a repository to a registryrenameRename a containerrestartRestart one or more containersrmRemove one or more containersrmiRemove one or more imagesrunRun a command in a new containersaveSave one or more images to a tar archive (streamed to STDOUT by default)searchSearch the Docker Hub for imagesstartStart one or more stopped containersstatsDisplay a live stream of container(s) resource usage statisticsstopStop one or more running containerstagCreate a tag TARGET_IMAGE that refers to SOURCE_IMAGEtopDisplay the running processes of a containerunpauseUnpause all processes within one or more containersupdateUpdate configuration of one or more containersversionShow the Docker version informationwaitBlock until one or more containers stop, then print their exit codes
6. 实战
6.1 部署Nginx
第一步:搜索镜像,建议去DockerHub搜索,可以看到帮助文档
https://registry.hub.docker.com/search?q=nginx&type=image
文章图片
第二步:拉取镜像
malulu@malulu:~/桌面$ docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxf7ec5a41d630: Already exists aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latestmalulu@malulu:~/桌面$
第三步:运行测试
# -d 后台运行# --name 给容器命名# -p 宿主机端口:容器内部端口malulu@malulu:~/桌面$ docker run -d --name nginx01 -p 3344:80 nginx699b9cecd0a07f8db6e888722a2dada1c9b9be6d77efc7996c4b6758dd72f587malulu@malulu:~/桌面$ docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES699b9cecd0a0nginx"/docker-entrypoint.…"About a minute agoUp About a minute0.0.0.0:3344->80/tcpnginx01malulu@malulu:~/桌面$ curl localhost:3344# 进入容器malulu@malulu:~/桌面$ docker exec -it nginx01 /bin/bashroot@699b9cecd0a0:/# whereis nginxnginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxroot@699b9cecd0a0:/# cd /etc/nginx/root@699b9cecd0a0:/etc/nginx# lsconf.d fastcgi_params koi-utfkoi-winmime.typesmodulesnginx.confscgi_params uwsgi_paramswin-utfroot@699b9cecd0a0:/etc/nginx# exit
文章图片
第四步:公网访问
文章图片
文章图片
6.2 端口暴露(端口转发)
文章图片
6.3 部署Elasticsearch
# es 暴露的端口很多# es 十分的耗内存# es 数据一般需要放置到安全目录 挂载docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
# --net somenetwork 网络配置# 启动 Elasticsearchdocker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.12.0# 启动之后,服务器会特别卡# 所以需要增加内存的限制# 修改配置文件 -e 环境配置修改docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.12.0
# 查看CPU使用情况docker stats 容器ID
文章图片
# 测试es是否安装成功curl localhost:9200
文章图片
6.4 可视化 Portainer
Docker图形化界面管理工具,提供一个后台面板供我们操作。
访问测试:
http://192.168.2.143:8088
http://localhost:8088
为用户 admin 设置密码 admin123456
登录成功后,选择本地Docker环境
文章图片
进入之后的面板
文章图片
文章图片
可视化面板我们平时不会使用,用来测试玩玩。
7. Docker镜像讲解
7.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行所需库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来。
如何获取到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
7.2 Docker镜像加载原理
UnionFS(联合文件系统)我们下载的时候看到的一层层就是这个!
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改
作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理Docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统叫做UnionFS。
系统启动需要引导加载。
bootfs(boot file system)主要包含bootloader(加载器)和kernel(内核),bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等。容器就是一个小的虚拟机环境。
平时我们在虚拟机中安装CentOs都是好几个G,为什么在Docker里面才200多M?
文章图片
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
所以说,虚拟机是分钟级别,容器是秒级别。是因为启动虚拟机需要启动内核引导,非常慢,而容器底层还是使用主机的内核。
7.3 分层理解
分层的镜像我们可以去下载一个镜像,注意观察下载的日志输出,可以看到的是一层一层的在下载。
文章图片
**思考:**为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于是资源共享了。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份Base镜像,同时内存中也只需要加载一份Base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过 docker image inspect 命令。
docker image inspect redis:latest
文章图片
理解:
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)
文章图片
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
文章图片
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
文章图片
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs 以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter一种存储引擎。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
文章图片
特点Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层就是我们通常说的容器层,容器之下的都叫镜像层。
文章图片
7.4 commit镜像
如何提交一个自己的镜像呢?
docker commit 提交容器成为一个新的镜像docker commit -m="提交的描述信息" -a="作者" 容器Id 目标镜像名:[TAG]
实战测试:
# 1.启动一个默认的tomcat
# 2.发现这个默认的tomcat是没有webapps应用,是因为官方镜像默认webapps下面是没有文件的
# 3.自己拷贝进去了基本的文件
文章图片
# 4.将我们操作过的容器通过commit提交为一个镜像。我们以后就使用我们修改过的镜像即可。
文章图片
总结: 如果你想要保存当前容器的状态 ,就可以通过commit来提交,获得一个镜像。就好比虚拟机的快照。
8. 容器数据卷
8.1 容器数据卷是什么
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,相当于删库跑路!需求:MySQL数据可以存储到本地
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!相当于目录的挂载,将我们容器内的目录,挂载到Linux上面!
**总结:**为什么使用容器卷?为了容器的持久化和同步操作,容器间也是可以数据共享的(即多个容器使用同一个本地目录)
8.2 使用数据卷
方式一:直接使用命令来挂载 -v
docker run -v 主机内目录:容器内目录
通过命令
docker inspect
来查看挂载信息,如下:"Mounts": [{"Type": "bind","Source": "/home/ceshi", # 主机内地址"Destination": "/home",# docker容器内地址"Mode": "","RW": true,"Propagation": "rprivate"}],
测试文件的同步:
文章图片
8.3 实战:安装MySQL
思考:MySQL的数据持久化问题。
# 获取镜像docker pull mysql:5.7# 运行容器 需要做数据挂载# 注意: 安装启动mysql时 需要配置密码的# 官方测试(DockerHub) docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 启动docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Malulu@960610 --name mysql01 mysql:5.7# 启动成功后 在使用Navicat来测试# Navicat连接到Ubuntu的3310 3310和容器内的3306映射 此时我们就可以连接上了
文章图片
假设我们将容器删除,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化的功能。
8.4 匿名挂载和具名挂载
8.4.1 匿名挂载
# 查看所有卷的信息docker volume ls# 匿名挂载-v 容器内目录docker run -d -P --name nginx -v /etc/nginx nginx# 这样就属于匿名挂载 在 -v 后只写了容器内目录 没有写主机的目录
文章图片
8.4.2 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
文章图片
通过
-v 卷名:容器内目录
的格式属于具名挂载。使用命令
docker volume inspect 卷名
来查看这个这个卷的信息。文章图片
所有的Docker容器内的卷,在没有指定目录的情况下都是在主机的
/var/lib/docker/volumes/xxx/_data
目录下。文章图片
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用具名挂载。
如何确定是具名挂载还是匿名挂载还是指定路径挂载?
-v 容器内路径# 匿名挂载-v 卷名:容器内路径# 具名挂载-v /宿主机路径:容器内路径# 指定路径挂载
扩展:
# 通过 -v 容器内路径:ro rw 改变读写权限ro readonly# 只读rw readwrite # 可读可写# 一旦设置了这个权限 容器对我们挂载出来的内容就有限定了docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx# ro 只要看到ro就说明这个路径只能通过宿主机来操作 容器内部是无法操作的
8.5 初识DockerFile
DockerFile就是用来构建Docker镜像的构建文件,这个文件其实就是一个命令脚本。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个一个的命令,每个命令都是一层。
# 创建一个dockerfile文件 名字可以随机 建议Dockerfile# 文件中的内容 # 指令(大写) 参数FROM centosVOLUME ["volume01","volume02"]CMD echo "-----end-----"CMD /bin/bash# 这里的每个命令镜像的一层
通过
docker build
来创建自己的命令。docker build -f ./dockerfile1 -t malulu-centos:1.0 .
文章图片
启动自己创建的镜像
文章图片
这两个卷在外部一定有同步的目录。
文章图片
查看一下卷挂载的路径。
文章图片
文章图片
然后测试一下刚才创建的两个文件是否同步到宿主机。
文章图片
这种方式我们以后用的非常多,因为我们通常会构建自己的镜像。假设构建镜像时没有挂载卷,就需要手动挂载(具名挂载)。
【Python开发加薪利器之Docker的使用实践】未完待续,值得期待!
推荐阅读
- 深入理解Go之generate
- python学习之|python学习之 实现QQ自动发送消息
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则