Docker 学习笔记

本文详细介绍了Docker的基础知识,包括镜像命令如docker images、容器命令如docker run,以及数据卷和Dockerfile的使用。还提到了可视化工具Portainer和Rancher,以及Docker网络、容器数据卷的持久化和实战中的MySQL、Tomcat和Redis集群部署。最后探讨了Docker在企业级应用中的实践,如Docker Compose和Swarm。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker // 是一个 Client - Server 结构

推荐视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

帮助命令

帮助文档:https://docs.docker.com/reference

Docker 命令 --help # 万能命令
Docker version # 查看版本
Docker info # 显示docker的系统信息 包括镜像和容器数量
Docker run xxx # 运行本机指定镜像

镜像命令

docker images // 镜像命令

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   13 months ago   13.3kB
​
# 解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的ID
CREATED     镜像的创建时间
SIZE        镜像的大小
​
# 可选项
  -a, --all             # 列出所有镜像
  -q, --quiet           # 只显示镜像ID

docker search // 搜索镜像

[root@localhost ~]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13345     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5098      [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   657       [OK]       
percona                         Percona Server is a fork of the MySQL relati…   592       [OK]   
​
# 可选项
  --filter=STARS=3000 # 搜索出来的镜像就是STARS大于3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13345     [OK]       
mariadb   MariaDB Server is a high performing open sou…   5098      [OK]   

docker pull // 下载镜像

# 下载镜像 docker pull 镜像名[:tag] // 版本
[root@localhost ~]# docker pull mysql 
Using default tag: latest  # 如果不写版本 tag 默认就是laster
5ed150ed0abe: Pull complete # 分层下载 docker image 的核心 联合文件系统
0fede58e17ac: Pull complete 
994a6ddd6efe: Pull complete 
028bda79779b: Pull complete 
426fbe9e56a2: Pull complete 
1a00e58dd193: Pull complete 
4a4f64494005: Pull complete 
fba8ab3534a7: Pull complete 
2695938edf88: Pull complete 
3754e2587bed: Pull complete 
1b9f154543e7: Pull complete 
Digest: sha256:147572c972192417add6f1cf65ea33edfd44086e461a3381601b53e1662f5d15
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
​
# 等价于它
docker pull mysql 
docker pull docker.io/library/mysql:latest 
​
# 指定版本下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
0056409b8e89: Pull complete 
219bd535343d: Pull complete 
f220ee65eb90: Pull complete 
7bbb395b2290: Pull complete 
645e487e5f0a: Pull complete 
a9fa38d2e1fb: Pull complete 
e1d9f4f7e8b4: Pull complete 
e03fcfe5d90e: Pull complete 
74c4d4272e30: Pull complete 
e3a8ad6eeebe: Pull complete 
919524a8718b: Pull complete 
Digest: sha256:94176d0ad4ed85767fc0d74b8071387109a0390e7c1afd39788269c96d2dad74
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi // 删除镜像

[root@localhost ~]# docker rmi -f 容器ID  # 删除指定的容器
[root@localhost ~]# docker rmi -f 容器ID 容器ID 容器ID 容器ID  # 删除多个的容器
[root@localhost ~]# docker rmi -f $(docker images -aq) # 删除全部容器

容器命令

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

docker pull centos

docker run [可选参数] image // 新建容器并启动

# 参数说明
--name="Name"        # 容器名字 tomcat01 tomcat02 用来区分容器
-d                  # 后台方式运行
-it                 # 使用交互方式运行 进入容器查看内容
-p                  # 指定容器的端口 -p 8080:8080 (小写p)
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口 (常用)
    -p 容器端口
-P                  # 随机指定端口 (大写P)
​
​
# 测试
[root@localhost ~]# docker run -it centos /bin/bash   # 启动并进入容器
[root@6d1dad4f7880 /]# ls   # 容器内的centos 基础版本 很多命令都是不完善的!
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
​
# 从容器中退回主机
[root@6d1dad4f7880 /]# exit
exit
[root@localhost ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg
模板  图片  下载  桌面  initial-setup-ks.cfg

列出所有运行中的容器 // docker ps

# docker ps 命令
   # 列出当前整个在运行的容器
-a # 列出当前整个在运行的容器 + 历史运行过的容器
-n=? #列出最近创建的容器
-q # 只显示容器的编号
​
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                          PORTS     NAMES
6d1dad4f7880   centos    "/bin/bash"   3 minutes ago   Exited (0) About a minute ago             cranky_poitras

退出容器

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

删除容器 // docker rm

docker rm 容器ID               # 删除指定容器 不能删除正在运行的容器
docker rm -f $(docker ps -aq)   # 删除所有的容器 强制删除 可以删除正在运行的
docker ps -a -q|xargs dcoker rm # 删除所有的容器

启动和停止容器的操作

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

常用其他命令

后台启动容器 // docker run

# docker run -d 镜像名!
[root@localhost ~]# docker run -d centos
# 问题docker ps 发现 centos 停止了
# 常见的坑 docker 容器使用后台运行 就必须要有一个前台进程 docker发现没有应用 就会自动停止
# nginx 容器启动后 发现在家没有提供服务 就会立刻停止 就是没有程序了

查看日志 // docker logs

# docker logs -tf --tail 查看条数 容器     # 没有日志
# docker logs -tf 容器  # 查看全部日志   # 没有日志
​
# 自己写一段shell脚本
[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo weilekaixin;sleep 1;done"
​
# [root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
2562525e297d   centos    "/bin/sh -c 'while t…"   28 seconds ago   Up 26 seconds             inspiring_davinci
# 显示日志
-tf           #显示日志
-- tail number # 要显示的日志条数
[root@localhost ~]# docker logs -tf --tail 10  2562525e297d
2022-10-19T03:43:02.965344920Z weilekaixin
2022-10-19T03:43:03.978534255Z weilekaixin
2022-10-19T03:43:04.983054247Z weilekaixin
2022-10-19T03:43:05.986780709Z weilekaixin
2022-10-19T03:43:06.989738379Z weilekaixin
2022-10-19T03:43:07.994183720Z weilekaixin
2022-10-19T03:43:08.998905522Z weilekaixin
2022-10-19T03:43:10.001559985Z weilekaixin
2022-10-19T03:43:11.006437202Z weilekaixin
2022-10-19T03:43:12.011787221Z weilekaixin
2022-10-19T03:43:13.015084744Z weilekaixin
2022-10-19T03:43:14.017707354Z weilekaixin
2022-10-19T03:43:15.020682705Z weilekaixin
2022-10-19T03:43:16.026036103Z weilekaixin
2022-10-19T03:43:17.031302231Z weilekaixin
​

查看 docker 容器内部中的进程信息 // docker top

[root@localhost ~]# docker top 2562525e297d
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3703                3684                0                   11:41               ?                   00:00:00            /bin/sh -c while true;do echo weilekaixin;sleep 1;done
root                5391                3703                0                   11:52               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

重点:查看 docker 元数据 // docker inspect 

[root@localhost ~]# docker inspect 容器ID
[
    {
        "Id": "2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361",
        "Created": "2022-10-19T03:41:29.795462561Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo weilekaixin;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3703,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-10-19T03:41:30.453501434Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361/hostname",
        "HostsPath": "/var/lib/docker/containers/2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361/hosts",
        "LogPath": "/var/lib/docker/containers/2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361/2562525e297d9780a932565ceb3d78bd8612489e3357af764b03ab17ae909361-json.log",
        "Name": "/inspiring_davinci",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "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/9afe941a3269bc9258c457b1e354dced733f5fe6783a7cca7a5269904ee0d6d7-init/diff:/var/lib/docker/overlay2/d3484371dc41885967e3e502686f7d8fb83a367966932169304a34f55a5d3c88/diff",
                "MergedDir": "/var/lib/docker/overlay2/9afe941a3269bc9258c457b1e354dced733f5fe6783a7cca7a5269904ee0d6d7/merged",
                "UpperDir": "/var/lib/docker/overlay2/9afe941a3269bc9258c457b1e354dced733f5fe6783a7cca7a5269904ee0d6d7/diff",
                "WorkDir": "/var/lib/docker/overlay2/9afe941a3269bc9258c457b1e354dced733f5fe6783a7cca7a5269904ee0d6d7/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "2562525e297d",
            "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 weilekaixin;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "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": "254444b5de0be48f5547c9aec0e950424f66b0754ad4fd8945d3f6070e6568d9",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/254444b5de0b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "2700255a85ca6e7a966b884ed4344e3d8d3a8004ab9309d701063528844a630d",
            "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": "982bd1b1c3f09fb465ea3150848c7e5fefe6be0ad18dc1bb2028edfd53e3729e",
                    "EndpointID": "2700255a85ca6e7a966b884ed4344e3d8d3a8004ab9309d701063528844a630d",
                    "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
​
# 测试
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
2562525e297d   centos    "/bin/sh -c 'while t…"   38 minutes ago   Up 38 minutes             inspiring_davinci
[root@localhost ~]# docker exec -it 2562525e297d /bin/bash
[root@2562525e297d /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@2562525e297d /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 03:41 ?        00:00:01 /bin/sh -c while true;do echo weilekaixin;sleep 1;done
root       2353      0  0 04:20 pts/0    00:00:00 /bin/bash
root       2382      1  0 04:21 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       2383   2353  0 04:21 pts/0    00:00:00 ps -ef
​
# 方式二
docker attach 容器ID
[root@localhost ~]# docker attach 2562525e297d
正在执行当前的代码...
​
# docker exec   # 进入容器中开一个新的终端 可以在里面进行操作(常用)
# docker attach # 进入当前正在执行的终端 不会启动新的进程

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

docker cp 容器ID:容器内路径 目的地主机路径
​
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   13 months ago   231MB
[root@localhost ~]# docker run -it centos /bin/bash
[root@0f9040ca9fcd /]# cd /home
[root@0f9040ca9fcd home]# ls
[root@0f9040ca9fcd home]# touch weilekaixin.java
[root@localhost home]# docker cp 5d0da3dc9764:/bin/weilekaixin.java /home

docker安装nginx

# 1.搜索镜像 search 
 # 2.下载镜像 pull
 # 3.运行测试 
 
[root@localhost home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    51086ed63d8c   13 days ago     142MB
centos       latest    5d0da3dc9764   13 months ago   231MB
​
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口 容器内部端口
[root@localhost home]# docker run -d --name nginx01 -p 3344:80 nginx
ac1fe7fba4d35329e081a68d5172737922a3b4eeb24ee99b6ad20afe832aef8a
[root@localhost home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
ac1fe7fba4d3   nginx     "/docker-entrypoint.…"   45 minutes ago   Up 45 minutes   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
[root@localhost home]# curl localhost:3344

docker安装tomcat

 # 官方的使用
 docker run -it --rm tomcat:9.0
 
 # 我们之前启动的都是后台 停止了容器之后 容器还是可以查到 docker run -it --rm 一般用来测试 用完就删除
 
 # 下载在启动
 docker pull tomcat:9.0、
 
 # 启动运行
 [root@localhost home]# docker run -d -p 3355:8080 --name tomcat01 tomcat
 
 # 进入容器
 
 # 发现问题 linux命令少了 没有webapps 阿里云最小镜像 把不必要的都剔除了

docker安装ES

# es 暴露端口很多!
# es 十分耗内存!
# es 的数据一般需要放置到安全目录!挂载!
# -- net somenetwork ? 网络配置
​
# 启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
​
# 启动了 linux就卡住了 docker stats 查看 cpu 的状态
​
# es 是十分耗内存的 1.xG        
​
# 查看 docker stats
​
# 赶紧关闭 增加内存限制 修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

可视化

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

访问测试:http://192.168.1.7:8088/

Commit 镜像

docker commit # 提交容器成为一个新的副本
​
# 和 git 相似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

实战测试

# 启动应该默认的 tomcat
​
# 发现这个默认的 tomcat 是没有 webapps 应用  镜像的原因 官方镜像默认 webapps 下面是没有文件的
​
# 我自己拷贝进去了基本的文件
​
# 将我们操作过的容器通过 commit 提交为一个镜像!我们以后使用我们修改过的镜像即可 这就是我们自己修改的一个镜像

到这里我们才算是入门Docker !!!

容器数据卷

docker的理念回顾

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

数据?如果数据在容器中 那么我们容器删除 数据就会丢失 ! 需求:数据可以持久化!

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

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

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

总结一句话:容器的持久化和同步操作!荣期间也是可以数据共享的!

使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录
​
# 测试
[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
​
# 启动起来时候我们可以通过 docker inspect 容器ID
 

再来测试

1、停止容器

2、宿主机上修改文件

3、启动容器

4、容器内的数据依旧是同步的!

实战:安装MySQL

思考:MySQL 的数据持久化的问题

# 获取镜像
[root@localhost ~]# docker pull mysql:5.7
​
# 运行容器的时候需要挂载出去
# 官方测试 :docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
​
# 启动我们的
​
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
​
[root@localhost ~]# 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=root --name mysql01 mysql:5.7
​
# 启动成功之后 我们在本地使用 sqlyog 来测试一下
# sqlyog 连接到服务器 3310  --- 3306 映射 这个时候我们就连接上了
​
# 在本地测试创建一个数据库 查看一下我们映射的路径是否ok

假设我们将容器删除

发现 我们挂载到本地的数据卷依旧没有丢失 这就实现了容器数据持久化功能!

具名和匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx
​
# 查看所有卷的情况
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     2aa6a4e118fcdecfd6b21cba62f49443935816c0264eb70f23cb00326e138b8d
local     10b0b738972caf66998b2445723f3926f74b3da10c3138e7bde815f267110034
​
# 这里发现 这种就是匿名挂载 我们在 -v 只写了容器内的路径 没有写容器外的路径
[root@localhost data]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
225ef538c33e54b2225043426f93d7235291f582d53d0784e1685a6f1ebfa3cf
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx
​
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
[root@localhost data]# docker volume inspect juming-nginx

 

 所有的 docker 容器内的卷 没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data

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

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

拓展

# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
​
# 一旦这个设置了容器权限 容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
​
# ro 只要看到 ro 就说明这个路径只能通过宿主机来操作 容器内是无法操作的!

初识 DockerFile

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

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

# 创建一个 dockerfile 文件 名字可以随机 建议 Dockerfile
# 文件中的内容 指令(大写) 参数
[root@localhost docker-test-volume]# vim dockerfile1
FORM centos
​
VOLUME ["volume01","volume02"]
​
CMD echo "----end----"
CMD /bin/bash

数据卷容器

多个MySQL同步数据!

# 启动三个容器、通过我们自己写的镜像启动

[root@localhost docker-test-volume]# docker run -it --name docker02 --volumes-from docker

# 测试 可以删除docker01 查看 docker02 是否还可以访问
# 测试依旧可以使用  # 备份机制

多个 MySQL 实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-form mysql01 mysql:5.7

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

但是一旦持久化到本地 这个时候 本地的数据是不会删除的!

学习 DockerFile

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

构建步骤

1、编写应该 dockerfile 文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像 ( DockerHub 、阿里云镜像仓库! )

Dockerfile 构建过程

基础知识

1、每个保留关键字 ( 指令 )都必须是大写字母

2、执行从上到下顺序执行

3、# 表示注释

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

Dockerfile 是面向开发的 我们以后要开发项目 做镜像 就需要编写 dockerfile 文件 这个文件十分简单!

Docker 镜像逐渐成为企业交付的标准 必须要掌握!

Dockerfile 构建文件 定义一切步骤 源代码

DockerImages 通过 DockerFile 构建的镜像 最终发布和运行的产品!

Docker容器 容器就是镜像运行起来提供的服务器

DockerFile 的指令

以前我们就是用别人的 现在我们知道这些指令后 我们来联系自己写一个镜像!

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

实战测试

Docker Hub 中 99 % 镜像都是从这个基础镜像中 FROM scratch 然后配置需要的软件来进行构建

创建一个自己的 centOS

# 编写 dockerfile

FROM centos  
MAINTAINER weilekaixin<122527725@qq.com>

ENV MYPATH /usr/local 
WORKDIR $MYPATH 

RUN yum -y install vim
RUN yun -y install net-tools
      
EXPOSE 80

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

[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

CMD 和 ENTRYPOINT 的区别

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

测试 CMD

# 编写 dockerfile 文件
vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .
# run 运行 发现 ls-a 命令生效
docker run 容器ID
.
..
.dockerenv
bin
dev
etc
home
lib
lib64

# 想追加一个命令 -l ls -al
[root@localhost dockerfile]# docker run 29298387e7bd -l
ERROR
# cmd 的清理下 -l 替换了 CMD ["ls","-a"] 命令 -l 不是命令所以报错!

测试 ENTRYPOINT

# 编写 dockerfile 文件
vim dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]

# 直接拼接在命令后面
[root@localhost dockerfile]# docker run 29298387e7bd -l
total 0
drwxr-xr-x.   1 root root   6 Oct 21 02:04 .
drwxr-xr-x.   1 root root   6 Oct 21 02:04 ..
-rwxr-xr-x.   1 root root   0 Oct 21 02:04 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Oct 21 02:04 dev
drwxr-xr-x.   1 root root  66 Oct 21 02:04 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 251 root root   0 Oct 21 02:04 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Oct 21 01:54 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var

实战:Tomcat 镜像

1、准备镜像文件 tomcat 压缩包 jdk 压缩包

[root@localhost dockerfile]# ll
总用量 200900
-rw-r--r--. 1 root root  10621733 10月 21 10:51 apache-tomcat-8.5.83.tar.gz
-rw-r--r--. 1 root root 195094741 10月 21 10:51 jdk-8u221-linux-x64.tar.gz

2、编写 dockerfile 文件 官方命名 DockerFile build 会自动寻找这个文件 就不需要 -f 指定了

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.83.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORK $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.83.tar.gz
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.83.tar.gz
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.83.tar.gz/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.83.tar.gz/bin/logs/catalina.out

3、构建镜像

# docker build -t diytomcat .

Docker 网络

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

实战:部署 Redis 集群

# 创建网卡
docker network create redis --subnet 172.38.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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

for port in $(seq 1 6);
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172
.38.0.14:6379 172.38.0.15:6379 172.38.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.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 656eb2053486951bb0ec6c3e27419615a53e023d 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: ef346c89bbe4f96c14833571fa3dd0006d0293e8 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 530f78d09ad5fa7e98a414f1f7fc9155275b5ee4 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: bc6b0ca905b1b8216c48d23f031888c79f1134ad 172.38.0.14:6379
   replicates 530f78d09ad5fa7e98a414f1f7fc9155275b5ee4
S: e570618933f04f73acf39fd30bb2141f1855d79a 172.38.0.15:6379
   replicates 656eb2053486951bb0ec6c3e27419615a53e023d
S: 738f6a194214dfaf21ab8b66b42708872fb672e8 172.38.0.16:6379
   replicates ef346c89bbe4f96c14833571fa3dd0006d0293e8
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.38.0.11:6379)
M: 656eb2053486951bb0ec6c3e27419615a53e023d 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: ef346c89bbe4f96c14833571fa3dd0006d0293e8 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: bc6b0ca905b1b8216c48d23f031888c79f1134ad 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 530f78d09ad5fa7e98a414f1f7fc9155275b5ee4
M: 530f78d09ad5fa7e98a414f1f7fc9155275b5ee4 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 738f6a194214dfaf21ab8b66b42708872fb672e8 172.38.0.16:6379
   slots: (0 slots) slave
   replicates ef346c89bbe4f96c14833571fa3dd0006d0293e8
S: e570618933f04f73acf39fd30bb2141f1855d79a 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 656eb2053486951bb0ec6c3e27419615a53e023d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

127.0.0.1:6379> cluster nodes
ef346c89bbe4f96c14833571fa3dd0006d0293e8 172.38.0.12:6379@16379 master - 0 1666357516276 2 connected 5461-10922
bc6b0ca905b1b8216c48d23f031888c79f1134ad 172.38.0.14:6379@16379 slave 530f78d09ad5fa7e98a414f1f7fc9155275b5ee4 0 1666357515000 4 connected
530f78d09ad5fa7e98a414f1f7fc9155275b5ee4 172.38.0.13:6379@16379 master - 0 1666357515000 3 connected 10923-16383
656eb2053486951bb0ec6c3e27419615a53e023d 172.38.0.11:6379@16379 myself,master - 0 1666357514000 1 connected 0-5460
738f6a194214dfaf21ab8b66b42708872fb672e8 172.38.0.16:6379@16379 slave ef346c89bbe4f96c14833571fa3dd0006d0293e8 0 1666357516074 6 connected
e570618933f04f73acf39fd30bb2141f1855d79a 172.38.0.15:6379@16379 slave 656eb2053486951bb0ec6c3e27419615a53e023d 0 1666357515267 5 connected

docker 搭建 redis 集群完成

 我们使用了 docker 之后 所有的技术都会慢慢的变得简单起来

FROM openjdk:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

企业级实战

Docker Compose

Docker Swarm

CI/CD jenkins 流水线 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值