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 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: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