Docker 1 (安装部署、Dockerfile详解)

一、Docker安装部署

1、Docker之父Solomon Hykes说:Docker就好比传统的货运集装箱,Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术。容器不需要提前封装虚拟机,而是共享宿主机,可以理解为宿主机上的一个进程。
2、docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。容器是由镜像实例化而来,也可以说镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等…
在这里插入图片描述在这里插入图片描述

1.配置docker

在真机上将虚拟机所需要的docker-ce(社区版)安装包放到共享目录下
请添加图片描述server1配置docker软件仓库,安装docker-ce
请添加图片描述开启服务,并开机自启;
docker info : 显示 Docker 系统信息,包括镜像和容器数
请添加图片描述
此时没有出现警告信息
请添加图片描述若使用docker info 出现警告iptables的情况
在这里插入图片描述
解决方式如下,编辑/etc/sysctl.d目录下的docker.conf 文件,写入两条语句;
系统会从/usr/lib/sysctl.d/.conf 和 /etc/sysctl.d/.conf 加载应用系统配置;
手动加载所有的配置文件,执行: sysctl --system

[root@server1 sysctl.d]# pwd
/etc/sysctl.d
[root@server1 sysctl.d]# vim  docker.conf 
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 sysctl.d]# sysctl  --system   

使用ip addr命令看一下网卡(Docker网络部分会写到):
其中lo是本地回环地址,docker0就是docker0地址,也就是docker的地址172.17.0.1;
Docker0:Docker启动的时候会在主机上自动创建一个docker0网桥,docker0 接口的 IP 作为所有容器的默认网关,实际上是一个Linux网桥。它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。所有容器的启动如果在docker run的时候没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。
请添加图片描述

2.测试

将真机下载的游戏压缩包发送给server1
请添加图片描述docker load -i game2048.tar :导入镜像;
docker images:列出本地镜像;
docker run -d --name game2048 -p 80:80 game2048:创建一个新的容器(由game2048这个镜像产生的容器),-d: 后台运行容器,并返回容器ID,–name 为容器指定一个名称,-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
请添加图片描述 docker ps:显示当前正在运行的容器;
docker ps -a: 显示所有状态的容器(包括已经停掉的);
请添加图片描述然后访问docker主机的ip即可:172.25.36.1
请添加图片描述
接着将真机下载的另一个游戏压缩包发送给server1
请添加图片描述删除之前的容器,导入新的镜像;
做端口映射时,将容器端口设为8080;
请添加图片描述此时在浏览器输入server1的IP又可以进入到mario的游戏界面
请添加图片描述
可以看到server1的80端口被docker-proxy占用(docker-proxy作用是提供端口映射,以便外部可以访问容器内部);
在启动一个Docker容器时,每次为容器在宿主机上映射一个端口,都会启动一个docker-proxy进程;
请添加图片描述

3.镜像的分层

镜像的分层结构:
共享宿主机的kernel,base镜像提供的是最小的Linux发行版,同一docker主机支持运行多种Linux发行版;
采用分层结构的最大好处是:共享资源;
将真机的busybox.tar 传给server1,作为实验环境
请添加图片描述docker rmi : 删除本地指定的镜像,-f 强制删除
请添加图片描述导入新的镜像
请添加图片描述-i: 以交互模式运行容器,通常与 -t 同时使用(-t 表示打开伪终端);
进入bash环境中新建两个文件,ctrl+D退出;
使用 docker start 启动一个已停止的容器:
此时可以查看到busybox镜像产生的容器进程
请添加图片描述 docker attach :连接到正在运行中的容器;
可以看到之前建立的文件
请添加图片描述

4.镜像的构建:

方法一:
docker commit 构建新镜像三部曲:运行容器、修改容器、将容器保存为新的镜像
缺点:
效率低、可重复性弱、容易出错
使用者无法对镜像进行审计,存在安全隐患
docker commit demo demo:v1:将容器保存为新的镜像demo:v1
请添加图片描述docker history : 查看指定镜像的创建历史;
对比查看两者层级结构,发现demo:v1是在busybox的基础上又添加了一层(但手动添加的容器没有解释每一层的作用)
请添加图片描述删除demo:v1镜像;
查看busybox可以看到镜像无变化,仍为原来的两层
请添加图片描述重新将容器保存为新的镜像
请添加图片描述删掉demo后
请添加图片描述不影响v1镜像,里面文件还在
请添加图片描述
方法二:
创建一个dockerfile文件,用文件的方式导入镜像,此方法可以显示镜像构建层级结构具体的内容;
RUN后跟shell运行语句
请添加图片描述
使用dockerfile创建一个demo:v2新的镜像
请添加图片描述查看导入的镜像,可以看到指定镜像的详细创建历史
请添加图片描述运行容器,可以看到所建立的testfile文件
请添加图片描述接着我们在文件dockerfile里面再追加一行输出;
构建镜像demo:v3,可以看到构建过程所用了之前的缓存(镜像的缓存特性);
请添加图片描述同样可以看到镜像构建记录追加了一条!
请添加图片描述运行容器,可以看到所建立的两个文件
请添加图片描述

二、Dockerfile详解

dockerfile常用指令
1、FROM:指定base镜像,如果本地不存在会从远程仓库下载。
2、MAINTAINER:设置镜像的作者,比如用户邮箱等。
3、COPY:
把文件从build context复制到镜像
支持两种形式:COPY src dest 和 COPY [“src”, “dest”]
src必须指定build context中的文件或目录

COPY index.html / :COPY拷贝当前目录的index.html到容器的根目录下;
构建demo:v4镜像
请添加图片描述可以看到demo:v4镜像产生的容器里面index.html文件已经导入
请添加图片描述4、ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:
URL:在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址;

将真机的nginx的压缩包传到server1的docker目录下;
请添加图片描述ADD nginx-1.20.1.tar.gz / :ADD 解压tar包到容器的根目录下
请添加图片描述可以看到demo:v5镜像产生的容器里面nginx.tar解压后的目录;
docker run 加上–rm退出容器以后,这个容器就被删除了,方便在临时测试使用。不加–rm 退出容器后,容器只是停止运行,数据任然被保留。
请添加图片描述5、ENV
设置环境变量,变量可以被后续的指令使用:
ENV HOSTNAME server1(定义变量HOSTNAME 为server1)

6、EXPOSE
如果容器中运行应用服务,可以把服务端口暴露出去:
EXPOSE 80(设定端口为80)

7、VOLUME
申明数据卷,通常指定的是应用的数据挂载点:
VOLUME ["/data"] (挂载目录为/data)
请添加图片描述运行容器,在/data目录下,将/helloword文件复制到当前目录下
请添加图片描述查看demo:v6镜像的创建历史
请添加图片描述docker inspect : 获取容器/镜像的元数据
请添加图片描述查看data是否挂载成功
请添加图片描述进入以上路径下,可以看到刚刚建立的文件,在文件中追加几条
请添加图片描述连接到正在运行中的容器,可以看到刚才导入的数据全部到docker中了
请添加图片描述8、WORKDIR
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建

9、RUN
在容器中运行命令并创建新的镜像层,常用于安装软件包

10、CMD 与 ENTRYPOINT
这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
请添加图片描述构建新的镜像
请添加图片描述
运行容器后看到CMD设置容器启动后执行的命令
请添加图片描述修改dockfile文件使得可以输出主机名
请添加图片描述
请添加图片描述
若是在运行docker容器的时候,后面加上参数,那么就会覆盖之前的输出
请添加图片描述ENTRYPOINT不会被docker run后面的命令行覆盖忽略,一定会被执行
请添加图片描述
请添加图片描述当把CMD的内容修改后
请添加图片描述
运行容器,可以看到容器启动后执行的命令
请添加图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值