# studyDocker **Repository Path**: yang1yu/study-docker ## Basic Information - **Project Name**: studyDocker - **Description**: 记录学习Docker - **Primary Language**: Docker - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-11-29 - **Last Updated**: 2024-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### StudyDocker #### 1.Docker ​ Docker是基于Go语言实现的云开源项目。 ​ Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及 其运行环境能够做到“一次镜像,处处运行”。 ​ Docker解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。 ​ Docker并非是一个通用的容器工具,依赖于已存在并运行的Linux内核中,Docker实质上是在已经运行的Linux下制造的文件环境,因此执行的效率几乎等同于所部属的Linux主机,Docker必须部署在Linux内核的系统上。 **Docker的基本组成:** ​ **image**:就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。 ​ **container**:Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 **repository**:仓库(Repository)是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 [Docker Hub](https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。 ##### docker安装 **前提条件**: ​ Centos仅发行版本中的内核支持Docker。Docker运行在Centos7(64-bit),要求系统为64位、Linux系统内核版本为3.8以上。 查看内核命令: ```shell uname -all ``` ![1670210510079](README.assets/1670210510079.png) ​ docker安装在官方网站上有docker desktop和docker engine两种,docker desktop是为了满足mac、windows和linux桌面版的统一,这里就用docker engine( [Install Docker Engine on CentOS | Docker Documentation](https://docs.docker.com/engine/install/centos/) ) ```shell #先删除之前存在的docker相关,如果安装的镜像为centos8,则需要重新配置一下下载镜像才能使用yum进行下载 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine sudo yum install -y gcc sudo yum install -y gcc-c++ sudo yum install -y yum-utils #更换成阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新索引包 sudo yum makecache fast #安装最新版本的 Docker Engine、containerd 和 Docker Compose 或转到下一步以安装特定版本: sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin #启动Docker systemctl start docker #查看docker版本号 docker version #docker中的helloworld,本地中没有会从hub中将docker镜像pull到本地再进行启动 docker run hello-world ``` 出现下面截图,则docker安装并成功启动。 ![1670226496841](README.assets/1670226496841.png) ##### 阿里云镜像加速 ​ 在使用docker之前,可以使用阿里云的镜像加速,进去阿里云,控制台,容器镜像服务 ![1670228653157](README.assets/1670228653157.png) ![1670228708882](README.assets/1670228708882.png) 配置对应的加速器之后,还可以将自己打包的镜像推送到阿里云或者从阿里云拉取下来。 ##### docker卸载 ```shell systemctl stop docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd ``` #### 2.Docker的常用命令 ##### 启动类命令 ```shell #启动docker systemctl start docker #停止docker systemctl stop docker #重启docker systemctl restart docker #查看docker状态 systemctl status docker #开启启动docker systemctl enable docker ``` ##### 镜像命令 ```shell #查询本地镜像 docker images #查询hub中的镜像 docker search 镜像名 #拉取镜像 docker pull 镜像名 #查看镜像占用空间 docker system df #删除镜像、删除所有镜像 docker rmi id/镜像名 docker rmi $(docker images -aq) ``` ##### 容器命令 ```shell #容器命令是在有镜像的基础上 docker run [OPTIONS] IMAGE [COMMANDS][ARG...] OPTIONS:有些事一个 '-'有些是两个,常用的有: --name 为容器指定一个名称 -d 后台运行容器并返回容器ID -i 以交互模式运行容器,通常与-t同时使用 -P 随机端口映射 -p 指定端口映射 -p 8080:8080 宿主机的8080端口映射到docker容器中的8080端口 #列出当前正在运行容器 docker ps [OPTIONS] -a 列出当前所有正在运行的容器和历史上运行过的 -l 显示最近创建的容器 -n 显示最近n个创建的容器 -q 静默模式,只显示容器编号 #退出容器 exit 容器退出 ctrl+p+q 容器不退出 #启动已停止运行的容器 docker start ID|容器名 #重启容器 docker restart ID|容器名 #停止容器 docker stop ID|容器名 #删除已停止的容器 docker rm ID|容器名 #查看容器日志 docker logs 容器ID #查看容器内运行的进程 docker top 容器ID #查看容器内部细节 docker inspect 容器ID #拷贝文件(可从容器内到宿主机也可以相反) docker cp src target eg: docker cp /test.txt mysql:/ #导入导出容器 docker export 容器ID > txt.tar.gz docker import - 镜像用户/镜像名:镜像版本号 ``` ##### 镜像发布 ![1670230461153](README.assets/1670230461153.png) 生成镜像的方法: ```shell docker commit [OPTIONS] 容器ID 标签:tag -m 提交信息 -a 作者 ``` 推送到阿里云(阿里云上有完整的教程): ![1670230639720](README.assets/1670230639720.png) ##### 本地镜像仓库 ​ 本地镜像仓库可以使用hub和registry,这里以registry为例。 ```shell docker pull registry docker run -d -p 5000:5000 -v /root/registry:/tmp/registry --privileged=true registry docker push 192.168.111.162:5000/zzyyubuntu:1.2 docker pull 192.168.111.162:5000/zzyyubuntu:1.2 ``` #### 3.Docker数据卷 ​ 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。 ​ 特点: 1:数据卷可在容器之间共享或重用数据 2:卷中的更改可以直接实时生效,爽 3:数据卷中的更改不会包含在镜像的更新中 4:数据卷的生命周期一直持续到没有容器使用它为止 命令为: ```shell docker run -p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=yang1yu -v /root/software/mysql/log:/var/log/mysql -v /root/software/mysql/data:/var/lib/mysql -v /root/software/mysql/conf:/etc/mysql/conf.d --privileged=true -d mysql:5.7 -v 宿主机的文件目录:docker中的文件目录 --privileged=true 防止没有权限映射文件目录 ``` #### 4.Docker安装常用软件 ##### 4.1 安装mysql ```dockerfile #从hub中搜索mysql:5.7,并安装 docker pull mysql:5.7 #-p 端口映射(宿主机:docker内部) #-e 环境变量 MYSQL_ROOT_PASSWORD默认的root密码 #-v 数据卷 防止docker镜像或容器被删除时数据跟着一起被删除 #-d 后台运行 docker run -p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=yang1yu -v /root/software/mysql/log:/var/log/mysql -v /root/software/mysql/data:/var/lib/mysql -v /root/software/mysql/conf:/etc/mysql/conf.d --privileged=true -d mysql:5.7 ``` 防止数据库乱码 ​ 默认使用lant1的编码方式,需要使用数据卷将字符编码设置为utf-8,挂载到docker中运行的容器中去,放在my.cnf中 ```sql [client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8 ``` 数据库备份 ```sql 数据库备份命令 mysqldump -uroot -pyang1yu -A > 备份文件名称.sql 过滤数据库自带的数据库进行备份 mysql -e "show databases;" -uroot -p| grep -Ev "Database|sys|information_schema|mysql|performance_schema" | xargs mysqldump -uroot -p --databases > /root/backup.sql -A 备份所有数据库,有时候会出现问题 -B 会将插件数据库语句也备份 -b 备份数据库表的结构不备份数据 ``` 恢复数据库 ```sql mysql -uroot -pyang1yu < 备份文件.sql ``` ##### 4.2 安装redis ```shell docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf ``` ##### 4.3 安装nginx ```shell docker run -d --name mynginx -v /root/software/nginx/conf.d:/etc/nginx/conf.d -v /root/software/invoices/front/dist:/etc/nginx/html -v /root/software/nginx/log:/usr/log/nginx -p 80:80 nginx #nginx的前端页面默认是在/usr/share/nginx/html所以dist文件映射到这个地方nginx就会自动渲染前端页面 docker run -d --name mynginx -v /root/software/invoices/front/dist:/usr/share/nginx/html -v /root/software/nginx/log:/usr/log/nginx -p 80:80 nginx ``` #### 5.Dockerfile ​ Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 ##### 构建步骤 1. 写dockerfile文件 2. build构建镜像 3. docker run依镜像运行容器实例 ##### Dockerfile基础 1. 每条保留字指令都必须为大写字母且至少跟随一个参数 2. 指定从上到下顺序执行 3. #表示注释 4. 每条指令都会创建一个新的镜像层并对镜像进行提交 ##### Dockerfile保留字 ```dockerfile FROM 基础镜像,指定一个已经存在的镜像作为模板 MAINTAINER 镜像维护者的姓名和邮箱地址 yangyu<863386791@qq.com> RUN (docker bulid时运行)容器构建时需要运行的命令 eg: RUN yum -y install vim EXPOSE 镜像对外暴露的端口 WORKDIR 终端默认登录进来工作目录 USER 指定执行用户,默认root ENV 指定环境变量 eg:ENV MY_PATH /user/test,在后续可以使用$MY_PATH来使用 ADD 将宿主机目录下的文件拷贝进镜像中且会自动处理URL和解压tar压缩包 COPY VOLUME 容器数据卷,用户数据保存和持久化工作 CMD (在docker run时运行) 指定容器启动后做的事情,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 ENTRYPOINT 指定一个容器启动时要运行的命令 ``` ```shell docker build -t 镜像名:tag . Dockerfile 例子: FROM centos MAINTAINER yang1yu<863386791@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash ``` #### 6.Docker网路 #### 7.Docker-compose ​ Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器 [Docker-compose官网](https://docs.docker.com/compose/compose-file/compose-file-v3/),[下载地址](https://docs.docker.com/compose/install/)。 ##### 安装步骤 ```shell curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version #docker-compose --version能出现版本信息即成功安装 ``` ##### 卸载步骤 ```shell sudo rm /usr/local/bin/docker-compose ``` ##### compose的使用 1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件 2. 使用docker-compose.yml(相当于一个项目),定义一个完整业务单元,安排好整体应用中的各个容器服务 3. 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线。 ##### compose常用命令 ```shell #查看帮助 docker-compose -h #启动所有docker-compose服务 docker-compose up #启动所有docker-compose服务并后台运行 docker-compose up -d #停止并删除容器、网络、卷、镜像 docker-compose down #进入容器实例内部 docker-compose exec 服务id #展示当前docker-compose编排过的运行的所有容器 docker-compose ps #展示当前docker-compose编排过的容器进程 docker-compose top #查看容器输出日志 docker-compose logs 服务id #检查配置 docker-compose config #检查配置,有问题才有输出 docker-compose config -q #重启服务 docker-compose restart #启动服务 docker-compose start #停止服务 docker-compose stop ``` ##### compose编排微服务 #### 8.可视化工具Portainer ​ Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 ##### Portainer安装 ```shell 官网:https://www.portainer.io/ 教程:https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux #安装命令 docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer #启动之后webui界面端口为9000,默认账号为admin ``` #### 9.CIG ##### CAdvisor 监控手机 ##### InfluxDB 存储数据 ##### Granfana 展示图片 ##### 安装CIG ```shell version: '3.1' volumes: grafana_data: {} services: influxdb: image: tutum/influxdb:0.9 restart: always environment: - PRE_CREATE_DB=cadvisor ports: - "8083:8083" - "8086:8086" volumes: - ./data/influxdb:/data cadvisor: image: google/cadvisor links: - influxdb:influxsrv command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 restart: always ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro grafana: user: "104" image: grafana/grafana user: "104" restart: always links: - influxdb:influxsrv ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana environment: - HTTP_USER=admin - HTTP_PASS=admin - INFLUXDB_HOST=influxsrv - INFLUXDB_PORT=8086 - INFLUXDB_NAME=cadvisor - INFLUXDB_USER=root - INFLUXDB_PASS=root ``` #### Docker镜像推荐 ##### 下载工具 **linuxserver/qbittorrent** ```dockerfile #在容器退出时总是重启容器,如果容器正常stopped,然后机器重启或docker服务重启,容器将不会被restart docker run -d \ --name=download \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Asia/ShangHai \ -e WEBUI_PORT=8080 \ -p 8080:8080 \ -p 6881:6881 \ -p 6881:6881/udp \ -v /root/software/qbittorrent/config:/config \ -v /root/software/qbittorrent/downloads:/downloads \ --restart unless-stopped \ linuxserver/qbittorrent:latest #遇到问题时 docker exec -it download /bin/sh apt update apt install binutils strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 exit docker restart download ``` ##### 阿里网盘 messense/aliyundrive-webdav ```dockerfile docker run -d --name=ali --restart=unless-stopped -p 8081:8080 \ -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \ -e REFRESH_TOKEN='881d30885de944daae24dcc8edf11ae5' \ -e WEBDAV_AUTH_USER=admin \ -e WEBDAV_AUTH_PASSWORD=admin \ messense/aliyundrive-webdav docker run --name=ali --restart=unless-stopped -p 8081:8080 \ -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \ -e REFRESH_TOKEN='881d30885de944daae24dcc8edf11ae5' \ -e WEBDAV_AUTH_USER=admin \ -e WEBDAV_AUTH_PASSWORD=admin \ messense/aliyundrive-webdav ```