docker学习笔记

Docker

Docker 常用命令

#查看下载的镜像
docker images

阿里云镜像加速

run 命令执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nY1Fydsb-1631803233563)(/Users/LAY/Library/Application Support/typora-user-images/image-20210710191439074.png)]

底层原理

docker怎么工作?

Docker是一个Client- Server结构的系统,Docker daemon 运行在主机上,通过Socket从客户端访问!

Docker Server接收到Docker Client命令后就会执行命令。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlkUG4zz-1631803233565)(/Users/LAY/Library/Application Support/typora-user-images/image-20210710193059225.png)]

为了能够让容器的这个根目录看起来更“真实”,我们一般会在这个容器的根目录下挂载 一个完整操作系统的文件系统,比如 Ubuntu16.04 的 ISO。这样,在容器启动之后,我们在容 器里通过执行 “ls /” 查看根目录下的内容,就是 Ubuntu 16.04 的所有目录和文件。 而这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容 器镜像”。它还有一个更为专业的名字,叫作:rootfs(根文件系统)。 所以,一个最常见的 rootfs,或者说容器镜像,会包括如下所示的一些目录和文件,比如 /bin,/etc,/proc 等等:

Docker的常用命令

帮助命令

docker version #显示docker的版本信息
docker info 
docker --help #显示docker所有命令

镜像命令

**docker images **查看所有本地的主机上的镜像

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker images
[sudo] password for parallels: 
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    bc11b176a293   38 hours ago   9.14kB

#description
respository 仓库源
tag 			镜像标签
image id	 镜像id
created		创建时间
size			大小

#可选项
Options:
  -a, --all             # 列出所有的镜像
  -q, --quiet        #只显示镜像的id

**docker search **

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11108     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4211      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   824                  [OK]

#可选项,通过收藏来过滤
--filter=stars=3000 #过滤收藏3000以下的搜索
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker search --filter=STARS=3000 mysql
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   11108     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4211      [OK]   

docker pull 下载镜像

#下载镜像docker pull 镜像名[:tag]
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker pull mysql
Using default tag: latest #默认为最新版本

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker pull mysql/mysql-server
Using default tag: latest
latest: Pulling from mysql/mysql-server
02112ea2417b: Pull complete #分层下载,docker image的核心联合文件系统
c2599233ad6a: Pull complete 
ad95aaa5c74e: Pull complete 
64eb680a58e2: Pull complete 
6f7a300970c0: Pull complete 
1c44925848bc: Pull complete 
fff02a04d6b8: Pull complete 
Digest: sha256:56ec3d7509327c66e4b8b22c72ecd56572ae1f87c91ef806c80fa09c7707c845 #签名
Status: Downloaded newer image for mysql/mysql-server:latest
docker.io/mysql/mysql-server:latest#真实地址

docker rmi 删除镜像

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker rmi -f bc11b176a293 # 根据id删除指定的容器
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker rmi -f $(sudo docker images -aq) # 删除全部容器
 

容器命令

说明:我们有了镜像才可以创建容器,Linux,下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

“容器的本质是一种特殊的进程",Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。这 么一折腾,进程就真的被“装”在了一个与世隔绝的房间里,而这些房间就是 PaaS 项目赖以生 存的应用“沙盒”。

docker run [可选参数] image

#参数说明
--name="Name"   容器名字 tomcat01 	tomcat02
-d						 后台方式运行,ja  nohup
-it						 使用交互方式运行,进入容器查看内容
-p						 指定容器的端口 -p 8080:8080
		-p ip:主机端口:容器端口
		-p 主机端口:容器端口	(常用)
		-p 容器端口
		容器端口
-P						 随机指定端口

-it 参数告诉了 Docker 项目在启动容器后,需要给我们分配一个文本输入 / 输出环境,也就 是 TTY,跟容器的标准输入相关联,这样我们就可以和这个 Docker 容器进行交互了。而 /bin/sh 就是我们要在 Docker 容器里运行的程序。

#测试,启动并进入容器, 使用-it进行交互,需要使用控制台,常用的控制台就是/bin/bash
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -it centos /bin/bash
[root@46f5dcc6debf(镜像ID) /]# ls	 #查看容器内的centos,基础版本,很多命令都是不完善的
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#退出容器
[root@46f5dcc6debf /]# exit
exit
parallels@ubuntu-linux-20-04-desktop:~$ 

列出所有运行的容器

# docker ps 命令
   # 列出当前运行的容器
-a # 列出当前运行的容器+历史运行的容器
-n=? # 显示最近创建的容器
-q # 
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                      PORTS     NAMES
46f5dcc6debf   centos         "/bin/bash"   3 minutes ago   Exited (0) 51 seconds ago             infallible_kilby
f200e33d9ec8   bc11b176a293   "/hello"      39 hours ago    Exited (0) 39 hours ago               sad_tu
fd46da78e03b   bc11b176a293   "/hello"      39 hours ago    Exited (0) 39 hours ago               eloquent_poincare
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker ps 
[sudo] password for parallels: 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


退出容器

exit # 直接容器停止并退出,退出后容器内的数据不会消失
Ctrl + P + Q # 容器不停止并退出

删除容器

docker rm 容器ID										# 删除指定容器
docker rm -f $(docker ps -aq)				 # 删除所有容器
docker ps -a -q|xargs docker rm       # 删除所有容器(linux 命令)

启动和停止容器的操作

docker start 容器ID		   # 启动容器
docker restart 	容器ID	 # 重启容器
docker stop		容器ID     # 停止容器
docker kill		容器ID     # 强制停止容器

常用其他命令

后台启动容器

# 命令 docker run -d 镜像名!
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -d centos
41dae298148c930a948abd51d751bdb0438de8b2564546789b1cb04345ac6d52

# 问题docker ps, 发现centos 停止了

# 常见的坑, docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx, 容器启动后,发现自己没有提供服务,就会立即停止,它会觉得没有程序了

查看日志

docker logsc -f -t --tail  容器,没有日志

# 没有日志可以自己编写一个shell脚本
"while true; do echo sun; sleep 2; done"

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
c22151f43c64   centos    "/bin/sh -c 'while t…"   3 seconds ago    Up 2 seconds                          heuristic_jennings

# 显示日志
-tf						# 显示日志
--tail number  # 显示日志条数

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker logs -tf --tail 10  c22151f43c64
2021-07-13T09:34:48.155643846Z sun
2021-07-13T09:34:49.160279006Z sun
2021-07-13T09:34:50.164862432Z sun
2021-07-13T09:34:51.172406010Z sun
2021-07-13T09:34:52.180655227Z sun
2021-07-13T09:34:53.186906413Z sun
2021-07-13T09:34:54.195777161Z sun
2021-07-13T09:34:55.205030832Z sun
2021-07-13T09:34:56.212517511Z sun
2021-07-13T09:34:57.220231077Z sun
2021-07-13T09:34:58.223949472Z sun
2021-07-13T09:34:59.232298894Z sun
2021-07-13T09:35:00.236181634Z sun

查看容器中的进程信息ps

# 命令 docker top 容器ID
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker top c22151f43c64
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                52352               52331               0                   19:39               ?                   00:00:00            /bin/sh -c while true; do echo sun; sleep 1; done
root                52400               52352               0                   19:39               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元数据

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker inspect c22151f43c64
[
    {
        "Id": "c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1",
        "Created": "2021-07-13T09:34:09.666087403Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true; do echo sun; sleep 1; done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 52352,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-13T11:39:42.639344726Z",
            "FinishedAt": "2021-07-13T11:36:49.839989355Z"
        },
        "Image": "sha256:a0477e85b8aebf57d58bfa74a6598eccfd3fcc43a78c8e29c380cde2e7300a1b",
        "ResolvConfPath": "/var/lib/docker/containers/c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1/hostname",
        "HostsPath": "/var/lib/docker/containers/c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1/hosts",
        "LogPath": "/var/lib/docker/containers/c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1/c22151f43c644651d47bf9865a35441acd3bfac2977f7e75e0fc0f3545fc00e1-json.log",
        "Name": "/heuristic_jennings",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/844344253c653bba1b624ea737ab8f13a9b6ce3d316f4408cb026d60e7abcf87-init/diff:/var/lib/docker/overlay2/0b0851a17a3e2db993e1979fb59b5f2415d36fca9d03c0d6bcdb78e3b1f6b606/diff",
                "MergedDir": "/var/lib/docker/overlay2/844344253c653bba1b624ea737ab8f13a9b6ce3d316f4408cb026d60e7abcf87/merged",
                "UpperDir": "/var/lib/docker/overlay2/844344253c653bba1b624ea737ab8f13a9b6ce3d316f4408cb026d60e7abcf87/diff",
                "WorkDir": "/var/lib/docker/overlay2/844344253c653bba1b624ea737ab8f13a9b6ce3d316f4408cb026d60e7abcf87/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "c22151f43c64",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true; do echo sun; sleep 1; done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "d960ce0a683b30e6071b6f5ed48c07593041426326abfa29efc6306d86de4230",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/d960ce0a683b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "7af74a0d5fa9dd19294860a473455c46d8b6b55e98b03cb51ec7e84ff6da9f62",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ed1b1539418397c5c2f0bf10fd4b259670c249630a528b06dfe24be094af712e",
                    "EndpointID": "7af74a0d5fa9dd19294860a473455c46d8b6b55e98b03cb51ec7e84ff6da9f62",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行,需要进入容器,修改一下配置

# 命令
docker exec -it 容器ID bashShell

# 测试
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker exec -it c22151f43c64 /bin/bash
[root@c22151f43c64 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


# 方式二
docker attach 容器ID
# 测试
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker attach  73b0e722f0d2
[root@73b0e722f0d2 /]# 
正在执行的代码


# docker exec       # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach		  # 进入容器正在执行终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

# 查看当前主机目录
parallels@ubuntu-linux-20-04-desktop:~$ ls 
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

# 进入容器内
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker attach 73b0e722f0d2
[root@73b0e722f0d2 /]# cd home
[root@73b0e722f0d2 home]# ls
# 在容器内新建一个文件
[root@73b0e722f0d2 home]# touch test.java
[root@73b0e722f0d2 home]# exit

# 进行拷贝测试
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker cp 73b0e722f0d2:/home/test.java /home

# 拷贝是一个手动过程,未来我们使用-v 卷的技术,可以实现,自动同步 /home /home

docker学习笔记_第1张图片

练习

安装Nginx

#search, pull, images

# -d 后台运行
# --name 重命名
# -p 将宿主机的端口暴露
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -d -p 3344:80 --name nginx01 nginx
d587d54b34be315f2cc4bff0b19b5b80c882d6f5e9a26a29f35538b87ea986b9
parallels@ubuntu-linux-20-04-desktop:~$ curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# 进入容器
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker exec -it nginx01 /bin/bash
root@d587d54b34be:/# ls 
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var

思考:我们每次改nginx配置文件,都需要进入容器内部?十分麻烦,要是可以在容器外提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?通过-v数据卷技术

安装tomcat

# 启动运行
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -d -p 3345:80 --name tomcat01 tomcat

# 测试访问没有问题

# 进入容器,发现Linux命令少了,没有webapps,是因为镜像默认为最小的镜像,所有不必要的都被删除了,但保证了最小可运行环境。
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker exec -it tomcat01 /bin/bash
root@1b0286b792b0:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@1b0286b792b0:/usr/local/tomcat# ll
bash: ll: command not found
root@1b0286b792b0:/usr/local/tomcat# cd webapps
root@1b0286b792b0:/usr/local/tomcat/webapps# ls

思考:我们以后部署项目,如果每次都要进入容器十分麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了

部署 es + kibana

# es 暴露的端口很多!
# es 十分消耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置,见docker网络

# 启动
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" # 集群 elasticsearch:7.13.3

# docker stats 查看cpu的状态

# 测试es是否成功
parallels@ubuntu-linux-20-04-desktop:~$ curl localhost:9200
{
  "name" : "d3a70695f840",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "iZd0eU3_RsyY-9D3PEavUA",
  "version" : {
    "number" : "7.13.3",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "5d21bea28db1e89ecc1f66311ebdec9dc3aa7d64",
    "build_date" : "2021-07-02T12:06:10.804015202Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

# es占用内存容量过高,限制其内存,修改配置文件 -e 环境配置修改

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.13.3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrmY8BU0-1631803233566)(/Users/LAY/Desktop/笔记/未命名文件.png)]

可视化

  • Portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
  • Rancher(CI/CD再用)

什么是portainer

Docker图形化界面管理工具!提供一个后台面板供我们操作!

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wrCAhq2-1631803233571)(/Users/LAY/Library/Application Support/typora-user-images/image-20210715150438260.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79QXVDTS-1631803233571)(/Users/LAY/Library/Application Support/typora-user-images/image-20210715150600511.png)]

Docker镜像讲解

Commit镜像

docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

实战测试

Commit 把一个正在运行的容器,直接提交为一个镜像。一 般来说,需要这么操作原因是:这个容器运行起来后,我又在里面做了一些操作,并且要把操作结果保存到镜像里

# 1.启动镜像
# 2.复制weblist下面的文件到webapps
# 3.将操作过的容器通过commit提交为一个新的镜像

parallels@ubuntu-linux-20-04-desktop:~$ sudo docker commit -a="sun" -m="add webapps app" 7a362055bfa2 tomcat01:1.0
sha256:c273c3441f5c1b0428a4df2f2b9515c18a38176a220e2e45edff240b91f9b71f
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat01              1.0       c273c3441f5c   12 seconds ago   663MB
nginx                 latest    36741ec2ad2b   8 days ago       126MB
tomcat                9.0       07e23176bfe0   12 days ago      658MB
tomcat                latest    07e23176bfe0   12 days ago      658MB
elasticsearch         7.13.3    8c5225ee221e   12 days ago      1.1GB
portainer/portainer   latest    ce24b0500fe9   3 months ago     68.4MB
centos                latest    a0477e85b8ae   7 months ago     249MB

容器数据卷

Definition

docker的理念回顾

将应用和环境打包成一个镜像

如果容器删除则数据就会丢失!需求:数据可以持久化

Mysql,容器删了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上

容器的持久化和同步操作!容器间也是可以数据共享的!

How to use

方式一:使用命令挂载

sudo docker run -it -v 主机目录:容器目录

# 测试
[root@fe10283411fe home] parallels@ubuntu-linux-20-04-desktop:/$ sudo docker run -it -v /home/test:/home centos /bin/bash

# 查看容器元数据中的mount来判断是否成功挂载映射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1sO5lZ0K-1631803233572)(/Users/LAY/Library/Application Support/typora-user-images/image-20210715160321703.png)]

测试文件的同步:

继续测试:

修改容器内的数据,主机上的数据同步改变。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJxaBRAh-1631803233572)(/Users/LAY/Library/Application Support/typora-user-images/image-20210715161541467.png)]

具名和匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /ect/nginx nginx # -P 是随机映射端口

# 查看所有卷的情况,volume就是卷
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker volume ls
DRIVER    VOLUME NAME
local     260972926b898163f7999407c0735595d2d01baa9b904ad1dd149eabd285dece # 匿名卷儿
local     a5aaa5fac09d9134c730c84d2ddfc5584771d3ce1ec0aa2a4e88430083399763

# 这就是匿名挂载,-v只写了容器内的路径,没有写容器外的路径!

# 具名挂载,通过 -v 卷名:容器内路径
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker run -d -P --name nginx03 -v juming-nginx:/ect/nginx nginx
83b2eeb61362c982867f78e43e86d28e5cf4a88cad006add6c0a6a3896ed7327
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker volume ls
DRIVER    VOLUME NAME
local     260972926b898163f7999407c0735595d2d01baa9b904ad1dd149eabd285dece
local     a5aaa5fac09d9134c730c84d2ddfc5584771d3ce1ec0aa2a4e88430083399763
local     juming-nginx

# 查看这个卷
parallels@ubuntu-linux-20-04-desktop:~$ sudo docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-07-17T15:15:45+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 挂载路径
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker容器内的卷,没有指定目录的情况下都是在var/lib/docker/volumes/xxxx/_dat文件下,xxxx是卷名

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况使用具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径				# 匿名
-v 卷名:容器内路径		# 具名
-v /宿主机路径:容器内路径		# 指定路径挂载!

拓展:

# 通过 -v 容器内路径: ro rw 改变读写权限
ro 		readonly		# 只读
rw      readwrite       # 可读可写

# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx04C -v juming-nginx:/ect/nginx:ro nginx
docker run -d -P --name nginx04C -v juming-nginx:/ect/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!

初识Dockerfile

Dockefile 就是用来构建docker镜像的构建文件!命令脚本!

通过该脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

# 创建一个dockerfile文件,名字可以随机,建议 Dockerfile
# 文件中的内容	指令(都是大写)参数

FROM ubuntu

VOLUME ["volume01", "volume02"] # 生成镜像的时候直接挂载,匿名挂载

CMD echo "----end----"
CMD /bin/bash

# 这里的每个命令,就是镜像的一层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9BQRu8F-1631803233573)(/Users/LAY/Library/Application Support/typora-user-images/image-20210717164502619.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oklmbipt-1631803233573)(/Users/LAY/Library/Application Support/typora-user-images/image-20210717205038880.png)]

这个卷和外部一定有一个同步目录!

查看卷的挂载目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0P7YBLPG-1631803233573)(/Users/LAY/Library/Application Support/typora-user-images/image-20210717205620447.png)]

测试一下是否同步。

这种方式使用十分多,因为我们通常会构建自己的镜像!假设构建镜像的时候没有挂载卷,就要手动挂载镜像 -v

数据卷容器

两个mysql同步数据!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDMY6RD5-1631803233574)(/Users/LAY/Library/Application Support/typora-user-images/image-20210717210218706.png)]

# 启动三个容器,通过自己写的镜像来启动

sudo docker run -it -d --name docker01 --volumes-from docker01 sun/ubuntu:1.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EV9KeRr-1631803233574)(/Users/LAY/Library/Application Support/typora-user-images/image-20210717211443691.png)]

测试发现,多个子容器继承父容器之后,他们之间的数据完全共享,当删除父容器之后,其子容器之间的数据仍然共享

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkhETtW1-1631803233574)(/Users/LAY/Library/Application Support/typora-user-images/image-20210718200327965.png)]

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

DockerFile

DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1.编写一个dockerfile文件

2.docker build 构建一个镜像

3.docker run 运行镜像

4.docker push 发布镜像(Dockerhub、阿里云镜像仓库)

DockerFile构建过程

基础知识:

1、每个保留关键字都是大写

2、执行顺序从上到下

3、# 表示注释

4、每一个指令都会创建提交一个镜像层并提交!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miAOuAPy-1631803233575)(/Users/LAY/Library/Application Support/typora-user-images/image-20210718202917858.png)]

dockerFile:构建文件,定义了一切的步骤,源代码

DockerFile的指令

FROM				# 基础镜像,一切从这里开始构建
MAINTAINER	 # 镜像是谁写的,一般作者+邮箱
RUN					 # 镜像构建的时候需要运行的命令
ADD					 # 步骤:tomcat镜像,添加tomcat压缩包!添加内容
WORKDIR			# 镜像的工作目录
VOLUME			# 挂载的目录
EXPOSE			  # 保留端口配置
CMD					# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代  
ENTRYPOINT	 # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBULID			# 当构建一个被继承DockerFile 这个时候会运行ONBULID的指令。触发指令。
COPY				# 类似ADD,将我们的文件拷贝到镜像中
ENV					# 构建的时候设置环境变量

实战

DockerHub中99%的镜像都是从这个基础镜像开始构建的 FROM scratch,然后配置需要的软件和配置来进行构建。

创建centos

# 1.编写DockerFile的文件
FROM centos
MAINTAINER sun<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN sudo apt-get install vim

EXPOSE 80

CMD echo $MYPATH
CMD echo "--end--"
CMD /bin/bash

# 2.通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t(target) 镜像名:[tag]
Successfully built cd7fcf7e93ea
Successfully tagged mycentos:1.0

# 3.测试运行


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLpBNXcU-1631803233575)(/Users/LAY/Library/Application Support/typora-user-images/image-20210719191912278.png)]

自己写的镜像添加了工作目录为/usr/local,若不配置则根目录就是工作目录

可以查看本地镜像的变更历史:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AVwZOuMe-1631803233575)(/Users/LAY/Library/Application Support/typora-user-images/image-20210719192708797.png)]

在拿到镜像后,可以研究一下他是怎么做到的

CMD和ENTRYPOINT 区别

CMD					# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代  
ENTRYPOINT	 # 指定这个容器启动的时候要运行的命令,可以追加命令

测试CMD

# 编写dockerfile文件
FROM centos
CMD ["ls","-a"] # 只有最后一个CMD会生效

# 构建镜像
# run运行,发现ls -a 生效

# 想追加一个命令 -l  期望实现 ls -al, 但结果却报错
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker run  8cab027d2a94 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled 

# CMD的情况下, -l 替换了CMD["ls","-a"]命令, -l 不是命令所以报错!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCIa6AkP-1631803233575)(/Users/LAY/Library/Application Support/typora-user-images/image-20210719193310236.png)]

测试ENTRYPOINT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYyRi5DY-1631803233576)(/Users/LAY/Library/Application Support/typora-user-images/image-20210719194208032.png)]

与CMD不同, ENTRYPOINT可追加命令

实战:Tomcat镜像

1、准备镜像文件

建立第一个应用栈HelloWorld

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jajkrIM-1631803233576)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720090543766.png)]

Docker网络

理解docker0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0e8GWJ5-1631803233576)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720100922896.png)]

三个网络

# 问题: docker 是如何处理容器网络访问的?

# parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ docker run -d -P --name tomcat3 tomcat


# 查看容器的内部网络地址   IP addr , 发现容器启动的时候会得到一个eth0@if67 ip 地址,docker分配的
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker exec -it tomcat3 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
66: eth0@if67: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# 思考,Linux能不能ping通容器内部!

parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=1.01 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.168 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.106 ms
^C
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.106/0.348/1.012/0.383 ms

原理

1、每启动一个容器,docker就会给其分配一个IP,只要安装了docker,就会有一个网卡docker0

使用桥接模式,使用的技术是evth-pair技术!

再次测试 ip adds

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vE6CK95S-1631803233576)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720101842359.png)]

# 我们发现这个容器带来网卡,都是一对对的
# evth-pair 就是一对虚拟设备接口,他们是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gc2ytmVv-1631803233576)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720102600446.png)]

# tomcat4 ping tomcat3
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker exec -it tomcat4 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.247 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.171 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.209 ms
^C
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 62ms
rtt min/avg/max/mdev = 0.076/0.175/0.247/0.065 ms

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGP2ACNJ-1631803233577)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720104246901.png)]

结论:tomcat01和tomcat02是共用一个路由器,docker0

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认可用的ip

–link

不推荐使用太笨重,link只能单向连接,通过在容器中的host文件配置容器名连接

自定义网络!不使用docker0!

docker0存在问题:不支持容器名连接访问!

自定义网络

查看所有docker网络

parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
39a42be0ff79   bridge    bridge    local
b095e4325004   host      host      local
58ca5d8d66f1   none      null      local

网络模式

brige:桥接 docker(默认,自己创建网络也使用bridge模式

None:不配置网络

host:和宿主机共享网络

Container:容器网络联通!(用的少,局限很大!)

测试:

# 直接启动的命令 默认添加--net bridge,这个就是docker0
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker run -d -P --name tomcat01 --net bridge tomcat
# docker0的特点: 默认,域名不能访问,--link可以打通连接!

# 可以自定义一个网络!
# --drvier 网络模式  -- subnet 子网掩码 --gateway 网关

parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
143bb21cdd01680170d6888d0b84324bd736dea4d0c3a573bbaaeaf48e142385

# 测试
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker run -d --name tomcat-net01 --net mynet tomcat
87321625d9eaf93a601accae4fcb6f17b08be82e496287ec01772c9c2b327480
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker run -d --name tomcat-net02 --net mynet tomcat
6bf01456f5cfb089ec8f32fcb95b989710042733617cf4e4bc17910b0e3610d7

# 使用容器名进行ping
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.239 ms

好处:

不同的集群使用不同的网络,保证集群是安全的

问题:不同网络之间的容器能够ping通吗?不能!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kKXxyyx-1631803233577)(/Users/LAY/Library/Application Support/typora-user-images/image-20210720192537745.png)]

必须要把容器加入到网络中才能访问网络中的其他容器

# 将tomcat01加入mynet 并查看mynet的元数据
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker network connect mynet tomcat01
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker network inspect mynet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RSX1qiri-1631803233577)(/Users/LAY/Library/Application Support/typora-user-images/image-20210721141702540.png)]

# 测试 连通
parallels@ubuntu-linux-20-04-desktop:/home/dockerfile$ sudo docker exec -it tomcat01 ping tomcat-net01
PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.203 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.166 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.129 ms

结论:假设要跨网络操作别人,就需要使用docker network connect

实战:部署redis集群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9pMJPdt-1631803233577)(/Users/LAY/Library/Application Support/typora-user-images/image-20210721142823428.png)]

使用shell脚本配置!

# 创建网卡
docker network create redis --subnet 172.18.0.0/16

# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379 
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.18.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf \

docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf \

docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf \

docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf \

docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf \

docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 在容器里搭建集群
redis-cli --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.18.0.15:6379 to 172.18.0.11:6379
Adding replica 172.18.0.16:6379 to 172.18.0.12:6379
Adding replica 172.18.0.14:6379 to 172.18.0.13:6379
M: 6c8ba82b6bb24d8d5655864b84c1b7b7772d7833 172.18.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 48a793d0bf60be1f5a6c911829eb3c531e2ebb4d 172.18.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 1e7b2ae9a684151560db7e6e556566d4739c2fe2 172.18.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 4f39d6bb2c57543a9270013b363dbf90eedb53f3 172.18.0.14:6379
   replicates 1e7b2ae9a684151560db7e6e556566d4739c2fe2
S: c54ea18e212084ec555f98c05eac8988979f8eef 172.18.0.15:6379
   replicates 6c8ba82b6bb24d8d5655864b84c1b7b7772d7833
S: 8986f7debebf4312839cdb53acad1f030089b23f 172.18.0.16:6379
   replicates 48a793d0bf60be1f5a6c911829eb3c531e2ebb4d
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.18.0.11:6379)
M: 6c8ba82b6bb24d8d5655864b84c1b7b7772d7833 172.18.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: c54ea18e212084ec555f98c05eac8988979f8eef 172.18.0.15:6379
   slots: (0 slots) slave
   replicates 6c8ba82b6bb24d8d5655864b84c1b7b7772d7833
M: 48a793d0bf60be1f5a6c911829eb3c531e2ebb4d 172.18.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 1e7b2ae9a684151560db7e6e556566d4739c2fe2 172.18.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 8986f7debebf4312839cdb53acad1f030089b23f 172.18.0.16:6379
   slots: (0 slots) slave
   replicates 48a793d0bf60be1f5a6c911829eb3c531e2ebb4d
S: 4f39d6bb2c57543a9270013b363dbf90eedb53f3 172.18.0.14:6379
   slots: (0 slots) slave
   replicates 1e7b2ae9a684151560db7e6e556566d4739c2fe2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


# 进入集群
redis-cli -c
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.18.0.13:6379
OK
172.18.0.13:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:669
cluster_stats_messages_pong_sent:672
cluster_stats_messages_meet_sent:3
cluster_stats_messages_sent:1344
cluster_stats_messages_ping_received:670
cluster_stats_messages_pong_received:672
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:1344
172.18.0.13:6379> read escape sequence
# 停止主机3来测试从机是否正常
root@ubuntu-linux-20-04-desktop:/# docker stop redis-3
redis-3
root@ubuntu-linux-20-04-desktop:/# docker exec -it redis-1 /bin/sh
/data # redis-cli -c
# 得到 a 的值测试成功
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.18.0.14:6379
"b"
172.18.0.14:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:7
cluster_stats_messages_ping_sent:819
cluster_stats_messages_pong_sent:799
cluster_stats_messages_meet_sent:3
cluster_stats_messages_auth-req_sent:5
cluster_stats_messages_sent:1626
cluster_stats_messages_ping_received:792
cluster_stats_messages_pong_received:807
cluster_stats_messages_meet_received:2
cluster_stats_messages_fail_received:2
cluster_stats_messages_auth-ack_received:2
cluster_stats_messages_received:1605
172.18.0.14:6379> cluster nodes
6c8ba82b6bb24d8d5655864b84c1b7b7772d7833 172.18.0.11:6379@16379 master - 0 1626868409573 1 connected 0-5460
4f39d6bb2c57543a9270013b363dbf90eedb53f3 172.18.0.14:6379@16379 myself,master - 0 1626868410000 7 connected 10923-16383
c54ea18e212084ec555f98c05eac8988979f8eef 172.18.0.15:6379@16379 slave 6c8ba82b6bb24d8d5655864b84c1b7b7772d7833 0 1626868410490 5 connected
8986f7debebf4312839cdb53acad1f030089b23f 172.18.0.16:6379@16379 slave 48a793d0bf60be1f5a6c911829eb3c531e2ebb4d 0 1626868409000 6 connected
1e7b2ae9a684151560db7e6e556566d4739c2fe2 172.18.0.13:6379@16379 master,fail - 1626868350372 1626868349561 3 connected
48a793d0bf60be1f5a6c911829eb3c531e2ebb4d 172.18.0.12:6379@16379 master - 0 1626868410592 2 connected 5461-10922

所有学习,官网!

Docker Compose

简介

Docker

DockerFile build run 收到操作,单个容器,非常麻烦!

微服务

Docker Compose 来高效的管理容器。定义运行多个容器。

官方介绍

定义、运行多个容器。

YAML file 配置文件

single command。 命令有哪些?

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

compose可在所有环境中运行。

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

    • dockerfile 保证我们的项目在任何地方都可以运行。
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

    • Services 是什么服务
    • docker-compose.yml怎么写
  3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

    • 启动项目

      作用:批量容器编排。

    compose 是 docker 官方的开源项目并不属于docker所以需要安装

    Dockerfile 让程序在任何地方运行,web服务,redis,mysql,nginx…多个容器,一个一个run非常麻烦

    yaml文件

    version: "3.9"  # optional since v1.27.0
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        volumes:
          - .:/code
          - logvolume01:/var/log
        links:
          - redis
      redis:
        image: redis
    volumes:
      logvolume01: {}
    

    Docker-compose up 100个服务

    Compose:重要的概念。

    • 服务services,容器、应用。(web,redis,mysql)
    • 项目project,一组关联的容器。博客。web、mysql、wp

安装

# 使用镜像安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 添加权限
sudo chmod +x /usr/local/bin/docker-compose

Docker Swarm

集群式的部署使用Swarm,Compose 适用于单机

相较于 CoreOS 是依托于一系列开源项目(比如 Container Linux 操作系统、Fleet 作业调度工 具、systemd 进程管理和 rkt 容器),一层层搭建起来的平台产品,Swarm 项目则是以一个完整的整体来对外提供集群管理功能。而 Swarm 的最大亮点,则是它完全使用 Docker 项目原本 的容器管理 API 来完成集群管理

你可能感兴趣的:(docker,linux,ubuntu,云原生,容器)