# Docker **Repository Path**: fakerlove/docker ## Basic Information - **Project Name**: Docker - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 3 - **Created**: 2021-01-02 - **Last Updated**: 2024-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: Docker ## README 文章链接 ~~~bash https://gitee.com/fakerlove/docker ~~~ # Docker 教程 # 1. 简介 ## 1.1 概念 > Docker 是世界领先的软件容器平台。 > 开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。 > 运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。 > 企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。 ## 1.2 优点 ![](https://gitee.com/fakerlove/picture/raw/master/v2-a17759859f1e5c8bc9657d641b68fcc1_720w.jpg) Docker容器比虚拟机**轻量**多了! ## 1.3 安装 ### 环境准备 ```bash # 3.10 以上的系统内核 [root@izbp10tup89om84qulgxbsz ~]# uname -r 3.10.0-514.26.2.el7.x86_64 # 系统版本为:CentOS 7 [root@izbp10tup89om84qulgxbsz ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ``` ### 安装 安装教程 ~~~bash https://docs.docker.com/engine/install/centos/ ~~~ **第一步:不管有没有,先卸载旧版本:** ```bash yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine ``` **第二步:安装需要的包:** ```bash yum install -y yum-utils ``` **第三步:设置镜像的仓库(选择国内阿里云的地址):** ```bash yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ``` **第四步:更新yum软件包的索引,确保你下载的是最新版:** ```bash yum makecache fast ``` centos 8 ~~~bash yum makecache ~~~ **第五步:安装docker相关的内容:** ce表示社区版,ee表示企业版 ```bash yum install docker-ce docker-ce-cli containerd.io ``` 出现的问题 >Error: > Problem: package docker-ce-3:20.10.2-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed > > - cannot install the best candidate for the job > - package containerd.io-1.4.3-3.1.el7.x86_64 is filtered out by modular filtering > (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages) 解决方案 原因是container.io 版本过低了。 配置阿里镜像 ~~~bash yum install -y wget wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo yum clean all ~~~ 下载最新版本的container.io ~~~bash yum install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm yum install docker-ce docker-ce-cli -y ~~~ **第六步:启动docker:** ```bash systemctl start docker ``` **第七步:查看docker版本(我的版本是19.03.13):** ```bash docker version ``` **第八步:测试hello-world:** ```bash docker run hello-world ``` ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201105152850181.png) **查看已下载的镜像:** ```bash [root@izbp10tup89om84qulgxbsz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 10 months ago 13.3kB 123 ``` **使用阿里云镜像加速** 在阿里云的容器镜像服务中,找到镜像加速器,选择CentOS,执行里面的代码即可: ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/202011051542056.png) ```bash sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://4w8nh8qq.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ``` - **补充(卸载docker):** ```bash # 卸载软件 yum remove docker-ce docker-ce-cli containerd.io # 删除目录 (docker的默认工作路径:/var/lib/docker) rm -rf /var/lib/docker ``` - **hello-world镜像的执行流程回顾** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201105155819980.png) # 2. 入门常用命令 > **Docker官方文档地址:https://hub.docker.com/** ## 2.1 docker的帮助命令 ```bash # 查看 docker 的版本 docker version # 查看 docker 的详细信息(系统信息、镜像和容器的数量) docker info # 查看 docker 的所有命令 docker --help ``` ## 2.2 docker的镜像命令 #### 查看镜像 ~~~bash docker images ~~~ 具体内容 ~~~bash # 查看所有的本地镜像 [root@izbp10tup89om84qulgxbsz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 10 months ago 13.3kB # 解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小 # 可选项 [root@izbp10tup89om84qulgxbsz ~]# docker images --help Options: -a, --all Show all images (default hides intermediate images)(列出所有的镜像) -q, --quiet Only show numeric IDs (只显示镜像的ID) # 列出所有的镜像且只显示ID [root@izbp10tup89om84qulgxbsz ~]# docker images -aq bf756fb1ae65 ~~~ #### 搜索镜像 ~~~bash docker search mysql ~~~ 具体内容 ```bash # 从DockerHub仓库中搜索镜像 [root@izbp10tup89om84qulgxbsz ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10129 [OK] mariadb MariaDB is a community-developed fork of MyS… 3724 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 740 [OK] # 可选项 [root@izbp10tup89om84qulgxbsz ~]# docker search --help Options: -f, --filter filter Filter output based on conditions provided (搜索过滤) --format string Pretty-print search using a Go template --limit int Max number of search results (default 25) --no-trunc Don't truncate output # 搜索收藏量不小于5000的镜像 [root@izbp10tup89om84qulgxbsz ~]# docker search mysql --filter=STARS=5000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10129 [OK] ``` #### 下载镜像 ~~~bash docker pull mysql ~~~ 具体内容 ```bash # 下载镜像 docker pull 镜像名[:tag] [root@izbp10tup89om84qulgxbsz ~]# docker pull mysql Using default tag: latest # 如果不指定tag,就会下载最新版的镜像 latest: Pulling from library/mysql bb79b6b2107f: Pull complete # 联合文件系统的分层下载 49e22f6fb9f7: Pull complete 842b1255668c: Pull complete 9f48d1f43000: Pull complete c693f0615bce: Pull complete 8a621b9dbed2: Pull complete 0807d32aef13: Pull complete a56aca0feb17: Pull complete de9d45fd0f07: Pull complete 1d68a49161cc: Pull complete d16d318b774e: Pull complete 49e112c55976: Pull complete Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d # 签名信息(防伪) Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址 docker pull mysql 等价于 docker pull docker.io/library/mysql:latest # 下载镜像并指定版本 [root@izbp10tup89om84qulgxbsz ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql bb79b6b2107f: Already exists # 分层下载,该文件块在下载最新版时已经下载了就不会重复下载,极大地节省内存 49e22f6fb9f7: Already exists 842b1255668c: Already exists 9f48d1f43000: Already exists c693f0615bce: Already exists 8a621b9dbed2: Already exists 0807d32aef13: Already exists f15d42f48bd9: Pull complete 098ceecc0c8d: Pull complete b6fead9737bc: Pull complete 351d223d3d76: Pull complete Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 ``` **版本可以在官方文档中查询:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture_1/raw/master/20201105170804693.png) #### 删除镜像 ```bash # 根据镜像的ID删除 [root@izbp10tup89om84qulgxbsz ~]# docker rmi -f 1b12f2e9257b # 删除所有的镜像 [root@izbp10tup89om84qulgxbsz ~]# docker rmi -f $(docker images -aq) ``` ## 2.3 docker的容器命令 说明:容器需要通过镜像创建,首先下载一个 centos 镜像: ```bash [root@izbp10tup89om84qulgxbsz ~]# docker pull centos docker run [可选参数] image # 参数说明 --name="Name" 给容器起名 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p (小写p)指定容器的端口 -p 主机端口:容器端口 (常用) -p 容器端口 -P (大写P)随机指定端口 ``` 启动 centos镜像并进入容器,查看目录并退出容器: ```bash [root@izbp10tup89om84qulgxbsz ~]# docker run -it centos /bin/bash [root@14ce3ccc03d1 /]# [root@14ce3ccc03d1 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@14ce3ccc03d1 /]# exit exit [root@izbp10tup89om84qulgxbsz ~]# ``` #### 查看所有容器 ~~~bash docker ps -a ~~~ 具体内容 ```bash # 查看正在运行中的容器 [root@izbp10tup89om84qulgxbsz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 查看所有(正在运行和曾经运行过的)容器 [root@izbp10tup89om84qulgxbsz ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14ce3ccc03d1 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago lucid_robinson a57b7706a90b bf756fb1ae65 "/hello" 22 hours ago Exited (0) 22 hours ago jovial_morse # 显示最近创建的1个容器 [root@izbp10tup89om84qulgxbsz ~]# docker ps -a -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14ce3ccc03d1 centos "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago lucid_robinson # 查看所有(正在运行和曾经运行过的)容器,只显示容器的编号 [root@izbp10tup89om84qulgxbsz ~]# docker ps -aq 14ce3ccc03d1 a57b7706a90b ``` #### 退出容器 ```bash # 容器停止并退出 exit # 容器不停止退出 Ctrl + P + Q ``` #### 删除容器 ```bash # 根据容器id删除容器(不能删除正在运行中的容器) docker rm 容器id # 强制删除指定容器(正在运行中的容器也可删除) docker rm -f 容器id # 删除所有的容器 docker rm -f $(docker ps -aq) ``` #### 启动和停止容器 ```bash # 启动容器 docker start 容器id # 重启容器 docker restart 容器id # 停止当前正在运行中的容器 docker stop 容器id # 强制停止当前容器 docker kill 容器id ``` **容器的常用其他命令:** **后台启动容器:** ```bash # 注意:后台启动后,该容器仍然是停止状态 [root@izbp10tup89om84qulgxbsz ~]# docker run -d centos 48af775d21ca29566773af17346cbf5afb7c900546bf4a0de49cde0ae5180021 [root@izbp10tup89om84qulgxbsz ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48af775d21ca centos "/bin/bash" 11 seconds ago Exited (0) 10 seconds ago laughing_mccarthy ``` #### 日志命令 ```bash # 显示指定行数的日志 docker logs -tf --tail 10 fa3301b94b9f # 参数解释 -tf 显示日志 --tail 10 显示日志条数 ``` #### 查看容器中的进程信息 ```bash [root@izbp10tup89om84qulgxbsz ~]# docker top fa3301b94b9f UID PID PPID C STIME TTY TIME CMD root 20198 20174 0 14:25 pts/0 00:00:00 /bin/bash ``` **查看容器的元数据信息:** ```bash docker inspect fa3301b94b9f ``` #### 进入当前正在运行中的容器 ```bash # 方式1:进入容器后开启一个新的终端 [root@izbp10tup89om84qulgxbsz ~]# docker exec -it fa3301b94b9f /bin/bash [root@fa3301b94b9f /]# # 方式2: 进入容器正在进行的终端,不会启动新进程 [root@izbp10tup89om84qulgxbsz ~]# docker attach fa3301b94b9f [root@fa3301b94b9f /]# ``` **从容器内拷贝文件至主机:** ```bash docker cp 容器id:容器内路径 目的主机的路径 ``` - 在容器的home目录下创建一个文件: ```bash [root@fa3301b94b9f /]# cd home [root@fa3301b94b9f home]# touch blu.txt [root@fa3301b94b9f home]# ls blu.txt ``` - 将文件拷贝至主机: ```bash [root@izbp10tup89om84qulgxbsz ~]# docker cp fa3301b94b9f:/home/blu.txt /home [root@izbp10tup89om84qulgxbsz ~]# cd /home [root@izbp10tup89om84qulgxbsz home]# ll total 4 drwx------ 4 blu blu 4096 Sep 22 22:02 blu -rw-r--r-- 1 root root 0 Nov 6 14:41 blu.txt ``` **将当前容器制作成镜像:** ```bash docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名 1 # 启动 tomcat 镜像 docker run -it -p 8000:8080 tomcat # 进入 tomcat 容器 docker exec -it a181f6fde91f /bin/bash # 将 webapps.dist 下的所有文件复制进 webapps 目录下 cp -r webapps.dist/* webapps # 退出容器,提交镜像 docker commit -a="BLU" -m="add webapps app" a181f6fde91f tomcat-blu:1.0 # 查看本地镜像 [root@izbp10tup89om84qulgxbsz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat-blu 1.0 792cfe32fbe1 7 seconds ago 653MB tomcat latest dab3cf97dd54 5 days ago 648MB ``` ## 2.4 总结 ~~~bash // 列出本地已有镜像 docker images // 从远端下载镜像 docker pull // 使用镜像创建并启动一个容器(若本地没有该镜像,则会先从远端下载,每次run都会生成一个容器,嗯,轻量~) docker run hub.c.163.com/library/hello-world:latest //列出正在运行的容器 docker ps // 列出所有容器(包括Exited) docker ps -a // 启动指定的容器 docker start // 停止指定的容器 docker stop // 停止所有运行中的容器 docker stop $(docker ps -q) // 删除指定容器 docker rm //删除所有容器 docker rm $(docker ps -aq) //停止并删除容器 docker stop $(docker ps -q) & docker rm $(docker ps -aq) // 删除指定镜像(删除镜像前须先停止并删除容器) docker rmi // 重启容器 docker restart // 创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -p: 端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; // 交互运行 docker run -it centos /bin/bash /bin/bash 是进入到linux中命令行 // 进入容器 docker exec -it centos /bin/bash // 容器拷贝到主机 docker cp :文件路径 主机目标路径 // 主机拷贝到容器 docker cp 主机文件路径 :文件路径 //查看容器IP docker inspect -f '{{.NetworkSettings.IPAddress}}' centos ~~~ # 3. docker 部署练习 ## 3.1 部署 nginx ```bash # 下载 nginx 镜像 [root@izbp10tup89om84qulgxbsz ~]# docker pull nginx # 启动 nginx 镜像 # -d 表示后台运行 # --name 给容器命名 # -p 暴露端口 格式:宿主机端口:容器内部端口 [root@izbp10tup89om84qulgxbsz ~]# docker run -d --name nginx01 -p:3344:80 nginx # 本机测试连接(出现 Welcome to nginx! 即表示连接成功) [root@izbp10tup89om84qulgxbsz ~]# curl localhost:3344 ``` **外网测试连接:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201111201305468.png) ```bash # 查看容器 [root@izbp10tup89om84qulgxbsz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 061942db0498 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:3344->80/tcp nginx01 # 进入 nginx 容器 [root@izbp10tup89om84qulgxbsz ~]# docker exec -it nginx01 /bin/bash root@061942db0498:/# # 在容器中查找 nginx 配置文件 root@061942db0498:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx # 退出容器 root@061942db0498:/# exit exit # 停止容器 [root@izbp10tup89om84qulgxbsz ~]# docker stop 061942db0498 061942db0498 ``` ## 3.2 部署 tomcat ```bash # 下载镜像 [root@izbp10tup89om84qulgxbsz ~]# docker pull tomcat # 查看本地镜像 [root@izbp10tup89om84qulgxbsz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest dab3cf97dd54 4 days ago 648MB # 启动镜像 [root@izbp10tup89om84qulgxbsz ~]# docker run -d -p 3355:8080 tomcat01 tomcat # 本地访问 [root@izbp10tup89om84qulgxbsz ~]# curl localhost:3355 HTTP Status 404 – Not Found

HTTP Status 404 – Not Found


Type Status Report

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.


Apache Tomcat/9.0.39

\ ``` **外网测试访问(连接成功,但是报404,因为这个 tomcat 是被阉割的):** ![](https://gitee.com/fakerlove/picture/raw/master/20201111204612954.png) ## 3.3 部署 elastic search ```bash # 下载运行elasticsearch镜像 [root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 # 发现并没有成功运行(原因是elastsearch极耗内存,而我的服务器内存不够) [root@izbp10tup89om84qulgxbsz /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 如果你和我一样,服务器内存不够用,建议使用下面的命令限制内存启动 elasticsearch [root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 # 启动后可以使用如下命令查看容器的内存占用情况: [root@izbp10tup89om84qulgxbsz /]# docker stats 784a6bb21c2d CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 784a6bb21c2d elasticsearch 0.39% 359.9MiB / 1.796GiB 19.57% 0B / 0B 265MB / 696kB 42 # 本地访问es [root@izbp10tup89om84qulgxbsz /]# curl localhost:9200 ``` - **(补充)Portainer 可视化面板的安装:** ```bash # 下载并运行 Portainer docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer # 内网访问(会很快) [root@izbp10tup89om84qulgxbsz /]# curl localhost:8088 ``` **外网访问8088端口(第一次访问会非常非常慢):** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201111222349799.png) **第一次访问,需要添加用户名和密码:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201111221557315.png) ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201111222011484.png) **看看就好,反正不好用:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201111222442228.png) # 4. 数据卷技术 **Docker04_使用数据卷技术实现容器内外和容器间的数据共享** ## 4.1 使用 -v 命令挂载目录: ```bash [root@izbp10tup89om84qulgxbsz home]# docker run -it -v /home/ceshi:/home centos /bin/bash ``` 此时,容器内的 **/home** 目录就与主机的 **/home/ceshi** 目录实现了双向绑定。 即使容器被关闭或删除了,数据依然可以保留。 使用 **docker inspect 容器id** 命令可以查看到详细的目录挂载信息: ```bash "Mounts": [ { "Type": "bind", "Source": "/home/ceshi", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ] ``` ## 4.2 实战:MySQL同步数据 ```bash #搜索镜像 [root@izbp10tup89om84qulgxbsz ceshi]# docker search mysql #下载镜像 [root@izbp10tup89om84qulgxbsz ceshi]# docker pull mysql:5.7 # 查看是否下载成功 [root@izbp10tup89om84qulgxbsz ceshi]# docker images # 启动 mysql 镜像 -d 表示后台运行 -p 表示端口映射 -v 数据卷挂载 -e 环境配置 --name 容器名 [root@izbp10tup89om84qulgxbsz ceshi]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 ``` **Navicat 测试连接:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201118180137583.png) **使用 Navicat 创建一个 test-blu 数据库:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201118180740902.png) **进入主机的 /home/mysql/data 目录查看文件,发现多了一个名为 test@002dblu 的目录:** ```bash [root@izbp10tup89om84qulgxbsz data]# ls auto.cnf client-key.pem ib_logfile1 private_key.pem sys ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu ca.pem ibdata1 mysql server-cert.pem client-cert.pem ib_logfile0 performance_schema server-key.pem 12345 # 删除 mysql01 容器 [root@izbp10tup89om84qulgxbsz data]# docker rm -f mysql01 # 查看是否删除成功 [root@izbp10tup89om84qulgxbsz data]# docker ps -a # 查看主机的 /home/mysql/data 目录,发现文件仍然存在 [root@izbp10tup89om84qulgxbsz data]# ls auto.cnf client-key.pem ib_logfile1 private_key.pem sys ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu ca.pem ibdata1 mysql server-cert.pem client-cert.pem ib_logfile0 performance_schema server-key.pem ``` **具名挂载 和 匿名挂载** ```txt 指定路径挂载 -v 主机目录:容器目录 具名挂载 -v 卷名:容器目录 匿名挂载 -v 容器目录 ``` **匿名挂载 nginx 示例(不推荐):** ```bash # 匿名挂载启动 nginx -P 表示随机端口映射 [root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有的 volume [root@izbp10tup89om84qulgxbsz home]# docker volume ls DRIVER VOLUME NAME local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65 # 查看指定的 volume 信息 [root@izbp10tup89om84qulgxbsz home]# docker volume inspect f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b [ { "CreatedAt": "2020-11-11T21:36:18+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b/_data", "Name": "f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b", "Options": null, "Scope": "local" } ] [root@izbp10tup89om84qulgxbsz home]# docker volume inspect fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65 [ { "CreatedAt": "2020-11-18T18:27:24+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65/_data", "Name": "fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65", "Options": null, "Scope": "local" } ] ``` **结论:所有 docker 容器内的卷,在没有指定主机目录的情况下,默认挂载的地址都是:** **"/var/lib/docker/volumes/【volumn-name】/_data"** 问题是匿名挂载的 volumn 的 名字都是一长串的随机字符,我们无法判断哪一个才是 nginx 容器挂载的地址,使用具名挂载可以解决这个问题。 **具名挂载 nginx 示例(推荐):** ```bash # 具名挂载启动 nginx [root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 查看所有的 volume [root@izbp10tup89om84qulgxbsz _data]# docker volume ls DRIVER VOLUME NAME local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65 local juming-nginx # 查看指定的 volume 信息 [root@izbp10tup89om84qulgxbsz _data]# docker volume inspect juming-nginx [ { "CreatedAt": "2020-11-18T18:46:47+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] # 进入挂载目录查看文件,找到了 nginx 的配置文件! [root@izbp10tup89om84qulgxbsz _data]# cd /var/lib/docker/volumes/juming-nginx/_data [root@izbp10tup89om84qulgxbsz _data]# ll total 40 drwxr-xr-x 2 root root 4096 Nov 18 18:46 conf.d -rw-r--r-- 1 root root 1007 Oct 27 23:09 fastcgi_params -rw-r--r-- 1 root root 2837 Oct 27 23:09 koi-utf -rw-r--r-- 1 root root 2223 Oct 27 23:09 koi-win -rw-r--r-- 1 root root 5231 Oct 27 23:09 mime.types lrwxrwxrwx 1 root root 22 Oct 27 23:25 modules -> /usr/lib/nginx/modules -rw-r--r-- 1 root root 643 Oct 27 23:25 nginx.conf -rw-r--r-- 1 root root 636 Oct 27 23:09 scgi_params -rw-r--r-- 1 root root 664 Oct 27 23:09 uwsgi_params -rw-r--r-- 1 root root 3610 Oct 27 23:09 win-utf ``` **拓展:** ```bash 默认rw挂载的目录可读可写,可以在容器内部对挂载的目录内的文件进行读写: docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:rw 设置读写权限为ro(readOnly)的挂载目录,不可以在容器内对该目录内的文件进行写操作: docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:ro ``` ## 4.3 具名和匿名挂载 ### 匿名 ~~~bash docker run -d -P --name naginx-1 -v /ect/nagix nginx ~~~ 不写路径,然后docker 自动生成路径进行挂载 ### 具名 ~~~bash docker run -d -P --name nagix02 -v nagix_1:/ect/nagix nagix ~~~ 写路径的,但是路径并不是绝对路径,而是卷名 查看卷名 ~~~bash docker volume inspect ~~~ ### 拓展 ~~~bash docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:ro nagix ~~~ ro readonly 只读,只能进行宿主机来改变 ~~~bash docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:rw nagix ~~~ rw readwrite 可读可写 # 5. DockerFile > dockerfile 就是构建docker镜像的构建文件,命令脚本 ## 5.1 使用 dockerfile 挂载目录 在 /home 目录下新建 docker-test-volume 目录,进入该目录 在 /home/docker-test-volume 目录下,创建 dockerfile1 文件,写入以下内容: ~~~bash FROM centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash ~~~ 测试 ```bash # 根据 dockerfile1 中的脚本创建镜像,镜像名为 docker-blu/centos 版本为1.0 [root@izbp10tup89om84qulgxbsz docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t docker-blu/centos:1.0 . # 查看生成的镜像 [root@izbp10tup89om84qulgxbsz docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-blu/centos 1.0 65d304aadb42 43 seconds ago 215MB # 启动自己创建的镜像 [root@izbp10tup89om84qulgxbsz docker-test-volume]# docker run -it 65d304aadb42 /bin/bash # 查看目录,发现了挂载的目录 volume01 和 volume02 [root@c1a21b8c0d30 /]# ls -l total 56 lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x 5 root root 360 Nov 18 11:31 dev drwxr-xr-x 1 root root 4096 Nov 18 11:31 etc drwxr-xr-x 2 root root 4096 May 11 2019 home lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------ 2 root root 4096 Aug 9 21:40 lost+found drwxr-xr-x 2 root root 4096 May 11 2019 media drwxr-xr-x 2 root root 4096 May 11 2019 mnt drwxr-xr-x 2 root root 4096 May 11 2019 opt dr-xr-xr-x 97 root root 0 Nov 18 11:31 proc dr-xr-x--- 2 root root 4096 Aug 9 21:40 root drwxr-xr-x 11 root root 4096 Aug 9 21:40 run lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 May 11 2019 srv dr-xr-xr-x 13 root root 0 Nov 18 11:31 sys drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr drwxr-xr-x 20 root root 4096 Aug 9 21:40 var drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume01 drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume02 # 在 volume01 中创建一个文件 [root@c1a21b8c0d30 /]# cd volume01 [root@c1a21b8c0d30 volume01]# touch a.txt # 查看容器id [root@izbp10tup89om84qulgxbsz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1a21b8c0d30 65d304aadb42 "/bin/bash" 7 minutes ago Up 7 minutes festive_cerf # 查看挂载点信息 [root@izbp10tup89om84qulgxbsz ~]# docker inspect c1a21b8c0d30 "Mounts": [ { "Type": "volume", "Name": "3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027", "Source":"/var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342", "Source": "/var/lib/docker/volumes/61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ] # 进入 volume01 挂载的主机目录,发现同步成功! [root@izbp10tup89om84qulgxbsz ~]# cd /var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data [root@izbp10tup89om84qulgxbsz _data]# ls a.txt [root@izbp10tup89om84qulgxbsz _data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1a21b8c0d30 65d304aadb42 "/bin/bash" 24 minutes ago Up 24 minutes festive_cerf # 再启动一个容器,卷继承上一个容器 [root@izbp10tup89om84qulgxbsz _data]# docker run -it --name blu-centos02 --volumes-from c1a21b8c0d30 65d304aadb42 /bin/bash # 进入 volume01 目录,发现了a.txt [root@9740c6ea3675 volume01]# ls a.txt # 创建 b.txt [root@9740c6ea3675 volume01]# touch b.txt # 在之前的容器中发现了b.txt,同步成功! [root@c1a21b8c0d30 volume01]# ls a.txt b.txt ``` ## 5.2 实战:使用数据卷容器实现多个MySQL的数据同步 ```bash docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7 ``` ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20201118203403769.png) **DockerFile** > - **DockerFile 就是一个命令参数脚本,是用来构建docker镜像的文件** > - **每个保留关键字(指令)都必须是大写字母** > - **# 号表示注释** > - **每一个指令都会创建提交一个新的镜像层** ### DockerFile 的指令 ```bash FROM # 指定基础镜像 MAINTAINER # 指定维护者信息(姓名+邮箱) RUN # 镜像构建时需要运行的命令 ADD # 在镜像中添加内容 WORKDIR # 设置当前工作目录 VOLUME # 设置卷,挂载主机目录 EXPOSE # 指定暴露端口 CMD # 指定容器启动时要运行的命令(只有最后一个CMD指令会生效) ENTRYPOINT # 指定容器启动时要运行的命令,启动时可以追加命令参数 ONBUILD # 当构建一个被继承 DockerFile 时会执行的指令 COPY # 类似ADD,将文件拷贝至镜像中 ENV # 构建时设置环境变量 ``` ## 5.3 制作自己的镜像 ### 5.3.1 创建一个自己的 CentOS 镜像: 编辑命令 ~~~bash vim mydockerfile-centos ~~~ 输入命令 ~~~bash FROM centos MAINTAINER BLU<2711978737@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash ~~~ 开始构建自己的centos ```bash docker build -f mydockerfile-centos -t mycentos:0.1 . ``` **docker history 命令查看指定镜像的构建过程(以mysql:5.7为例):** ```bash [root@blu ~]# docker history mysql:5.7 IMAGE CREATED CREATED BY SIZE COMMENT c791733bf9b7 4 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B 4 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B 4 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B 4 days ago /bin/sh -c #(nop) COPY file:f9202f6b715c0e78… 13.1kB 4 days ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B 4 days ago /bin/sh -c { echo mysql-community-server m… 313MB 4 days ago /bin/sh -c echo "deb http://repo.mysql.com/a… 55B 4 days ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.32-… 0B 4 days ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B 4 days ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 2.61kB 4 days ago /bin/sh -c apt-get update && apt-get install… 52.2MB 4 days ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B 4 days ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB 4 days ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B 4 days ago /bin/sh -c apt-get update && apt-get install… 9.34MB 4 days ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B 4 days ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB ``` #### 可能出现的问题 Errors during downloading metadata for repository ‘AppStream‘解决方法 > 在阿里云服务器centos7上,Dockerfile中写了一句RUN yum -y install vim,结果build的时候就一直出错 > ![在这里插入图片描述](https://gitee.com/fakerlove/picture/raw/master/20200807230418971.png) > 最后是发现因为把防火墙关了,把防火墙打开就可以了。 > systemctl start firewalld.service > 1. vim CentOS-Base.repo > 2. vim CentOS-AppStream.repo > 3. vim CentOS-Extras.repo > > 将文件中三文件中的 mirrorlist注释,将baseurl 修改为阿里源 > 为 baseurl= > > ~~~bash > https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/ > ~~~ > > ~~~bash > yum makecache > ~~~ > > ~~~bash > systemctl restart docker > ~~~ ### 5.3.2 创建一个 Tomcat 镜像: ~~~bash FROM centos MAINTAINER BLU<2711978737@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u271-linux-aarch64.tar.gz /usr/local/ ADD apache-tomcat-9.0.34.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH RUN chmod -R 777 /usr/local ENV JAVA_HOME /usr/local/jdk1.8.0_271 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.34 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.34 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.34/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.34/logs/catalina.out ~~~ ~~~bash [root@blu tomcat]# docker build -t diytomcat . [root@blu blu]# docker run -d -p 3001:8080 --name blu-diytomcat -v /usr/blu/tomcat/test/webapps:/usr/local/apache-tomcat-9.0.34/webapps -v /usr/blu/tomcat/test/tomcatlogs:/usr/local/apache-tomcat-9.0.34/logs diytomcat ~~~ ### 5.3.3 在DockerHub上发布自己的镜像 - **第一步:先在这个网站注册一个账号:https://hub.docker.com/** - **第二步,在服务器上登录账号:** ```bash [root@blu tomcat]# docker login -u blucoding Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded ``` - **第三步,将自己的镜像改名为标准格式:【作者名】/【镜像名】:版本号** - **注意作者名要和你刚刚注册的账号名一致,否则会被拒绝提交** ```bash docker tag 0d120b6ccaa8 blucoding/centos:1.0 ``` - **第四步,提交镜像** ```bash docker push blucoding/centos:1.0 ``` ### 5.3.4 阿里云镜像服务上发布自己的镜像 - **第一步,在阿里云的容器镜像服务中创建一个命名空间:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture_1/raw/master/2020112319191141.png) - **第二步,创建一个镜像仓库:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture_1/raw/master/2020112319224555.png) ![在这里插入图片描述](https://gitee.com/fakerlove/picture_1/raw/master/20201123192252564.png) - **第三步,点击镜像仓库查看详细信息和操作指南:** ![在这里插入图片描述](https://gitee.com/fakerlove/picture_1/raw/master/20201123192737299.png) - **第四步,在服务器上退出刚刚登录的 dockerhub 账户:** ```bash docker logout ``` - **第五步,登录阿里云账户,密码是阿里云镜像仓库服务的密码:** ```bash sudo docker login --username=杀手的假期 registry.cn-hangzhou.aliyuncs.com ``` - **第六步,修改镜像名称:** ```bash sudo docker tag [镜像id] registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号] ``` - **第五步,发布镜像:** ```bash sudo docker push registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号] ``` # 6.Docker 网络 ~~~bash ip addr ~~~ ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105083621897.png) 一共有三个网卡 lo 是自己本身的,eth0 是 阿里云服务器创建的,docker0是 dokcer创建的网卡,用来管理网络 ## 6.1 桥接模式 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105093641686.png) > 只要安装了docker,就会分配一个ip地址,就是桥接模式。使用的技术是evth-pair 技术 再次输入 ~~~bash ip addr ~~~ ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105093841674.png) > **每次启动一个容器,就会多一个网卡。这就是evth-pair 技术** > > **容器和容器之间是可以ping 通的** 容器与容器之间能够用ip ping通,但是不能够用 名字ping 通 ## 6.2 容器连接--link > 使用了link ,就能够用 名字进行ping 通了 先删除container ~~~bash docker rm tomcat01 docker rm tomcat02 ~~~ 创建 ~~~shell docker run -d --name tomcat01 tomcat docker run -d --name tomcat02 --link tomcat01 tomcat ~~~ ping ~~~bash docker exec -it tomcat02 ping tomcat01 ~~~ 但是,反向不能够ping 通 ~~~bash docker exec -it tomcat01 ping tomcat02 ~~~ ## 6.3 自定义网络 > 查看所有的docker 网络 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105105522009.png) 网络模式 * bridge 桥接模式,默认 * none 不设置热呢配置 * host 和宿主机连接配置 * container 容器间连通(局限很大) ### 创建自定义网络 ~~~bash docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynetwork ~~~ 查看 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105110258089.png) 查看具体信息 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105110403135.png) ### 创建容器连接上自定义网络 ~~~bash docker run -d -P --name tomcat-net-01 --net mynetwork tomcat docker run -d -P --name tomcat-net-02 --net mynetwork tomcat ~~~ 检查网络,就会发现,服务已经在上面 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105110646656.png) ~~~xml [ { "Name": "mynetwork", "Id": "ac8e8f17715318a7b238e1a54e8be50f1d1953b305b6c2318e622a69de7efbbe", "Created": "2021-01-05T11:01:40.300113826+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/24", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "5948c7b4c7cdce9e5b5f29611069a18e0c6931e161f6ac66c1754c118ec390e2": { "Name": "tomcat-net-02", "EndpointID": "dd8281b34a371ec6b0dcb8ba4d1b742c957fd0f8a1a1c4f22f807ea239f296a2", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/24", "IPv6Address": "" }, "c29a840804c9a73933649dbe7db2310471bb21a58f6ec6111818f0c673d87e1a": { "Name": "tomcat-net-01", "EndpointID": "482dddfbda360b55735730841bf3f6200df84798b1449d4886abe4c251538f75", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/24", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] ~~~ ### 测试 ~~~bash docker exec -it tomcat-net-01 ping tomcat-net-02 ~~~ ## 6.4 网络连通 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105111229372.png) 实现docker0 和mynet 连通 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105111412298.png) ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105111453018.png) ~~~bash docker network connect mynetwork tomcat01 ~~~ 实现效果 就是把tomcat01 放置在了上面 ![](https://gitee.com/fakerlove/picture/raw/master/image-20210105111745292.png) > 文章链接 https://gitee.com/fakerlove/docker @[TOC] # 7. Docker-Compose ## 7.1 介绍 ### 7.1.1 概念 > Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 > Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。 ### 7.1.2 安装 安装官网 ~~~bash https://docs.docker.com/compose/install/ ~~~ 安装在centos 上 * 需要以下安装环境 `py-pip`,`python-dev`,`libffi-dev`,`openssl-dev`,`gcc`,`libc-dev`,和`make`。 * 下载 ```bash sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose ``` 建议使用备用地址 ```bash sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose ``` * 设置权限 ```bash sudo chmod +x /usr/local/bin/docker-compose ``` * 设置快捷方式 ```bash sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose ``` * 检查是否成功 ```bash docker-compose --version ``` 如果下载太慢的话,使用这个 ```bash sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version ``` 或者直接使用pip 安装 centos7 可以选择如下安装 ```bash yum -y install python-pip pip install --upgrade pip pip install docker-compose docker-compose -version ``` centos8 需要使用pip3 命令安装 ~~~bash sudo pip3 install docker-compose ~~~ ## 7.2 使用 - 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。 - 定义组成应用程序的服务,`docker-compose.yml` 以便它们可以在隔离的环境中一起运行。 - 运行 `docker-compose up` Compose启动并运行您的整个应用程序。 `docker-compose.yml` 长成这样子 ````yml version: '2.0' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {} ```` ### 7.2.1 快速开始 ~~~bash mkdir composetest cd composetest ~~~ 创建app.py ~~~python import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count) ~~~ 同目录下创建requirements.txt ~~~txt flask redis ~~~ 创建Dockerfile ~~~dockerfile FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"] ~~~ 内容讲解 ~~~bash 从Python 3.7映像开始构建映像。 将工作目录设置为/code。 设置flask命令使用的环境变量。 安装gcc和其他依赖项 复制requirements.txt并安装Python依赖项。 向图像添加元数据以描述容器正在侦听端口5000 将.项目中的当前目录复制到.映像中的工作目录。 将容器的默认命令设置为flask run。 ~~~ 创建docker-compose.yml ~~~yml version: "3.9" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" ~~~ 目录 ![image-20210122201900522](https://img-blog.csdnimg.cn/img_convert/bce627d6680f2abddbb5b5fbd053f4af.png) 启动 ~~~bash docker-compose up ~~~ 观察连接 ~~~bash http://localhost:5000/ ~~~ ### 7.2.2 搭建自己的博客wordpress ```bash mkdir my_wordpress cd my_wordpress ``` 创建 docker-compose.yml ~~~yaml version: '3.3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} ~~~ 启动项目 ~~~bash docker-compose up -d ~~~ ### 7.2.3 搭建redis 集群 抄袭别人的 ~~~bash mkdir -p docker/redis docker/sentinel cd docker/redis touch docker-compose.yml ~~~ 下一步编辑docker-compose.yml ~~~yaml version: '3' services: master: image: redis container_name: redis-master command: redis-server --requirepass 123456 ports: - 6379:6379 slave1: image: redis container_name: redis-slave-1 ports: - 6380:6379 command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 slave2: image: redis container_name: redis-slave-2 ports: - 6381:6379 command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 ~~~ 进入 ~~~ cd ../sentinel touch docker-compose.yml sentinel.conf ~~~ 编辑docker-compose.yml ~~~bash version: '3' services: sentinel1: image: redis container_name: redis-sentinel-1 ports: - 26379:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf sentinel2: image: redis container_name: redis-sentinel-2 ports: - 26380:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf sentinel3: image: redis container_name: redis-sentinel-3 ports: - 26381:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf ~~~ 编辑 sentinel.conf ~~~bash port 26379 dir /tmp sentinel monitor mymaster 172.19.55.101 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes sentinel auth-pass mymaster 123456 ~~~ 注意点 > ① 第三行中 mymaster 是可以自定义集群的名字,如果使用其他语言连接集群,需要写上该名字。 > > ② 192.168.223.129是我虚拟机的ip,请换成自己的ip,不要127.0.0.1 否则会链接到你的应用程序去,写IP就可以。 > > ③ 那个2呢,是因为我有3台哨兵,2个投票超过50%了,所以设置2即可,如果是更多,设置超过50%概率就好,自己喜欢。 复制 ~~~bash sudo cp sentinel.conf sentinel1.conf sudo cp sentinel.conf sentinel2.conf sudo cp sentinel.conf sentinel3.conf ~~~ ![image-20210123193328866](https://img-blog.csdnimg.cn/img_convert/f41a2bcb5bbd794e5850356de89ee6bf.png) 查看sentinel ![image-20210123193253865](https://img-blog.csdnimg.cn/img_convert/43994ad4e1cc4b6f79cf9784f235bf23.png) 分别启动 进入redis 中 ~~~bash cd /usr/local/docker/redis ~~~ 启动 ~~~bash sudo docker-compose up -d ~~~ 进入sential ~~~bash cd /usr/local/docker/sentinel/ ~~~ 启动 ~~~bash sudo docker-compose up -d ~~~ 查看是否成功 ~~~bash docker ps ~~~