1.Docker的安装和部署:
1-1:yum源的配置:
docker 需要重新配置新的虚拟机; 配置新的docker源(阿里云的): vim docker<span class="token punctuation">.</span>repo <span class="token punctuation">[</span>docker<span class="token punctuation">]</span> name<span class="token operator">=</span>docker<span class="token operator">-</span>ce baseurl<span class="token operator">=</span>https<span class="token punctuation">:</span><span class="token operator">//</span>mirrors<span class="token punctuation">.</span>aliyun<span class="token punctuation">.</span>com<span class="token operator">/</span>docker<span class="token operator">-</span>ce<span class="token operator">/</span>linux<span class="token operator">/</span>centos<span class="token operator">/</span><span class="token number">7</span><span class="token operator">/</span>x86_64<span class="token operator">/</span>stable gpgcheck<span class="token operator">=</span><span class="token number">0</span> 使用阿里云配置新的centos源解决安装的依赖性: curl <span class="token operator">-</span>o <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span>CentOS<span class="token operator">-</span>Base<span class="token punctuation">.</span>repo https<span class="token punctuation">:</span><span class="token operator">//</span>mirrors<span class="token punctuation">.</span>aliyun<span class="token punctuation">.</span>com<span class="token operator">/</span>repo<span class="token operator">/</span>Centos<span class="token operator">-</span><span class="token number">7.</span>repo ; sed <span class="token operator">-</span>i <span class="token operator">-</span>e <span class="token string">'/mirrors.cloud.aliyuncs.com/d'</span> <span class="token operator">-</span>e <span class="token string">'/mirrors.aliyuncs.com/d'</span> <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span>CentOS<span class="token operator">-</span>Base<span class="token punctuation">.</span>repo ; 在新的源里:将<span class="token punctuation">:</span><span class="token operator">%</span>s<span class="token operator">/</span>$releasever<span class="token operator">/</span><span class="token number">7</span><span class="token operator">/</span>g 将centos的源改为rhel <span class="token number">7</span> ;docker 需要重新配置新的虚拟机; 配置新的docker源(阿里云的): vim docker<span class="token punctuation">.</span>repo <span class="token punctuation">[</span>docker<span class="token punctuation">]</span> name<span class="token operator">=</span>docker<span class="token operator">-</span>ce baseurl<span class="token operator">=</span>https<span class="token punctuation">:</span><span class="token operator">//</span>mirrors<span class="token punctuation">.</span>aliyun<span class="token punctuation">.</span>com<span class="token operator">/</span>docker<span class="token operator">-</span>ce<span class="token operator">/</span>linux<span class="token operator">/</span>centos<span class="token operator">/</span><span class="token number">7</span><span class="token operator">/</span>x86_64<span class="token operator">/</span>stable gpgcheck<span class="token operator">=</span><span class="token number">0</span> 使用阿里云配置新的centos源解决安装的依赖性: curl <span class="token operator">-</span>o <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span>CentOS<span class="token operator">-</span>Base<span class="token punctuation">.</span>repo https<span class="token punctuation">:</span><span class="token operator">//</span>mirrors<span class="token punctuation">.</span>aliyun<span class="token punctuation">.</span>com<span class="token operator">/</span>repo<span class="token operator">/</span>Centos<span class="token operator">-</span><span class="token number">7.</span>repo ; sed <span class="token operator">-</span>i <span class="token operator">-</span>e <span class="token string">'/mirrors.cloud.aliyuncs.com/d'</span> <span class="token operator">-</span>e <span class="token string">'/mirrors.aliyuncs.com/d'</span> <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span>CentOS<span class="token operator">-</span>Base<span class="token punctuation">.</span>repo ; 在新的源里:将<span class="token punctuation">:</span><span class="token operator">%</span>s<span class="token operator">/</span>$releasever<span class="token operator">/</span><span class="token number">7</span><span class="token operator">/</span>g 将centos的源改为rhel <span class="token number">7</span> ;docker 需要重新配置新的虚拟机; 配置新的docker源(阿里云的): vim docker.repo [docker] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable gpgcheck=0 使用阿里云配置新的centos源解决安装的依赖性: curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo ; sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo ; 在新的源里:将:%s/$releasever/7/g 将centos的源改为rhel 7 ;
1-2:下载安装docker:
需要关掉selinux和防火墙
yum install docker<span class="token operator">-</span>ce <span class="token operator">-</span>y 配置好的仓库会自动从阿里云解决依赖性yum install docker<span class="token operator">-</span>ce <span class="token operator">-</span>y 配置好的仓库会自动从阿里云解决依赖性yum install docker-ce -y 配置好的仓库会自动从阿里云解决依赖性
安装完成后设定开机自动启动,通过 docker info 查看docker 的信息:
docker 镜像数量,版本信息等
systemctl enable <span class="token operator">-</span><span class="token operator">-</span>now docker 由于使用的是虚拟机的桥接功能,因此会出现两个警告: WARNING<span class="token punctuation">:</span> bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>iptables <span class="token keyword">is</span> disabled WARNING<span class="token punctuation">:</span> bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>ip6tables <span class="token keyword">is</span> disabled 解决方案:设定docker参数: <span class="token punctuation">[</span>root@server1 sysctl<span class="token punctuation">.</span>d<span class="token punctuation">]</span> <span class="token operator">/</span>etc<span class="token operator">/</span>sysctl<span class="token punctuation">.</span>d <span class="token punctuation">[</span>root@server1 sysctl<span class="token punctuation">.</span>d<span class="token punctuation">]</span> net<span class="token punctuation">.</span>bridge<span class="token punctuation">.</span>bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>iptables <span class="token operator">=</span> <span class="token number">1</span> net<span class="token punctuation">.</span>bridge<span class="token punctuation">.</span>bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>ip6tables <span class="token operator">=</span> <span class="token number">1</span> 修改docker参数 保存后使用sysctl <span class="token operator">-</span><span class="token operator">-</span>system 使之生效; 再次 docker info 后 警告消失systemctl enable <span class="token operator">-</span><span class="token operator">-</span>now docker 由于使用的是虚拟机的桥接功能,因此会出现两个警告: WARNING<span class="token punctuation">:</span> bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>iptables <span class="token keyword">is</span> disabled WARNING<span class="token punctuation">:</span> bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>ip6tables <span class="token keyword">is</span> disabled 解决方案:设定docker参数: <span class="token punctuation">[</span>root@server1 sysctl<span class="token punctuation">.</span>d<span class="token punctuation">]</span> <span class="token operator">/</span>etc<span class="token operator">/</span>sysctl<span class="token punctuation">.</span>d <span class="token punctuation">[</span>root@server1 sysctl<span class="token punctuation">.</span>d<span class="token punctuation">]</span> net<span class="token punctuation">.</span>bridge<span class="token punctuation">.</span>bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>iptables <span class="token operator">=</span> <span class="token number">1</span> net<span class="token punctuation">.</span>bridge<span class="token punctuation">.</span>bridge<span class="token operator">-</span>nf<span class="token operator">-</span>call<span class="token operator">-</span>ip6tables <span class="token operator">=</span> <span class="token number">1</span> 修改docker参数 保存后使用sysctl <span class="token operator">-</span><span class="token operator">-</span>system 使之生效; 再次 docker info 后 警告消失systemctl enable --now docker 由于使用的是虚拟机的桥接功能,因此会出现两个警告: WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 解决方案:设定docker参数: [root@server1 sysctl.d] /etc/sysctl.d [root@server1 sysctl.d] net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 修改docker参数 保存后使用sysctl --system 使之生效; 再次 docker info 后 警告消失
1-3:docker镜像加速:
进入阿里云,控制台,产品与服务,容器镜像服务,镜像加速器,centos;按照操作步骤在 <span class="token operator">/</span>etc<span class="token operator">/</span>docker<span class="token operator">/</span>daemon<span class="token punctuation">.</span>json中写入自己的编码后即可; 保存文件后记得: systemctl daemon<span class="token punctuation">.</span><span class="token builtin">reload</span> systemctl restart docker 使之生效进入阿里云,控制台,产品与服务,容器镜像服务,镜像加速器,centos;按照操作步骤在 <span class="token operator">/</span>etc<span class="token operator">/</span>docker<span class="token operator">/</span>daemon<span class="token punctuation">.</span>json中写入自己的编码后即可; 保存文件后记得: systemctl daemon<span class="token punctuation">.</span><span class="token builtin">reload</span> systemctl restart docker 使之生效进入阿里云,控制台,产品与服务,容器镜像服务,镜像加速器,centos;按照操作步骤在 /etc/docker/daemon.json中写入自己的编码后即可; 保存文件后记得: systemctl daemon.reload systemctl restart docker 使之生效
1-4:第一个docker容器:
docker info <span class="token punctuation">:</span>查看docker信息; docker search 镜像名 : 在docker公共仓库中查找镜像; docker pull 镜像名: 下载公共仓库中的镜像; docker images : 查看本机中的docker 镜像; docker history 镜像名: 查看镜像的具体信息,镜像每一层的内容,默认监听端口等; docker <span class="token operator">-</span>d 镜像: 后台运行容器; docker <span class="token operator">-</span>it 镜像:交互式运行容器;<span class="token punctuation">(</span>i 交互式,t tty终端<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">-</span>name:为容器起名<span class="token punctuation">:</span> 如果不起名字,默认随机; <span class="token operator">-</span>p <span class="token number">80</span> :<span class="token number">8080</span> 端口映射:冒号前为宿主机端口,冒号后为容器运行的端口; docker tag 镜像名字:版本 新的镜像名:版本 : 更改镜像名 docker inspect 镜像<span class="token operator">/</span>容器名 : 查看详细信息,包括网关,地址,对应端口等信息 docker run : 运行一个容器<span class="token punctuation">;</span> docker rm <span class="token operator">-</span>f :强制删除正在运行的容器, docker ps 查看正在运行的容器<span class="token punctuation">;</span> docker ps <span class="token operator">-</span>a 查看所有的容器<span class="token punctuation">;</span> docker load <span class="token operator">-</span>i 镜像名: 导入本地镜像包; docker rmi 镜像名: 删除镜像; docker container attach 正在运行的镜像名: 进入到指定的容器环境中 在交互式容器环境中:ctrl d 退出容器(关闭容器) ; ctrl p q 退出容器环境,容器仍然运行; docker run <span class="token operator">-</span><span class="token operator">-</span>rm 镜像名: 免维护开启容器(一旦退出环境就关闭容器) docker save <span class="token operator">-</span>o name<span class="token punctuation">.</span>tar images 将本地镜像导出成<span class="token punctuation">.</span>tar文件的形式;docker info <span class="token punctuation">:</span>查看docker信息; docker search 镜像名 : 在docker公共仓库中查找镜像; docker pull 镜像名: 下载公共仓库中的镜像; docker images : 查看本机中的docker 镜像; docker history 镜像名: 查看镜像的具体信息,镜像每一层的内容,默认监听端口等; docker <span class="token operator">-</span>d 镜像: 后台运行容器; docker <span class="token operator">-</span>it 镜像:交互式运行容器;<span class="token punctuation">(</span>i 交互式,t tty终端<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">-</span>name:为容器起名<span class="token punctuation">:</span> 如果不起名字,默认随机; <span class="token operator">-</span>p <span class="token number">80</span> :<span class="token number">8080</span> 端口映射:冒号前为宿主机端口,冒号后为容器运行的端口; docker tag 镜像名字:版本 新的镜像名:版本 : 更改镜像名 docker inspect 镜像<span class="token operator">/</span>容器名 : 查看详细信息,包括网关,地址,对应端口等信息 docker run : 运行一个容器<span class="token punctuation">;</span> docker rm <span class="token operator">-</span>f :强制删除正在运行的容器, docker ps 查看正在运行的容器<span class="token punctuation">;</span> docker ps <span class="token operator">-</span>a 查看所有的容器<span class="token punctuation">;</span> docker load <span class="token operator">-</span>i 镜像名: 导入本地镜像包; docker rmi 镜像名: 删除镜像; docker container attach 正在运行的镜像名: 进入到指定的容器环境中 在交互式容器环境中:ctrl d 退出容器(关闭容器) ; ctrl p q 退出容器环境,容器仍然运行; docker run <span class="token operator">-</span><span class="token operator">-</span>rm 镜像名: 免维护开启容器(一旦退出环境就关闭容器) docker save <span class="token operator">-</span>o name<span class="token punctuation">.</span>tar images 将本地镜像导出成<span class="token punctuation">.</span>tar文件的形式;docker info :查看docker信息; docker search 镜像名 : 在docker公共仓库中查找镜像; docker pull 镜像名: 下载公共仓库中的镜像; docker images : 查看本机中的docker 镜像; docker history 镜像名: 查看镜像的具体信息,镜像每一层的内容,默认监听端口等; docker -d 镜像: 后台运行容器; docker -it 镜像:交互式运行容器;(i 交互式,t tty终端) --name:为容器起名: 如果不起名字,默认随机; -p 80 :8080 端口映射:冒号前为宿主机端口,冒号后为容器运行的端口; docker tag 镜像名字:版本 新的镜像名:版本 : 更改镜像名 docker inspect 镜像/容器名 : 查看详细信息,包括网关,地址,对应端口等信息 docker run : 运行一个容器; docker rm -f :强制删除正在运行的容器, docker ps 查看正在运行的容器; docker ps -a 查看所有的容器; docker load -i 镜像名: 导入本地镜像包; docker rmi 镜像名: 删除镜像; docker container attach 正在运行的镜像名: 进入到指定的容器环境中 在交互式容器环境中:ctrl d 退出容器(关闭容器) ; ctrl p q 退出容器环境,容器仍然运行; docker run --rm 镜像名: 免维护开启容器(一旦退出环境就关闭容器) docker save -o name.tar images 将本地镜像导出成.tar文件的形式;
docker search yakexi007 ;
docker pull yakexi007/game2048;
docker run -d –name game -p 80:80 yakexi007/game2048;
运行结果如下:
注意:此时的访问的地址为宿主机与容器对应的端口80:server11的ip为172.25.254.111 ;
默认宿主机能上网,docker就能使用网络;
注意:容器在运行的时候的是基于镜像的,镜像层是只读的,不可变更的,因此在容器内进行的操作,当容器关闭时会丢失;
2:docker镜像:
2-1:镜像的分层结构:
共享宿主机的kernel;
base镜像提供的是最小的Linux发行版;
同一docker主机支持运行多种Linux发行版;
采用分层结构的最大好处是:共享资源;
Copy-on-Write 可写容器层;
容器层以下的所有镜像层都是只读的;
docker 从上往下依次查找文件;
容器层保存镜像变化的部分,并不会对镜像本身进行任何的修改;
一个镜像最多127 层;
2-2 : docker commit 构建新镜像三部曲:
运行容器;
修改容器;
将容器保存为新的镜像;
缺点:
效率低,可重复性弱,容易出错;
使用者无法进行容器审计,存在安全隐患;
示例:
在正在运行的 demo (busybox)容器中创建文件;
docker commit -m “add files” demo demo:v1
docker images 可以看见出现新的images : demo:v1
docker history demo:v1 可以看见它比buxybox多了一层镜像,其余两层相同;
两层相同的镜像层只存储了一份,新的一层中就是保存刚创建的文件;
推荐建立新镜像的方式:
使用dockerfile的方式:
mkdir docker vim Dockerfile cat Dockerfile FROM demo<span class="token punctuation">:</span>v1 RUN touch file2 RUN mkdir redhat 保存退出后: docker build <span class="token operator">-</span>t demo:v1 <span class="token punctuation">.</span> 这种方式的创建的新镜像每一层都有审计,更安全;mkdir docker vim Dockerfile cat Dockerfile FROM demo<span class="token punctuation">:</span>v1 RUN touch file2 RUN mkdir redhat 保存退出后: docker build <span class="token operator">-</span>t demo:v1 <span class="token punctuation">.</span> 这种方式的创建的新镜像每一层都有审计,更安全;mkdir docker vim Dockerfile cat Dockerfile FROM demo:v1 RUN touch file2 RUN mkdir redhat 保存退出后: docker build -t demo:v1 . 这种方式的创建的新镜像每一层都有审计,更安全;
dockerfile示例:
dockerfile: FROM busybox RUN touch file1 COPY index<span class="token punctuation">.</span>html <span class="token operator">/</span> ADD test<span class="token punctuation">.</span>tar<span class="token punctuation">.</span>gz <span class="token operator">/</span>mnt ENV HOSTNAME server1 EXPOSE <span class="token number">80</span> VOLUME <span class="token punctuation">[</span><span class="token string">"/data"</span><span class="token punctuation">]</span> ENTRYPOINT <span class="token punctuation">[</span><span class="token string">"echo"</span><span class="token punctuation">,</span> <span class="token string">"hello"</span><span class="token punctuation">]</span> CMD <span class="token punctuation">[</span><span class="token string">"world"</span><span class="token punctuation">]</span>dockerfile: FROM busybox RUN touch file1 COPY index<span class="token punctuation">.</span>html <span class="token operator">/</span> ADD test<span class="token punctuation">.</span>tar<span class="token punctuation">.</span>gz <span class="token operator">/</span>mnt ENV HOSTNAME server1 EXPOSE <span class="token number">80</span> VOLUME <span class="token punctuation">[</span><span class="token string">"/data"</span><span class="token punctuation">]</span> ENTRYPOINT <span class="token punctuation">[</span><span class="token string">"echo"</span><span class="token punctuation">,</span> <span class="token string">"hello"</span><span class="token punctuation">]</span> CMD <span class="token punctuation">[</span><span class="token string">"world"</span><span class="token punctuation">]</span>dockerfile: FROM busybox RUN touch file1 COPY index.html / ADD test.tar.gz /mnt ENV HOSTNAME server1 EXPOSE 80 VOLUME ["/data"] ENTRYPOINT ["echo", "hello"] CMD ["world"]
3.应用容器化:docker容器化部署nginx:
思想:使用dockerfile:
先选择基础镜像环境;
然后将下载好的nginx.tar 通过ADD 导入到容器中并解压;
通过run命令 进行源码编译三部曲:./configure , make , make install;
示例:
使用精简的rhel7 的基础镜像: <span class="token punctuation">[</span>root@server1 docker<span class="token punctuation">]</span> FROM rhel7 <span class="token keyword">as</span> build COPY dvd<span class="token punctuation">.</span>repo <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span> ADD nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span><span class="token punctuation">.</span>tar<span class="token punctuation">.</span>gz <span class="token operator">/</span>mnt WORKDIR <span class="token operator">/</span>mnt<span class="token operator">/</span>nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span> RUN rpmdb <span class="token operator">-</span><span class="token operator">-</span>rebuilddb <span class="token operator">&</span><span class="token operator">&</span> yum install <span class="token operator">-</span>y gcc make pcre<span class="token operator">-</span>devel zlib<span class="token operator">-</span>devel <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> <span class="token punctuation">.</span><span class="token operator">/</span>configure <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> make <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> make install <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> rm <span class="token operator">-</span>fr <span class="token operator">/</span>mnt<span class="token operator">/</span>nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span> <span class="token operator">&</span><span class="token operator">&</span> yum remove <span class="token operator">-</span>y gcc make <span class="token operator">&</span><span class="token operator">&</span> yum clean <span class="token builtin">all</span> FROM rhel7 COPY <span class="token operator">-</span><span class="token operator">-</span><span class="token keyword">from</span><span class="token operator">=</span>build <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>nginx <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>nginx EXPOSE <span class="token number">80</span> VOLUME <span class="token punctuation">[</span><span class="token string">"/usr/local/nginx/html"</span><span class="token punctuation">]</span> CMD <span class="token punctuation">[</span><span class="token string">"/usr/local/nginx/sbin/nginx"</span><span class="token punctuation">,</span> <span class="token string">"-g"</span><span class="token punctuation">,</span> <span class="token string">"daemon off;"</span><span class="token punctuation">]</span>使用精简的rhel7 的基础镜像: <span class="token punctuation">[</span>root@server1 docker<span class="token punctuation">]</span> FROM rhel7 <span class="token keyword">as</span> build COPY dvd<span class="token punctuation">.</span>repo <span class="token operator">/</span>etc<span class="token operator">/</span>yum<span class="token punctuation">.</span>repos<span class="token punctuation">.</span>d<span class="token operator">/</span> ADD nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span><span class="token punctuation">.</span>tar<span class="token punctuation">.</span>gz <span class="token operator">/</span>mnt WORKDIR <span class="token operator">/</span>mnt<span class="token operator">/</span>nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span> RUN rpmdb <span class="token operator">-</span><span class="token operator">-</span>rebuilddb <span class="token operator">&</span><span class="token operator">&</span> yum install <span class="token operator">-</span>y gcc make pcre<span class="token operator">-</span>devel zlib<span class="token operator">-</span>devel <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> <span class="token punctuation">.</span><span class="token operator">/</span>configure <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> make <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> make install <span class="token operator">&</span><span class="token operator">></span> <span class="token operator">/</span>dev<span class="token operator">/</span>null <span class="token operator">&</span><span class="token operator">&</span> rm <span class="token operator">-</span>fr <span class="token operator">/</span>mnt<span class="token operator">/</span>nginx<span class="token operator">-</span><span class="token number">1.18</span><span class="token number">.0</span> <span class="token operator">&</span><span class="token operator">&</span> yum remove <span class="token operator">-</span>y gcc make <span class="token operator">&</span><span class="token operator">&</span> yum clean <span class="token builtin">all</span> FROM rhel7 COPY <span class="token operator">-</span><span class="token operator">-</span><span class="token keyword">from</span><span class="token operator">=</span>build <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>nginx <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>nginx EXPOSE <span class="token number">80</span> VOLUME <span class="token punctuation">[</span><span class="token string">"/usr/local/nginx/html"</span><span class="token punctuation">]</span> CMD <span class="token punctuation">[</span><span class="token string">"/usr/local/nginx/sbin/nginx"</span><span class="token punctuation">,</span> <span class="token string">"-g"</span><span class="token punctuation">,</span> <span class="token string">"daemon off;"</span><span class="token punctuation">]</span>使用精简的rhel7 的基础镜像: [root@server1 docker] FROM rhel7 as build COPY dvd.repo /etc/yum.repos.d/ ADD nginx-1.18.0.tar.gz /mnt WORKDIR /mnt/nginx-1.18.0 RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make && yum clean all FROM rhel7 COPY --from=build /usr/local/nginx /usr/local/nginx EXPOSE 80 VOLUME ["/usr/local/nginx/html"] CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
部署完成后发现镜像较大,可以对镜像进行优化;
镜像的优化:
- 选择最精简的基础镜像 ###
- 减少镜像的层数
- 清理镜像构建的基础产物
- 注意网络优化请求
- 尽量使用构建缓存
- 使用多阶段构建镜像 ###
其中###的效果最为明显;
最精简容器化部署nginx:
官方nginx镜像大小约为133M;
通过镜像优化后部署的仅约为31M;
首先在网上拉取精简环境: docker pull gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base 在拉取官方的 nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span><span class="token punctuation">:</span> docker pull nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span> 使用dockerfile的方式构建新的镜像: mkdir nginx cd nginx mkdir dockerfile cat dockerfile FROM nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span> <span class="token keyword">as</span> base ARG TIME_ZONE RUN mkdir <span class="token operator">-</span>p <span class="token operator">/</span>opt<span class="token operator">/</span>var<span class="token operator">/</span>cache<span class="token operator">/</span>nginx <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>var<span class="token operator">/</span>log<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>aL <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>var<span class="token operator">/</span>run <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>passwd <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>group <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>nginx<span class="token operator">-</span>debug <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>ld<span class="token operator">-</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libpcre<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libz<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libc<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libdl<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libpthread<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libcrypt<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libssl<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libcrypto<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>zoneinfo<span class="token operator">/</span>$<span class="token punctuation">{<!-- --></span>TIME_ZONE<span class="token punctuation">:</span><span class="token operator">-</span>ROC<span class="token punctuation">}</span> <span class="token operator">/</span>opt<span class="token operator">/</span>etc<span class="token operator">/</span>localtime FROM gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10 COPY <span class="token operator">-</span><span class="token operator">-</span><span class="token keyword">from</span><span class="token operator">=</span>base <span class="token operator">/</span>opt <span class="token operator">/</span> EXPOSE <span class="token number">80</span> <span class="token number">443</span> ENTRYPOINT <span class="token punctuation">[</span><span class="token string">"nginx"</span><span class="token punctuation">,</span> <span class="token string">"-g"</span><span class="token punctuation">,</span> <span class="token string">"daemon off;"</span><span class="token punctuation">]</span> 保存退出后; 将下载的gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base改名为:gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10: docker tag gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base:latest gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10:latest docker build <span class="token operator">-</span>t webserver<span class="token punctuation">:</span>v1 <span class="token punctuation">.</span> docker images 可以看见新的镜像大小约为30M; 镜像构建完成后:运行: docker run <span class="token operator">-</span>d <span class="token operator">-</span><span class="token operator">-</span>name webserver webserver<span class="token punctuation">:</span>v1 <span class="token punctuation">;</span>首先在网上拉取精简环境: docker pull gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base 在拉取官方的 nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span><span class="token punctuation">:</span> docker pull nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span> 使用dockerfile的方式构建新的镜像: mkdir nginx cd nginx mkdir dockerfile cat dockerfile FROM nginx<span class="token punctuation">:</span><span class="token number">1.18</span><span class="token number">.0</span> <span class="token keyword">as</span> base ARG TIME_ZONE RUN mkdir <span class="token operator">-</span>p <span class="token operator">/</span>opt<span class="token operator">/</span>var<span class="token operator">/</span>cache<span class="token operator">/</span>nginx <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>var<span class="token operator">/</span>log<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>aL <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>var<span class="token operator">/</span>run <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>passwd <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>etc<span class="token operator">/</span>group <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>nginx <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>nginx<span class="token operator">-</span>debug <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>ld<span class="token operator">-</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libpcre<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libz<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libc<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libdl<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libpthread<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libcrypt<span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libssl<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">-</span>a <span class="token operator">-</span><span class="token operator">-</span>parents <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>x86_64<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libcrypto<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token operator">*</span> <span class="token operator">/</span>opt <span class="token operator">&</span><span class="token operator">&</span> \ cp <span class="token operator">/</span>usr<span class="token operator">/</span>share<span class="token operator">/</span>zoneinfo<span class="token operator">/</span>$<span class="token punctuation">{<!-- --></span>TIME_ZONE<span class="token punctuation">:</span><span class="token operator">-</span>ROC<span class="token punctuation">}</span> <span class="token operator">/</span>opt<span class="token operator">/</span>etc<span class="token operator">/</span>localtime FROM gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10 COPY <span class="token operator">-</span><span class="token operator">-</span><span class="token keyword">from</span><span class="token operator">=</span>base <span class="token operator">/</span>opt <span class="token operator">/</span> EXPOSE <span class="token number">80</span> <span class="token number">443</span> ENTRYPOINT <span class="token punctuation">[</span><span class="token string">"nginx"</span><span class="token punctuation">,</span> <span class="token string">"-g"</span><span class="token punctuation">,</span> <span class="token string">"daemon off;"</span><span class="token punctuation">]</span> 保存退出后; 将下载的gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base改名为:gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10: docker tag gsmlg<span class="token operator">/</span>distroless<span class="token operator">-</span>base:latest gcr<span class="token punctuation">.</span>io<span class="token operator">/</span>distroless<span class="token operator">/</span>base<span class="token operator">-</span>debian10:latest docker build <span class="token operator">-</span>t webserver<span class="token punctuation">:</span>v1 <span class="token punctuation">.</span> docker images 可以看见新的镜像大小约为30M; 镜像构建完成后:运行: docker run <span class="token operator">-</span>d <span class="token operator">-</span><span class="token operator">-</span>name webserver webserver<span class="token punctuation">:</span>v1 <span class="token punctuation">;</span>首先在网上拉取精简环境: docker pull gsmlg/distroless-base 在拉取官方的 nginx:1.18.0: docker pull nginx:1.18.0 使用dockerfile的方式构建新的镜像: mkdir nginx cd nginx mkdir dockerfile cat dockerfile FROM nginx:1.18.0 as base ARG TIME_ZONE RUN mkdir -p /opt/var/cache/nginx && \ cp -a --parents /usr/lib/nginx /opt && \ cp -a --parents /usr/share/nginx /opt && \ cp -a --parents /var/log/nginx /opt && \ cp -aL --parents /var/run /opt && \ cp -a --parents /etc/nginx /opt && \ cp -a --parents /etc/passwd /opt && \ cp -a --parents /etc/group /opt && \ cp -a --parents /usr/sbin/nginx /opt && \ cp -a --parents /usr/sbin/nginx-debug /opt && \ cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \ cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime FROM gcr.io/distroless/base-debian10 COPY --from=base /opt / EXPOSE 80 443 ENTRYPOINT ["nginx", "-g", "daemon off;"] 保存退出后; 将下载的gsmlg/distroless-base改名为:gcr.io/distroless/base-debian10: docker tag gsmlg/distroless-base:latest gcr.io/distroless/base-debian10:latest docker build -t webserver:v1 . docker images 可以看见新的镜像大小约为30M; 镜像构建完成后:运行: docker run -d --name webserver webserver:v1 ;
docker删除 镜像:
docker stop $(docker ps -a | grep “Exited” | awk ‘{print $1 }’) //停止容器
docker rm $(docker ps -a | grep “Exited” | awk ‘{print $1 }’) //删除容器
docker rmi $(docker images | grep “none” | awk ‘{print $3}’) //删除镜像
原文链接:https://blog.csdn.net/lb1331/article/details/114520055