1 Star 1 Fork 3

fakerlove/Docker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-1.0

文章链接

https://gitee.com/fakerlove/docker

Docker 教程

1. 简介

1.1 概念

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

1.2 优点

Docker容器比虚拟机轻量多了!

1.3 安装

环境准备

# 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"

安装

安装教程

https://docs.docker.com/engine/install/centos/

第一步:不管有没有,先卸载旧版本:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

第二步:安装需要的包:

yum install -y yum-utils

第三步:设置镜像的仓库(选择国内阿里云的地址):

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第四步:更新yum软件包的索引,确保你下载的是最新版:

yum makecache fast

centos 8

yum makecache 

第五步:安装docker相关的内容:

ce表示社区版,ee表示企业版

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 版本过低了。

配置阿里镜像

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

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:

systemctl start docker

第七步:查看docker版本(我的版本是19.03.13):

docker version

第八步:测试hello-world:

docker run hello-world

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

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

使用阿里云镜像加速

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

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):
# 卸载软件
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的帮助命令

# 查看 docker 的版本
docker version
# 查看 docker 的详细信息(系统信息、镜像和容器的数量)
docker info
# 查看 docker 的所有命令
docker --help

2.2 docker的镜像命令

查看镜像

docker images

具体内容

# 查看所有的本地镜像
[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

搜索镜像

docker search mysql

具体内容

# 从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]                

下载镜像

docker pull mysql

具体内容

# 下载镜像 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

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

删除镜像

# 根据镜像的ID删除
[root@izbp10tup89om84qulgxbsz ~]# docker rmi -f 1b12f2e9257b

# 删除所有的镜像
[root@izbp10tup89om84qulgxbsz ~]# docker rmi -f $(docker images -aq)

2.3 docker的容器命令

说明:容器需要通过镜像创建,首先下载一个 centos 镜像:

[root@izbp10tup89om84qulgxbsz ~]# docker pull centos

docker run [可选参数] image

# 参数说明
--name="Name"	给容器起名
-d				后台方式运行
-it				使用交互方式运行,进入容器查看内容
-p				(小写p)指定容器的端口
	-p 主机端口:容器端口	(常用)
	-p 容器端口
-P				(大写P)随机指定端口

启动 centos镜像并进入容器,查看目录并退出容器:

[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 ~]# 

查看所有容器

docker ps -a

具体内容

# 查看正在运行中的容器
[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

退出容器

# 容器停止并退出
exit
# 容器不停止退出
Ctrl + P + Q

删除容器

# 根据容器id删除容器(不能删除正在运行中的容器)
docker rm 容器id
# 强制删除指定容器(正在运行中的容器也可删除)
docker rm -f 容器id
# 删除所有的容器
docker rm -f $(docker ps -aq)

启动和停止容器

# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止当前正在运行中的容器
docker stop 容器id
# 强制停止当前容器
docker kill 容器id

容器的常用其他命令:

后台启动容器:

# 注意:后台启动后,该容器仍然是停止状态
[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

日志命令

# 显示指定行数的日志
docker logs -tf --tail 10 fa3301b94b9f

# 参数解释
-tf			显示日志
--tail 10	显示日志条数

查看容器中的进程信息

[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

查看容器的元数据信息:

docker inspect fa3301b94b9f

进入当前正在运行中的容器

# 方式1:进入容器后开启一个新的终端
[root@izbp10tup89om84qulgxbsz ~]# docker exec -it fa3301b94b9f /bin/bash
[root@fa3301b94b9f /]# 
# 方式2: 进入容器正在进行的终端,不会启动新进程
[root@izbp10tup89om84qulgxbsz ~]# docker attach fa3301b94b9f    
[root@fa3301b94b9f /]#

从容器内拷贝文件至主机:

docker cp 容器id:容器内路径 目的主机的路径
  • 在容器的home目录下创建一个文件:
[root@fa3301b94b9f /]# cd home
[root@fa3301b94b9f home]# touch blu.txt
[root@fa3301b94b9f home]# ls
blu.txt
  • 将文件拷贝至主机:
[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

将当前容器制作成镜像:

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 总结

// 列出本地已有镜像
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

# 下载 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

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

# 查看容器
[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

# 下载镜像
[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 是被阉割的):

3.3 部署 elastic search

# 下载运行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 可视化面板的安装:
# 下载并运行 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 命令挂载目录:

[root@izbp10tup89om84qulgxbsz home]# docker run -it -v /home/ceshi:/home centos /bin/bash

此时,容器内的 /home 目录就与主机的 /home/ceshi 目录实现了双向绑定。 即使容器被关闭或删除了,数据依然可以保留。

使用 docker inspect 容器id 命令可以查看到详细的目录挂载信息:

"Mounts": [
	{
		"Type": "bind",
		"Source": "/home/ceshi",
		"Destination": "/home",
		"Mode": "",
		"RW": true,
		"Propagation": "rprivate"
	}
]

4.2 实战:MySQL同步数据

#搜索镜像
[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 的目录:

[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

具名挂载 和 匿名挂载

指定路径挂载		-v 主机目录:容器目录
具名挂载			-v 卷名:容器目录
匿名挂载			-v 容器目录

匿名挂载 nginx 示例(不推荐):

# 匿名挂载启动 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 示例(推荐):

# 具名挂载启动 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

拓展:

默认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 具名和匿名挂载

匿名

docker run -d -P --name naginx-1 -v /ect/nagix nginx 

不写路径,然后docker 自动生成路径进行挂载

具名

docker run -d -P --name nagix02 -v nagix_1:/ect/nagix nagix

写路径的,但是路径并不是绝对路径,而是卷名

查看卷名

docker volume inspect

拓展

docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:ro nagix

ro readonly 只读,只能进行宿主机来改变

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 文件,写入以下内容:

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/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的数据同步

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 的指令

FROM				# 指定基础镜像
MAINTAINER			# 指定维护者信息(姓名+邮箱)
RUN					# 镜像构建时需要运行的命令
ADD					# 在镜像中添加内容
WORKDIR				# 设置当前工作目录
VOLUME				# 设置卷,挂载主机目录
EXPOSE				# 指定暴露端口
CMD					# 指定容器启动时要运行的命令(只有最后一个CMD指令会生效)
ENTRYPOINT			# 指定容器启动时要运行的命令,启动时可以追加命令参数
ONBUILD				# 当构建一个被继承 DockerFile 时会执行的指令
COPY				# 类似ADD,将文件拷贝至镜像中
ENV					# 构建时设置环境变量

5.3 制作自己的镜像

5.3.1 创建一个自己的 CentOS 镜像:

编辑命令

vim mydockerfile-centos

输入命令

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

docker build -f mydockerfile-centos -t mycentos:0.1 .

docker history 命令查看指定镜像的构建过程(以mysql:5.7为例):

[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=

https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/  
yum makecache
systemctl restart docker

5.3.2 创建一个 Tomcat 镜像:

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
[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/
  • 第二步,在服务器上登录账号:
[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
  • 第三步,将自己的镜像改名为标准格式:【作者名】/【镜像名】:版本号
  • 注意作者名要和你刚刚注册的账号名一致,否则会被拒绝提交
docker tag 0d120b6ccaa8 blucoding/centos:1.0
  • 第四步,提交镜像
docker push blucoding/centos:1.0

5.3.4 阿里云镜像服务上发布自己的镜像

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

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

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

在这里插入图片描述

  • 第四步,在服务器上退出刚刚登录的 dockerhub 账户:
docker logout
  • 第五步,登录阿里云账户,密码是阿里云镜像仓库服务的密码:
sudo docker login --username=杀手的假期 registry.cn-hangzhou.aliyuncs.com
  • 第六步,修改镜像名称:
sudo docker tag [镜像id] registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]
  • 第五步,发布镜像:
sudo docker push registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]

6.Docker 网络

ip addr

一共有三个网卡

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

6.1 桥接模式

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

再次输入

ip addr

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

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

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

6.2 容器连接--link

使用了link ,就能够用 名字进行ping 通了

先删除container

docker rm tomcat01
docker rm tomcat02

创建

docker run -d --name tomcat01 tomcat
docker run -d --name tomcat02 --link tomcat01  tomcat

ping

docker exec -it tomcat02 ping tomcat01

但是,反向不能够ping 通

docker exec -it tomcat01 ping tomcat02

6.3 自定义网络

查看所有的docker 网络

网络模式

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

创建自定义网络

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

查看

查看具体信息

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

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

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

[
    {
        "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": {}
    }
]

测试

docker exec -it tomcat-net-01 ping tomcat-net-02

6.4 网络连通

实现docker0 和mynet 连通

docker network connect mynetwork tomcat01

实现效果

就是把tomcat01 放置在了上面

文章链接 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 安装

安装官网

https://docs.docker.com/compose/install/

安装在centos 上

  • 需要以下安装环境

    py-pippython-devlibffi-devopenssl-devgcclibc-dev,和make

  • 下载

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 curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /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
    

如果下载太慢的话,使用这个

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 可以选择如下安装

yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version

centos8 需要使用pip3 命令安装

sudo pip3 install docker-compose

7.2 使用

  • 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
  • 定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
  • 运行 docker-compose up Compose启动并运行您的整个应用程序。

docker-compose.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 快速开始

mkdir composetest
cd composetest

创建app.py

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

flask
redis

创建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"]

内容讲解

从Python 3.7映像开始构建映像。
将工作目录设置为/code。
设置flask命令使用的环境变量。
安装gcc和其他依赖项
复制requirements.txt并安装Python依赖项。
向图像添加元数据以描述容器正在侦听端口5000
将.项目中的当前目录复制到.映像中的工作目录。
将容器的默认命令设置为flask run。

创建docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

目录

image-20210122201900522

启动

docker-compose up

观察连接

http://localhost:5000/

7.2.2 搭建自己的博客wordpress

mkdir my_wordpress
cd   my_wordpress

创建 docker-compose.yml

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

启动项目

docker-compose up -d

7.2.3 搭建redis 集群

抄袭别人的

mkdir -p docker/redis docker/sentinel
cd docker/redis
touch docker-compose.yml

下一步编辑docker-compose.yml

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

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

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%概率就好,自己喜欢。

复制

sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf

image-20210123193328866

查看sentinel

image-20210123193253865

分别启动 进入redis 中

cd /usr/local/docker/redis

启动

sudo docker-compose up -d

进入sential

cd /usr/local/docker/sentinel/

启动

sudo docker-compose up -d 

查看是否成功

docker ps 
木兰宽松许可证, 第1版 木兰宽松许可证, 第1版 2019年8月 http://license.coscl.org.cn/MulanPSL 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第1版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的一方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括仅因您或他人修改“贡献”或其他结合而将必然会侵犯到的专利权利要求。如您或您的“关联实体”直接或间接地(包括通过代理、专利被许可人或受让人),就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 条款结束。 如何将木兰宽松许可证,第1版,应用到您的软件 如果您希望将木兰宽松许可证,第1版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [2019] [name of copyright holder] [Software Name] is licensed under the Mulan PSL v1. You can use this software according to the terms and conditions of the Mulan PSL v1. You may obtain a copy of Mulan PSL v1 at: http://license.coscl.org.cn/MulanPSL THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v1 for more details. Mulan Permissive Software License,Version 1 Mulan Permissive Software License,Version 1 (Mulan PSL v1) August 2019 http://license.coscl.org.cn/MulanPSL Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v1 (this License) with following terms and conditions: 0. Definition Software means the program and related documents which are comprised of those Contribution and licensed under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, or are controlled by, or are under common control with a party to this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. Contribution means the copyrightable work licensed by a particular Contributor under this License. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed, excluding of any patent claims solely be infringed by your or others’ modification or other combinations. If you or your Affiliates directly or indirectly (including through an agent, patent licensee or assignee), institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability The Software and Contribution in it are provided without warranties of any kind, either express or implied. In no event shall any Contributor or copyright holder be liable to you for any damages, including, but not limited to any direct, or indirect, special or consequential damages arising from your use or inability to use the Software or the Contribution in it, no matter how it’s caused or based on which legal theory, even if advised of the possibility of such damages. End of the Terms and Conditions How to apply the Mulan Permissive Software License,Version 1 (Mulan PSL v1) to your software To apply the Mulan PSL v1 to your work, for easy identification by recipients, you are suggested to complete following three steps: i. Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii. Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii. Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [2019] [name of copyright holder] [Software Name] is licensed under the Mulan PSL v1. You can use this software according to the terms and conditions of the Mulan PSL v1. You may obtain a copy of Mulan PSL v1 at: http://license.coscl.org.cn/MulanPSL THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v1 for more details.

简介

暂无描述 展开 收起
MulanPSL-1.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/fakerlove/docker.git
git@gitee.com:fakerlove/docker.git
fakerlove
docker
Docker
master

搜索帮助