Docker容器之镜像管理、端口映射、容器互联
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,docker镜像的分层 Dockerfile 中的每个指令都会创建一个新的镜像层; 镜像层将会被缓存和复用; 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,
千家信息网最后更新 2025年01月22日Docker容器之镜像管理、端口映射、容器互联
docker镜像的分层
Dockerfile 中的每个指令都会创建一个新的镜像层;
镜像层将会被缓存和复用;
当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效;
镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件
docker镜像
是应用发布的标准格式
可支撑一个docker容器的运行
docker镜像的创建方法
基于已有镜像创建
基于本地模板创建
基于dockerfile创建
基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签]-m:说明信息-a:作者信息-p:生成过程中停止容器的运行
基于本地模板创建
通过导入操作系统模板文件生成新的镜像使用wget命令导入为本地镜像导入成功后可查看本地镜像信息
基于 Dockerfile 创建
Dockerfile 是由一组指令组成的文件
Dockerfile 结构的四部分:
基础镜像信息;
维护者信息;
镜像操作指令;
容器启动时执行指令;
使用 Dockerfile 创建镜像并在容器中运行
dockerfile操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD ["要运行的程序","参数1","参数2"] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中, 或者是一个URL |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME ["目录"] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定 工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
1、基于已有镜像创建
[root@localhost ~]# docker pull centos ##下载镜像[root@localhost ~]# docker create -it centos /bin/bash ##基于centos镜像创建容器30d395e63fc32b9dcf96029869f40a8002990f689410cca2660af4056ed2614f[root@localhost ~]# docker ps -a ##查看容器信息CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES30d395e63fc3 centos "/bin/bash" 7 seconds ago Created inspiring_germain[root@localhost ~]# docker commit -m "new" -a "daoke" 30d395e63fc3 daoke:centos##将容器里面运行的程序及运行环境打包生成新的镜像sha256:66d76f9225b94ce6156db953bd16c384f74067f981d45bee99340f3a965506d3[root@localhost ~]# docker images ##查看镜像REPOSITORY TAG IMAGE ID CREATED SIZEdaoke centos 66d76f9225b9 10 seconds ago 220MBcentos latest 0f3e07c0138f 3 months ago 220MB
2、基于本地模板创建
[root@localhost ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/ ##将本地模板挂载到Linux上Password for root@//192.168.100.3/LNMP-C7: [root@localhost ~]# cd /mnt ##切换目录到/mnt [root@localhost docker]# lsdebian-7.0-x86-minimal.tar.gz[root@localhost mnt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new##基于本地模板创建一个镜像sha256:487145d2411f0440c50fd93d0e8a9e27610d2de745a25d06955f21c80e65753a[root@localhost mnt]# docker images ##查看镜像REPOSITORY TAG IMAGE ID CREATED SIZEdaoke new 487145d2411f 8 seconds ago 215MBcentos latest 0f3e07c0138f 3 months ago 220MB
3、基于dockefile文件创建
[root@localhost ~]# mkdir apache ##创建一个目录[root@localhost ~]# cd apache/[root@localhost apache]# vim Dockerfile ##编写一个dockerfile文件FROM centos ##基于的基础镜像MAINTAINER The porject ##维护镜像的用户信息RUN yum -y update ##镜像操作指令安装Apache软件RUN yum -y install httpd ##安装Apache服务 EXPOSE 80 ##开启80端口ADD index.html /var/www/html/index.html ##复制网址首页文件ADD run.sh /run.sh ##将执行脚本复制到镜像中RUN chmod 755 /run.shCMD ["/run.sh"] ##启动容器时执行脚本[root@localhost apache]# vim run.sh ##编辑run.sh脚本#!/bin/bashrm -rf /run/httpd/* ##清除缓存exec /usr/sbin/apachectl -D FOREGROUND ##执行apache[root@localhost apache]# echo "this is test web" > index.html ##创建页面信息[root@localhost apache]# lsDockerfile index.html run.sh[root@localhost apache]# docker build -t httpd:centos . ##执行创建镜像[root@localhost apache]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhttpd centos b267aaf2c395 22 seconds ago 401MB[root@localhost apache]# docker ps -a ##此时没有容器生成CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@localhost apache]# docker run -d -p 1234:80 httpd:centos ##创建映射,创建容器34c424efdab9e381116de697c4971200b1564b1e38644407cc58d5ba8923a0ea[root@localhost apache]# docker ps -a ##容器开启,1234是外部端口,80是内部端口CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES34c424efdab9 httpd:centos "/run.sh" 9 seconds ago Up 7 seconds 0.0.0.0:1234->80/tcp great_williamson
利用浏览器进行访问
公有仓库与私有仓库
随着创建的镜像日志增多,就需要有一个保存镜像的地方,这就是仓库。目前主要有两种仓库:公共仓库、私有仓库。最方便的就是使用公共仓库上传和下载镜像,下载公共仓库中的镜像不需要注册,但是上传是需要注册的:公共仓库网址
1、公有仓库
##需要注册docker账号##将创建好的 httpd:centos 镜像。上传到刚申请的公共仓库中:docker tag httpd:centos xu/httpd:centosdocker push xu/httpd:centos
2、私有仓库
[root@localhost ~]# docker pull registry ##下载 registry镜像[root@localhost ~]# vim /etc/docker/daemon.json{ "insecure-registries": ["192.168.13.128:5000"], ##指定仓库地址和端口号 "registry-mirrors": ["https://3a8s9zx5.mirror.aliyuncs.com"] ##镜像加速}[root@localhost ~]# systemctl stop docker ##停止docker,开启docker[root@localhost ~]# systemctl start docker[root@localhost ~]# docker create -it registry /bin/bash ##创建registry镜像容器209dadd90f5c555ba328fae5763a61ae5fe4489acc4bfb945a99bb2307a9f139[root@localhost ~]# docker ps -a ##查看容器CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES209dadd90f5c registry "/entrypoint.sh /bin…" 4 seconds ago Created admiring_dewdney34c424efdab9 httpd:centos "/run.sh" 13 minutes ago Exited (137) 35 seconds ago great_williamson[root@localhost ~]# docker start 209dadd90f5c ##开启容器209dadd90f5c[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry##创建映射端口和数据卷,宿主局的/data自动挂载容器重点的/tmpfd4185499dfa29f1a1133f59b706a5524572ae3f22140137214ab4c8212ea8a4[root@localhost ~]# docker images ##查看一下当前的镜像REPOSITORY TAG IMAGE ID CREATED SIZEhttpd centos b267aaf2c395 17 minutes ago 401MBcentos latest 0f3e07c0138f 3 months ago 220MBregistry latest f32a97de94e1 10 months ago 25.8MB[root@localhost ~]# docker tag httpd:centos 192.168.13.128:5000/httpd ##修改标签[root@localhost ~]# docker push 192.168.13.128:5000/httpd ##上传镜像[root@localhost ~]# curl -XGET http://192.168.13.128:5000/v2/_catalog ##获取私有仓库列表{"repositories":["httpd"]}[root@localhost ~]# docker pull 192.168.13.128:5000/httpd ##通过私有仓库下载
Docker 网络通信
docker 提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。
端口映射
Docker 提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
1、端口映射
[root@localhost ~]# docker run -d -P nginx ##随机指定端口[root@localhost ~]# docker ps -a ##查看容器CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbcd11c99804e nginx "nginx -g 'daemon of…" 13 seconds ago Up 13 seconds 0.0.0.0:32768->80/tcp
利用浏览器访问32768端口
[root@localhost ~]# docker run -d -p 32000:80 nginx ##指定端口
利用浏览器访问32000端口
2、容器互联(使用centos镜像)
[root@localhost ~]# docker run -itd -P --name web1 centos /bin/bash ##创建web1容器87c58af3100fbc112bf344a421942dd53451c0c663b697a55a8d410868f314bf[root@localhost ~]# docker run -itd -P --name web2 --link web1:web1 centos /bin/bash##创建web2连接web1容器7a84075802b5689912c323196b5af398fb5912316efda014921c0e23d3e9cdd2[root@localhost ~]# docker ps -a ##查看容器信息CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7a84075802b5 centos "/bin/bash" 6 seconds ago Up 5 seconds web287c58af3100f centos "/bin/bash" 42 seconds ago Up 41 seconds web1[root@localhost ~]# docker exec -it 7a84075802b5 /bin/bash ##进入web2容器[root@7a84075802b5 /]# ping web1 ##pingweb1看是否互联互通PING web1 (172.17.0.5) 56(84) bytes of data.64 bytes from web1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.090 ms64 bytes from web1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.089 ms
镜像
容器
仓库
端口
指令
文件
目录
运行
信息
命令
模板
生成
源文件
缓存
私有
宿主
环境
目标
网络
脚本
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
金蝶服务器连不上网怎么办
网络安全问题怎么解决标题
上海携程软件开发研究生年薪
app应用软件开发软件
软件开发的实习周志
深圳正规软件开发要多少钱
第一章网络安全
iis服务器界面
服务器租用帮助网络信息犯罪
开启服务器管理器
linux缓存服务器
网络安全小口令
网吧服务器32g和16g区别
中国行政区代码数据库
佛山用友软件开发服务公司
针对网络安全的工作亮点
网络安全二本院校名单
网络安全周先进个人事迹
乌海淘宝软件开发
中教数据库智能平台
明日之后最新的服务器叫什么
委托软件开发费用如何摊销
软件开发过程的要求
指定数据库的语句
有关史料的数据库
大学毕业生数据库
根据网络安全法网信部门
圣安地列斯如何登陆服务器密码
服务器安全组怎么搞
服务器万兆网口不通