Skip to content
文章链接
bash
https://gitee.com/fakerlove/docker

Docker 教程

1. 简介

1.1 概念

Docker 是世界领先的软件容器平台。 开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。 运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。 企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

1.2 优点

image

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

在这里插入图片描述 查看已下载的镜像:

bash
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB
123

使用阿里云镜像加速

在阿里云的容器镜像服务中,找到镜像加速器,选择CentOS,执行里面的代码即可: 在这里插入图片描述

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镜像的执行流程回顾

在这里插入图片描述

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

版本可以在官方文档中查询:在这里插入图片描述

删除镜像

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 <image name>
// 使用镜像创建并启动一个容器(若本地没有该镜像,则会先从远端下载,每次run都会生成一个容器,嗯,轻量~)
docker run hub.c.163.com/library/hello-world:latest
//列出正在运行的容器
docker ps
// 列出所有容器(包括Exited)
docker ps -a
// 启动指定的容器
docker start <container id>
// 停止指定的容器
docker stop <container id>
// 停止所有运行中的容器
docker stop $(docker ps -q)
// 删除指定容器
docker rm <container id>
//删除所有容器
docker rm $(docker ps -aq)
//停止并删除容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
// 删除指定镜像(删除镜像前须先停止并删除容器)
docker rmi <image id>
// 重启容器
docker restart <container id>
// 创建一个新的容器并运行一个命令
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 <container id>:文件路径 主机目标路径
// 主机拷贝到容器
docker cp 主机文件路径 <container id>:文件路径
//查看容器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

外网测试连接:在这里插入图片描述

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
<!doctype html><html lang="en"><head><title>HTTP Status 404 Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/9.0.39</h3></body></html>\

外网测试访问(连接成功,但是报404,因为这个 tomcat 是被阉割的):image

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端口(第一次访问会非常非常慢):

在这里插入图片描述第一次访问,需要添加用户名和密码:在这里插入图片描述在这里插入图片描述看看就好,反正不好用:

在这里插入图片描述

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 测试连接:在这里插入图片描述使用 Navicat 创建一个 test-blu 数据库:在这里插入图片描述进入主机的 /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

在这里插入图片描述

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                  
<missing>           4 days ago          /bin/sh -c #(nop)  EXPOSE 3306 33060            0B                  
<missing>           4 days ago          /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B                  
<missing>           4 days ago          /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B                 
<missing>           4 days ago          /bin/sh -c #(nop) COPY file:f9202f6b715c0e78…   13.1kB              
<missing>           4 days ago          /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B                  
<missing>           4 days ago          /bin/sh -c {   echo mysql-community-server m…   313MB               
<missing>           4 days ago          /bin/sh -c echo "deb http://repo.mysql.com/a…   55B                 
<missing>           4 days ago          /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.32-…   0B                  
<missing>           4 days ago          /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0B                  
<missing>           4 days ago          /bin/sh -c set -ex;  key='A4A9406876FCBD3C45…   2.61kB              
<missing>           4 days ago          /bin/sh -c apt-get update && apt-get install…   52.2MB              
<missing>           4 days ago          /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B                  
<missing>           4 days ago          /bin/sh -c set -eux;  savedAptMark="$(apt-ma…   4.17MB              
<missing>           4 days ago          /bin/sh -c #(nop)  ENV GOSU_VERSION=1.12        0B                  
<missing>           4 days ago          /bin/sh -c apt-get update && apt-get install…   9.34MB              
<missing>           4 days ago          /bin/sh -c groupadd -r mysql && useradd -r -…   329kB               
<missing>           4 days ago          /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           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的时候就一直出错 在这里插入图片描述 最后是发现因为把防火墙关了,把防火墙打开就可以了。 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 阿里云镜像服务上发布自己的镜像

  • 第一步,在阿里云的容器镜像服务中创建一个命名空间:在这里插入图片描述
  • 第二步,创建一个镜像仓库:

在这里插入图片描述在这里插入图片描述

  • 第三步,点击镜像仓库查看详细信息和操作指南:

在这里插入图片描述

  • 第四步,在服务器上退出刚刚登录的 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

image

一共有三个网卡

lo 是自己本身的,eth0 是 阿里云服务器创建的,docker0是 dokcer创建的网卡,用来管理网络

6.1 桥接模式

image

只要安装了docker,就会分配一个ip地址,就是桥接模式。使用的技术是evth-pair 技术

再次输入

bash
ip addr

image

每次启动一个容器,就会多一个网卡。这就是evth-pair 技术

容器和容器之间是可以ping 通的

容器与容器之间能够用ip ping通,但是不能够用 名字ping 通

使用了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 网络

image

网络模式

  • bridge 桥接模式,默认
  • none 不设置热呢配置
  • host 和宿主机连接配置
  • container 容器间连通(局限很大)

创建自定义网络

bash
docker network create --driver bridge --subnet 192.168.0.0/24  --gateway 192.168.0.1 mynetwork

查看

image

查看具体信息

image

创建容器连接上自定义网络

bash
docker run -d -P --name tomcat-net-01 --net mynetwork tomcat
docker run -d -P --name tomcat-net-02 --net mynetwork tomcat

检查网络,就会发现,服务已经在上面

image

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 网络连通

image

实现docker0 和mynet 连通

image

image

bash
docker network connect mynetwork tomcat01

实现效果

就是把tomcat01 放置在了上面

image

文章链接 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-pippython-devlibffi-devopenssl-devgcclibc-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

启动

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

查看sentinel

image-20210123193253865

分别启动 进入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