docker脚本自动化安装
1、编译构建镜像
编写一个.sh的脚本,用于在linux中构建已发布项目的镜像,构建成功之后再导出镜像------该镜像是docker-compose.yml中需要用到的镜像文件 功能:使用docker根据Dockerfile编译构建已发布的应用程的镜像,并导出该镜像
build.sh内容如下 #!/bin/bash echo "1.使用build脚本自动构建项目镜像" echo -e "\n\033[32m --------开始构建项目镜像-------- \033[0m" sudo docker build -t mywebcore -f Dockerfile . #根据Dockerfile文件构建项目镜像,注意Dockerfile文件后面的 点,表示当前目录 echo -e "\n\033[32m --------构建项目镜像完成-------- \033[0m" #导出镜像文件 echo "2.导出镜像文件" echo -e "\n\033[32m --------导出镜像文件-------- \033[0m" sudo docker save mywebcore > mywebcore.tar # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称 #sudo docker save -o mywebcore.tar mywebcore # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称 echo -e "\n\033[32m --------导出镜像文件成功-------- \033[0m"
根据项目的Dockerfile文件构建项目镜像成功之后,从linux中把导出的镜像文件,复制到本地,以供deploy.sh使用
镜像
导出镜像:
sudo docker save mywebcore > mywebcore.tar # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称
sudo docker save -o mywebcore.tar mywebcore # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称
导入镜像:
sudo docker load < mywebcore.tar # 导入镜像,mywebcore.tar 镜像文件,mywebcore 为默认导入的新镜像名称
sudo docker load -i mywebcore.tar # 导入镜像,mywebcore.tar 镜像文件,mywebcore 为默认导入的新镜像名称
容器
从容器导出镜像:
sudo docker export nginx_test > mynginx.tar # 容器导出镜像文件,mynginx.tar 容器快照文件,nginxtest 导出的容器名称
sudo docker export -o mynginx.tar nginx_test # 容器导出镜像文件,mynginx.tar 容器快照文件,nginxtest 导出的容器名称
从容器快照中导入镜像:
sudo docker import mynginx.tar nginxtest # 导入镜像,mynginx.tar 镜像文件,nginxtest 导入的新镜像名称
sudo cat mynginx.tar | sudo docker import - nginxtest1 # 导入镜像,mynginx.tar 镜像文件,nginxtest1 导入的新镜像名称
编写一键部署deploy.sh脚本:
功能:
1、停止docker容器,并删除容器
2、docker加载需要的镜像,nginx,mysql,项目镜像等
3、创建需要的指定文件目录(该目录主要用于nginx,mysql,项目与docker容器挂载的数据目录,主要用于docker数据的持久化), 然后把需要部署的文件通过SSH客户端上传到该文件目录下,需要上传的nginx,mysql以及项目的相关配置和镜像文件 4、处理一些相关的操作,例如防火墙开放端口 firewall,同步时间ntp,ntpdate等 5、执行docker-compose一键部署安装启动需要的服务
#创建需要的指定文件目录 #!/bin/bash echo "1.使用deploy脚本自动构建运行项目" echo -e "\n\033[32m --------停止和删除容器------- \033[0m" #停止docker容器,并删除所有容器,使用以下命令一次删除所有的容器 sudo docker stop $(docker ps -q) #docker stop : 停止所有的容器,-q :静默模式,只显示容器编号。 sudo docker rm $(docker ps -a -q) #docker ps : 列出容器,-a :显示所有的容器,包括未运行的。-q :静默模式,只显示容器编号。 echo -e "\n\033[32m --------停止和删除容器成功------- \033[0m" #加载镜像 #!/bin/bash echo -e "\n\033[32m --------加载镜像------- \033[0m" for f in ./images/*.tar do echo -e "\033[34m $f 蓝色字 \033[0m" #sudo docker load < $file #这里导入的镜像共docker-compose.yml文件的image使用 done echo -e "\n\033[32m --------加载镜像成功------- \033[0m" echo -e "\n\033[32m --------创建文件夹复制文件------- \033[0m" #创建需要的指定文件目录,例如myapp文件夹,里面包括反向代理的nginx,数据库mysql,项目mywebcore,以及volumes数据卷文件data等 sudo mkdir myapp # 创建myapp文件夹,可以根据具体情况自行创建需要的文件夹,本文是以上传文件的位置作为根目录来进行volumes数据挂载的 #sudo mkdir -vp a/b/c # 创建a,a/b,a/b/c文件夹,-v --verbose是详细信息,-p --parents是递归创建文件夹。 #本文是以上传文件的位置作为根目录来进行volumes数据挂载的,上传的文件myapp.tar, sudo tar -xvf myapp.tar -C ./myapp #解压myapp.tar到myapp文件夹中 sudo cd myapp echo -e "\n\033[32m --------创建文件夹复制文件成功------- \033[0m" #防火墙开放端口80 echo -e "\n\033[32m --------防火墙开放端口80------- \033[0m" sudo firewall-cmd --zone=public --add-port=80/tcp --permanent sudo systemctl restart firewalld echo -e "\n\033[32m --------防火墙开放端口80成功------- \033[0m" #同步时间 echo -e "\n\033[32m --------同步时间------- \033[0m" sudo ntpdate time.ntp.org sudo date echo -e "\n\033[32m --------同步时间成功------- \033[0m"
附件:
1、 install-docker.sh 内容如下
#!/bin/bash echo "1.使用脚本自动安装..." #卸载旧的安装包 echo "卸载旧的安装" sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #卸载依赖 echo "卸载依赖" sudo yum remove docker-ce docker-ce-cli containerd.io #删除资源 echo "删除资源" sudo rm -rf /var/lib/docker #安装工具包 echo "安装工具包" sudo yum install -y yum-utils #设置镜像仓库 echo "设置镜像仓库" #sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo --默认是国外的 #如果没有vpn 建议安装阿里云的 sudo yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum 索引安装包 #echo "更新yum 索引安装包" #sudo yum makecache fast #安装启动docker echo "2、安装docker并启动" sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker #启动 sudo systemctl enable docker #开机启动 echo -e "\n\033[32m ===========查看docker 是否安装完成=========== \033[0m" sudo docker --version #查看docker 是否安装完成 #测试docker,运行Hello world echo "3、docker测试Hello world" sudo docker run hello-world #初次自动下载镜像 #下载 Docker Compose 的当前稳定版本: echo "4、安装Docker-Compose" #解压到Linux系统的/usr/local/bin/docker-compose echo "解压复制docker-compose二进制文件到Linux系统的/usr/local/bin/docker-compose" sudo cp docker-compose /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose #添加软连接 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose echo -e "\n\033[32m ===========查看docker-compose 是否安装完成=========== \033[0m" sudo docker-compose --version #查询安装的docker-compose版本 #添加到docker用户组 echo -e "\n\033[32m ===========添加当前用户到docker用户组=========== \033[0m" sudo usermod -aG docker $USER
docker-compose.yml内容如下
version: '3' networks: mynetwork: driver: bridge services: db: image: mysql ports: - "3306:3306" environment: #- MYSQL_ROOT_PASSWORD:=123456@mysql MYSQL_ROOT_PASSWORD: 123456@mysql MYSQL_USER: mysql MYSQL_PASSWORD: 123456 volumes: - /myapp/data/mysql:/var/lib/mysql networks: - mynetwork webnetcore: build: . #ports: # - "80:80" depends_on: - db volumes: - /myapp/data/webnetcore:/app/webnetcore - /myapp/logs/webnetcore:/app/logs networks: - mynetwork nginx: image: nginx depends_on: - webnetcore ports: - "80:80" - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./logs/nginxlog:/var/log/nginxlog networks: - mynetwork
Dockerfile内容如下
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["Linuxaspnetcore/Linuxaspnetcore.csproj", "Linuxaspnetcore/"] RUN dotnet restore "Linuxaspnetcore/Linuxaspnetcore.csproj" COPY . . WORKDIR "/src/Linuxaspnetcore" RUN dotnet build "Linuxaspnetcore.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Linuxaspnetcore.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Linuxaspnetcore.dll"]
build.sh内容如下
#!/bin/bash echo "1.使用build脚本自动构建项目镜像" echo -e "\n\033[32m --------开始构建项目镜像-------- \033[0m" sudo docker build -t mywebcore -f Dockerfile . #根据Dockerfile文件构建项目镜像,注意Dockerfile文件后面的 点,表示当前目录 echo -e "\n\033[32m --------构建项目镜像完成-------- \033[0m" #导出镜像文件 echo "2.导出镜像文件" echo -e "\n\033[32m --------导出镜像文件-------- \033[0m" sudo docker save mywebcore > mywebcore.tar # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称 #sudo docker save -o mywebcore.tar mywebcore # 导出镜像文件,mywebcore 镜像,mywebcore.tar 导出的镜像文件名称 echo -e "\n\033[32m --------导出镜像文件成功-------- \033[0m"
deploy.sh内容如下
#创建需要的指定文件目录 #!/bin/bash echo "1.使用deploy脚本自动构建运行项目" echo -e "\n\033[32m --------停止和删除容器------- \033[0m" #停止docker容器,并删除所有容器,使用以下命令一次删除所有的容器 sudo docker stop $(docker ps -q) #docker stop : 停止所有的容器,-q :静默模式,只显示容器编号。 sudo docker rm $(docker ps -a -q) #docker ps : 列出容器,-a :显示所有的容器,包括未运行的。-q :静默模式,只显示容器编号。 echo -e "\n\033[32m --------停止和删除容器成功------- \033[0m" #加载镜像 #!/bin/bash echo -e "\n\033[32m --------加载镜像------- \033[0m" for f in ./images/*.tar do echo -e "\033[34m $f 蓝色字 \033[0m" #sudo docker load < $file #这里导入的镜像共docker-compose.yml文件的image使用 done echo -e "\n\033[32m --------加载镜像成功------- \033[0m" echo -e "\n\033[32m --------创建文件夹复制文件------- \033[0m" #创建需要的指定文件目录,例如myapp文件夹,里面包括反向代理的nginx,数据库mysql,项目mywebcore,以及volumes数据卷文件data等 sudo mkdir myapp # 创建myapp文件夹,可以根据具体情况自行创建需要的文件夹,本文是以上传文件的位置作为根目录来进行volumes数据挂载的 #sudo mkdir -vp a/b/c # 创建a,a/b,a/b/c文件夹,-v --verbose是详细信息,-p --parents是递归创建文件夹。 #本文是以上传文件的位置作为根目录来进行volumes数据挂载的,上传的文件myapp.tar, sudo tar -xvf myapp.tar -C ./myapp #解压myapp.tar到myapp文件夹中 sudo cd myapp echo -e "\n\033[32m --------创建文件夹复制文件成功------- \033[0m" #防火墙开放端口80 echo -e "\n\033[32m --------防火墙开放端口80------- \033[0m" sudo firewall-cmd --zone=public --add-port=80/tcp --permanent sudo systemctl restart firewalld echo -e "\n\033[32m --------防火墙开放端口80成功------- \033[0m" #同步时间 echo -e "\n\033[32m --------同步时间------- \033[0m" sudo ntpdate time.ntp.org sudo date echo -e "\n\033[32m --------同步时间成功------- \033[0m" #字体颜色和背景色,颜色设置参考 echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m" echo -e "\033[40;37m 黑底白字 \033[0m" echo -e "\033[41;37m 红底白字 \033[0m" echo -e "\033[42;37m 绿底白字 \033[0m" echo -e "\033[43;37m 黄底白字 \033[0m" echo -e "\033[44;37m 蓝底白字 \033[0m" echo -e "\033[45;37m 紫底白字 \033[0m" echo -e "\033[46;37m 天蓝底白字 \033[0m" echo -e "\033[47;30m 白底黑字 \033[0m"
作者:南辞、归
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个无耻的文档搬运工!