Docker 1(docker 的安装部署,docker镜像的分层结构,docker commit 与dockerfile,镜像加速,docker部署游戏2048,docker容器化部署nginx)

1.Docker的安装和部署:

1-1:yum源的配置:

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-ce -y 配置好的仓库会自动从阿里云解决依赖性 

安装完成后设定开机自动启动,通过 docker info 查看docker 的信息:

docker 镜像数量,版本信息等

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;按照操作步骤在 /etc/docker/daemon.json中写入自己的编码后即可; 保存文件后记得: systemctl daemon.reload systemctl restart docker 使之生效 

1-4:第一个docker容器:

docker info :查看docker信息; docker search 镜像名 : 在docker公共仓库中查找镜像; docker pull 镜像名: 下载公共仓库中的镜像; docker images : 查看本机中的docker 镜像; docker history 镜像名: 查看镜像的具体信息,镜像每一层的内容,默认监听端口等; docker -d 镜像: 后台运行容器; docker -it 镜像:交互式运行容器;(i 交互式,t tty终端) --name:为容器起名: 如果不起名字,默认随机; -p 808080 端口映射:冒号前为宿主机端口,冒号后为容器运行的端口; 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:v1 RUN touch file2 RUN mkdir redhat 保存退出后: docker build -t demo:v1 .  这种方式的创建的新镜像每一层都有审计,更安全; 

dockerfile示例:

 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 的基础镜像: [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/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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享