文章目录

  • docker历史
  • docker能做什么
  • Docker的安装
    • Docker的基本组成
    • 安装Docker
    • 阿里云镜像加速
    • 回顾Hello-World
    • 底层原理
  • Docker的常用命令
    • 帮助命令
    • 镜像命令
    • 容器命令
    • 常用其他命令
    • 总结
    • 实战练习
    • 可视化
  • docker 镜像
    • commit镜像
  • 容器数据卷
    • 使用数据卷
    • 安装MySQL
    • 具名和匿名挂载
    • 初识DockerFile
    • 数据卷容器
  • DockerFile
    • DockerFile介绍
    • DockerFile构建过程
    • DockerFile指令
    • 发布镜像
  • Docker 网络
    • 理解Docker0
    • --link
    • 自定义网络
    • 网络联通
    • 实战部署Redis
      • 安装单机版Redis
      • 实战部署Redis集群
    • 安装ZooKeeper
      • 一、单机搭建
      • 二、集群搭建
  • Docker Compose
    • 简介
    • 安装

docker历史

2010年,几个年轻人,在美国成立dotcloud ,做一些pass云服务。

lxc有关的容器技术,他们将自己的技术容器化

聊聊docker

Docker是基于GO语言开发的!开源项目!

官网:https://www.docker.com/

文档地址:https://docs.docker.com/ 超级详细

仓库地址:https://hub.docker.com/

docker能做什么

之前的虚拟技术

虚拟技术的缺点

  1. 占用资源多
  2. 冗余步骤多
  3. 启动慢

容器化技术

容器化技术不是模拟的一个完整的操作系统

Docker和虚拟机之间的区别

  • 传统虚拟机虚拟出一套完整的硬件,运行一套完整的虚拟环境,在操作系统上运行安装软件
  • 容器直接运行在内核中,容器没有自己的内核,也没有虚拟硬件,所以轻便
  • 每个容器间相互隔离,每个容器都有属于自己的文件系统,互不影响

DevOps(开发、运维)

更快速的运维部署

传统应用:一堆文档,安装运行

Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

使用docker之后,发布应用就像搭积木一样

项目打包为镜像,可以在其他环境直接运行

更简单的运维

在容器化后,开发环境、测试环境高度一致

更高效的资源利用

Docker是内核虚拟化,在一个物理机上可以运行多个容器实例,服务器性能可以压榨到极致

Docker的安装

Docker的基本组成

镜像(images)

Docker镜像是一个模板,可以通过这个模板创建容器服务,tomcat—>run—>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器

容器(container)

Docker利用容器技术运行通过镜像创建的应用

启动、删除基本命令

仓库(repository)

存放镜像的地方!

共有仓库和私有仓库!

Docker Hub(默认是国外的)

阿里云…都有这些仓库(配置镜像加速)

安装Docker

环境准备

  1. 会一点点linux基础
  2. CentOS 7
  3. 使用XShell链接远程服务器

环境查看

#系统内核3.10以上
[root@izuf6cn5k7l8xuxojhszqbz ~]# uname -r
3.10.0-862.14.4.el7.x86_64
#系统版本
[root@izuf6cn5k7l8xuxojhszqbz /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档:https://docs.docker.com/engine/install/centos/

# 1.卸载旧版本
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
# 2.下载需要的安装包
yum install -y yum-utils# 3.设置镜像仓库
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的十分慢yum-config-manager --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云的
# 更新yum相关索引
yum makecache faste
# 4.安装Docker相关内容 docker-ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
# 5.启动docker
sudo systemctl start docker
# 6.使用docker version查看是否安装成功

# 7. hello-world
docker run hello-world

# 8. 查看下载的hello-world这个镜像
[root@izuf6cn5k7l8xuxojhszqbz /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              235592615444        4 months ago        104MB
mysql               5.7                 9cfcce23593a        4 months ago        448MB
hello-world         latest              fce289e99eb9        21 months ago       1.84kB
logstash            6.4.0               13b7a09abaf8        2 years ago         670MB
kibana              6.4.0               a7e4cd1a7b45        2 years ago         667MB
elasticsearch       6.4.0               1ac676545731        2 years ago         791MB

了解卸载docker

# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
#/var/lib/docker docker的默认工作路径

阿里云镜像加速

  1. 登陆阿里云找到容器服务

  2. 镜像加速地址

  3. 配置使用

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {"registry-mirrors": ["https://0b56c32l.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

回顾Hello-World

底层原理

Docker 是一个Client-Server的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问

DockerServer接受DockerClient命令

Docker为什么比VM运行更快?

  1. Docker有比虚拟机更少的抽象层
  2. Docker用的是宿主机的内核

Docker的常用命令

帮助命令

docker version    # 显示Docker的版本信息
docker info       # 显示Docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

帮助文档地址:https://docs.docker.com/engine/reference/run/

镜像命令

[root@izuf6cn5k7l8xuxojhszqbz ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              235592615444        4 months ago        104MB
mysql               5.7                 9cfcce23593a        4 months ago        448MB
hello-world         latest              fce289e99eb9        21 months ago       1.84kB
logstash            6.4.0               13b7a09abaf8        2 years ago         670MB
kibana              6.4.0               a7e4cd1a7b45        2 years ago         667MB
elasticsearch       6.4.0               1ac676545731        2 years ago         791MB# 解释
REPOSITORY 镜像仓库源
TAG        镜像标签
IMAGE ID   镜像ID
CREATE     镜像创建时间
SIZE       镜像大小# 可选向
Options:-a, --all             # 列出所有镜像-q, --quiet           # 只显示镜像ID

docker search搜索镜像

[root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10075               [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3694                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   736                                     [OK]
percona                           Percona Server is a fork of the MySQL relati…   511                 [OK]                # 可选项
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10075               [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3694                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   736                                     [OK]
percona                           Percona Server is a fork of the MySQL relati…   511                 [OK]                [root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql --filter=stars=5000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   10075               [OK]                

docker pull 下载镜像

# docker pull 镜像名[:tag]
docker pull mysql
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker pull mysql
Using default tag: latest   # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete # 分层下载,docker images的核心,联合文件系统
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
9eb4355ba450: Pull complete
6879faad3b6c: Pull complete
164ef92f3887: Pull complete
6e4a6e666228: Pull complete
d45dea7731ad: Pull complete
Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

删除镜像 docker rmi

docker rmi -f 8e85dd5c3255            # 删除指定镜像
docker rmi -f 容器ID 容器ID 容器ID 容器ID# 删除多个镜像
docker rmi -f ${docker images -aq}     # 删除全部镜像

容器命令

说明:只有新建镜像才能创建容器,Linux,下载一个CentOS来学习

docker pull centos

新建容器并启动

docker run [可选参数] image
# 参数说明
--name  # 指定容器名字
-it     # 使用交互方法,进入后台查看内容
-d      # 后台运行
-p      # 指定端口8080:8080-p  主机端口:容器端口(最常用主机端口和容器端口的映射)-p  ip:主机端口:容器端口-p  容器端口容器端口
-P      # 随机分配端口# 测试,启动并进入容器
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -it kibana:6.4.0 /bin/bash
bash-4.2$ [root@izuf6cn5k7l8xuxojhszqbz /]#
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -it centos /bin/bash
# 查看容器内的CentOS,基本版本很多功能都不完善
[root@a87299a142d9 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var# 从容器中退回主机
[root@a87299a142d9 /]# exit
exit
[root@izuf6cn5k7l8xuxojhszqbz /]# ls
bin   dev                   get-docker.sh  ifstat-1.1.tar.gz  lost+found  mydata  root  srv  usr
boot  dubbo-governance.log  home           lib                media       opt     run   sys  var
d     etc                   ifstat-1.1     lib64              mnt         proc    sbin  tmp  zookeeper.out
[root@izuf6cn5k7l8xuxojhszqbz /]# # 查看镜像元数据
[root@izuf6cn5k7l8xuxojhszqbz /]# docker inspect b96481cf196e
[{"Id": "b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386","Created": "2020-10-20T01:00:24.252614556Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 12492,"ExitCode": 0,"Error": "","StartedAt": "2020-10-20T02:00:50.534736639Z","FinishedAt": "2020-10-20T02:00:50.11175616Z"},"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566","ResolvConfPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/resolv.conf","HostnamePath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/hostname","HostsPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/hosts","LogPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386-json.log","Name": "/xenodochial_cerf","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,"Capabilities": null,"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/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5-init/diff:/var/lib/docker/overlay2/e88cb8fc7bd56dd63cbb631a8babb55716e65fb3705e0e5c2e0d5da2e6e7737b/diff","MergedDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/merged","UpperDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/diff","WorkDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "b96481cf196e","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20200809","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": "2e09d9086aeb52e6a6d5a7ada9b6c8531c0f7b322ccf6532cf169d3ba9756eab","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/2e09d9086aeb","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "63ef5e1ec21bc8973355b716d8dfa42e192efc0f1750ef18947b4f9d1410e512","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.4","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:04","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "adb8cb6caa43e42b2f3963607bf576207abb4a6a2b76c43f3907503f17dbdad9","EndpointID": "63ef5e1ec21bc8973355b716d8dfa42e192efc0f1750ef18947b4f9d1410e512","Gateway": "172.17.0.1","IPAddress": "172.17.0.4","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:04","DriverOpts": null}}}}
]
[root@izuf6cn5k7l8xuxojhszqbz /]#

退出容器

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

列出所有Docker运行容器

docker ps
# 参数
无参数   # 列出当前运行的容器
-a      # 列出当前运行的容器+历史运行的容器
-n=?   # 显示最近创建的容器
-q      # 只显示容器的编号

删除容器

docker rm 容器ID                   # 删除容器但是不能删除运行的容器,如果强制删除rm -f
docker rm -f ${docker ps -qa}    # 删除所有容器
docker ps -qa | xargs docker rm  # 删除所有容器

启动和停止容器

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

常用其他命令

Docker进程相关命令

systemctl start docker       # 启动Docker容器
systemctl stop docker       # 停止Docker容器
systemctl restart docker    # 重启Docker容器
systemctl status docker     # 查看Docker容器状态
systemctl enable docker     # 设置Docker开机自启
docker top  容器ID           # 查看容器进程信息
[root@izuf6cn5k7l8xuxojhszqbz /]# docker top 0a01905d64f5
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16217               16201               0                   12:21               pts/0               00:00:00            /bin/bash
[root@izuf6cn5k7l8xuxojhszqbz /]#

后台启动命令

# docker run -d 镜像名# 问题docker ps 发现CentOS停止运行# docker后台运行就必须有一个前台进程,docker发现没有应用就会自动停止
# nginx发现自己没有提供服务就会停止运行,就是没有程序

查看日志命令

docker logs -f -t --tail nubmer 容器ID
# 显示日志
- ft          # 显示日志
--tail number # 显示日志和行数
[root@izuf6cn5k7l8xuxojhszqbz /]# docker logs -f -t --tail 10 d50135d540e2

进入当前正在运行的容器

# 通常容器都是后台运行方式,经常需要进入容器,修改一些配置
# 方式一
docker exec -it 容器ID
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
bc3159d51302        kibana:6.4.0          "/bin/bash"              34 minutes ago      Up 34 minutes       5601/tcp                            romantic_euclid
abe8d2653a16        elasticsearch:6.4.0   "/usr/local/bin/dock…"   35 minutes ago      Up 35 minutes       9200/tcp, 9300/tcp                  elastic_ellis
89059be6a599        logstash:6.4.0        "/usr/local/bin/dock…"   36 minutes ago      Up 36 minutes       5044/tcp, 9600/tcp                  nostalgic_einstein
059363cf2047        0346349a1a64          "/bin/bash"              46 minutes ago      Up 46 minutes       80/tcp, 443/tcp                     nginx
edb16178fcae        centos                "/bin/bash"              About an hour ago   Up About an hour                                        nostalgic_allen
a956dc76e579        redis                 "docker-entrypoint.s…"   3 months ago        Up About an hour    0.0.0.0:6379->6379/tcp              redis
635d1b7ad286        mysql:5.7             "docker-entrypoint.s…"   3 months ago        Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it 635d1b7ad286 /bin/bash
root@635d1b7ad286:/## 方式二
docker attach 容器ID # 进入容器
[root@izuf6cn5k7l8xuxojhszqbz /]# docker attach 635d1b7ad286
[root@izuf6cn5k7l8xuxojhszqbz /]# ...# 两种方式的区别
docker exec -it 容器ID # 进入容器并开启一个新的终端
docker attach 容器ID   # 进入正在执行的终端,并不会开启新的进程

从容器内拷贝文件到主机

docker cp
# 进入docker容器内
[root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it edb16178fcae /bin/bash
[root@edb16178fcae /]# cd /home
[root@edb16178fcae home]# ls
# 在容器内home创建文件
[root@edb16178fcae home]# touch test.java
# 退出容器
[root@edb16178fcae home]# exit
exit
[root@izuf6cn5k7l8xuxojhszqbz /]# ls
bin   d    dubbo-governance.log  get-docker.sh  ifstat-1.1         lib    lost+found  mnt     opt   root  sbin  sys  usr  zookeeper.out
boot  dev  etc                   home           ifstat-1.1.tar.gz  lib64  media       mydata  proc  run   srv   tmp  var
# 将docker内创建的文件拷贝到主机目录下
[root@izuf6cn5k7l8xuxojhszqbz /]# docker cp edb16178fcae:/home/test.java /home
[root@izuf6cn5k7l8xuxojhszqbz /]# cd home
[root@izuf6cn5k7l8xuxojhszqbz home]# ls
admin  es  FastDFS  hadoop  mysql  oracle  test.java
[root@izuf6cn5k7l8xuxojhszqbz home]## 拷贝是一个手动过程,将来可以使用-v 卷的技术字段关联容器目录和主机目录 /home /home

总结

实战练习

Docker 安装Ninx

# docker search nginx        # 搜索镜像
# docker pull nginx:1.1.0   # 下载指定版本镜像
# 查看镜像
[root@izuf6cn5k7l8xuxojhszqbz /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        2 months ago        215MB
redis               latest              235592615444        4 months ago        104MB
mysql               5.7                 9cfcce23593a        4 months ago        448MB
rabbitmq            3.7.15-management   f05c3eb3cf91        15 months ago       179MB
hello-world         latest              fce289e99eb9        21 months ago       1.84kB
mongo               3.2                 fb885d89ea5c        23 months ago       300MB
logstash            6.4.0               13b7a09abaf8        2 years ago         670MB
kibana              6.4.0               a7e4cd1a7b45        2 years ago         667MB
elasticsearch       6.4.0               1ac676545731        2 years ago         791MB
nginx               1.10                0346349a1a64        3 years ago         182MB
# 参数解释
# -d        后台运行
# --name    为容器命名
# -p        主机端口:容器端口
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name ngnix01 -p 3344:80 nginx:1.10
fe9479484c55a8aa62719a65cf146c14ce9bfadf5e20090afcb8e38703ac2bec
[root@izuf6cn5k7l8xuxojhszqbz /]# curl localhost:3344# 进入容器
[root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it ngnix01 /bin/bash
root@fe9479484c55:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz
root@fe9479484c55:/# cd /etc/nginx
root@fe9479484c55:/etc/nginx# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf
root@fe9479484c55:/etc/nginx# 

Docker 安装Tomcat

# docker pull tomcat:9.0 下载镜像tomcat9
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name tomcat9 -p 3355:8080 tomcat:9.0
[root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it tomcat9 /bin/bash
root@5f17e0823840:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md  RUNNING.txt  conf  logs        temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@5f17e0823840:/usr/local/tomcat# cd webapps
root@5f17e0823840:/usr/local/tomcat/webapps# ls
root@5f17e0823840:/usr/local/tomcat/webapps#

Docker 安装Es+kibana

# ES暴露端口多
# ES十分耗内存
# ES的目录一般要存放安全目录挂载
# --net somenetwork网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
# 查看docker stats
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPS="-Xms64m -Xms512m" elasticsearch:tag

Docker安装MinIO

mkdir -p /data/minio/config
mkdir -p /data/minio/data
docker run -p 9000:9000 -p 9090:9090 \--net=host \--name minio \-d --restart=always \-e "MINIO_ACCESS_KEY=username" \-e "MINIO_SECRET_KEY=password" \-v /mydata/minio/data:/mydata/minio/data \-v /mydata/minio/config:/mydata/minio/config \minio/minio server \/data --console-address ":9090" -address ":9000"

可视化

  • 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再用)

docker 镜像

commit镜像

docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交描述信息" -a="作者" 容器ID 目标镜像:[TAG]
docker commit -a="steven" -m="add webapps app" 5f17e0823840 tomcat02:1.0.0

容器数据卷

使用数据卷

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

docker run -d -it -v 主机目录:容器目录 -p 主机端口:容器端口 --name 容器名字
[root@izuf6cn5k7l8xuxojhszqbz home]# docker run -it -v /home/ceshi:/home centos /bin/bash

测试文件同步

好处修改只需要在主机修改即可,容器内会自动同步

安装MySQL

# 获取镜像
[root@izuf6cn5k7l8xuxojhszqbz /]# docker pull mysql:5.7
# 运行容器需要挂载!#安装启动MySQL,需要设置密码,要注意
# 启动MySQL
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名字
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=09091995aq --name mysql5.7 mysql:5.7# 启动成功后,用Navicat链接测试# 在本地创建数据库,查看映射路径

具名和匿名挂载

# 匿名挂载
# -v 查看容器内路径
docker run -d --name nginx01 -v /etc/nginx nginx
# 查看卷 volume
[root@izuf6cn5k7l8xuxojhszqbz /]# docker volume ls
DRIVER              VOLUME NAME
local               843c675d3d847a6c57927c79a5886559482bf4916118f91627bfa35ebbbec45b
# 这种就是匿名挂载 -v 只写了容器内的路径,没有写主机路径# 具名挂载
[root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx nginx:1.10
1c70f133efdc35f9ce52ddafc7e128d88e833290e3815e2c8f1e5c2699319eb7
[root@izuf6cn5k7l8xuxojhszqbz /]# docker volume ls
DRIVER              VOLUME NAME
local               juming_nginx

所有的docker在没有指定目录的情况下默认放在:/var/lib/docker/volumes/xxx/_data目录下

# 具名挂载、匿名挂载、指定目录挂载
-v 容器内路径          # 匿名挂载
-v 容器名字:/容器内路径 # 具名挂载
-v 主机路径::/容器内路径 # 指定路径挂载

拓展

# 通过 -v 容器内路径控制读写权限
# ro readonly 只读
# rw readwrite 读写
docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx:ro nginx:1.10
docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx:rw nginx:1.10# ro只能通过主机修改配置,容器内无法改变

初识DockerFile

DockerFile构建Docker镜像文件!命令脚本体验

# 创建DockerFile文件,名字可以随意,建议就用dockefile
# 文件中的内容 指令(大写)  参数
FROM centos
VOLUME ['volume01','volume02']CMD echo '-----------end-------------'
CMD /bin/bash
# 这里的每个命令就是docker镜像的一层

启动自己的镜像

查看卷挂在路径:docker inspect 容器ID

数据卷容器

多个MySQL同步数据

docker run -it --name 容器名字 --volumes-from 父容器名字 镜像名称:版本号
docker run -it --name docker02 --volumes-from docker01 stevenyin/centos:1.10

DockerFile

DockerFile介绍

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

构建步骤

  1. 编写dockerfile脚本文件
  2. 通过docker build -f dockerfile路径 -t 镜像名称(stevenyin/centos:1.1.0) .
  3. 运行镜像 docker run
  4. 发布镜像 docker push(DockerHub、阿里云镜像仓库)

查看一下官方是怎做的

DockerFile构建过程

基础知识

  1. 每一个保留关键字(指令)都必须是大写
  2. 从上到下依次执行
  3. #代表注释
  4. 每一条指令都会构建一个镜像层

dockerfile是面向开发的,以后发布项目,做镜像就需要编写dockerfile文件

步骤

  1. DockerFile:构建文件,定义步骤,相当于源代码
  2. DockerImages:通过DockerFile构建生成镜像,最终发布和运行产品
  3. DockerContainer:容器就是为镜像运行提供环境

DockerFile指令

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

构建centos

# 1.编写配置文件dockerfile文件
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# vim mydockerfile-centos
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER steven<yinhaoye@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD $MYPATH
CMD echo "------end------"
CMD /bin/bash
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]#
# 2.通过文件构建镜像
# 命令 docker build -f dockerfile -t 镜像:[tag] .
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker build -f /home/dockerfile/mydockerfile-centos -t stevenyin/centos:1.11 .
Successfully built 502fedcf049b
Successfully tagged stevenyin/centos:1.11

查看docker构建镜像历史

# 查看docker 镜像构建历史
# docker history 镜像ID
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker history  502fedcf049b
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
502fedcf049b        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
a77ba559c57e        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
32e6bf5b4d27        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "$MYP…   0B
5c37e637387e        12 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B
b80d50163d6d        12 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB
c682c6f2c7e5        12 minutes ago      /bin/sh -c yum -y install vim                   57.2MB
a7a7c274e0db        13 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B
2cd2577889b9        13 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
4c14c20e220e        13 minutes ago      /bin/sh -c #(nop)  MAINTAINER steven<yinhaoy…   0B
0d120b6ccaa8        2 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           2 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]#

CMD和ENTRYPOINT的区别

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

CMD测试

# 1.编写dockerfile文件mydockerfile-cmd
FROM centos
CMD ["ls","-a"]
# 2.构建镜像
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker build -f mydockerfile-cmd -t stevenyin/cmd:1.10 .
# run运行,发现 ls -a 生效了
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/cmd:1.10
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
opt
root
run
sbin
srv
sys
tmp
usr
var
# 3. 想追加命令 -l  ls -al
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/cmd:1.10 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# CMD情况下-l 替换了CMD ["ls","-a"] -l不是命令所以报错

ENTRYPOINT测试

# 1.编写DockerFile文件
FROM centos
ENTRYPOINT ["ls","-a"]
# 2.构建镜像
docker build -f mydockerfile-entrypoint -t stevenyin/entrypoint:1.10 .
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/entrypoint:1.10
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/entrypoint:1.10 -l
total 56
drwxr-xr-x   1 root root 4096 Oct 25 02:22 .
drwxr-xr-x   1 root root 4096 Oct 25 02:22 ..
-rwxr-xr-x   1 root root    0 Oct 25 02:22 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 Oct 25 02:22 dev
drwxr-xr-x   1 root root 4096 Oct 25 02:22 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 120 root root    0 Oct 25 02:22 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 Oct 24 02:53 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
[root@izuf6cn5k7l8xuxojhszqbz dockerfile]# 

发布镜像

DockerHub

  1. 注册账号:https://hub.docker.com/

  2. 登录账号

    [root@izuf6cn5k7l8xuxojhszqbz software]# docker login --helpUsage:    docker login [OPTIONS] [SERVER]Log in to a Docker registry.
    If no server is specified, the default is defined by the daemon.Options:-p, --password string   Password--password-stdin    Take the password from stdin-u, --username string   Username
    [root@izuf6cn5k7l8xuxojhszqbz software]#
    [root@izuf6cn5k7l8xuxojhszqbz software]# docker login -u stevenyin
    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-storeLogin Succeeded
    [root@izuf6cn5k7l8xuxojhszqbz software]#
    
  3. 登录完毕后就可以提交镜像了,就是一部docker push

[root@izuf6cn5k7l8xuxojhszqbz software]# docker push stevenyin/centos:1.11
The push refers to repository [docker.io/stevenyin/centos]
5bf7e4a8471d: Pushed
bf760cbda826: Pushed
291f6e44771a: Layer already exists
digest1.11: digest: sha256:530a45736f79e50515baa5591fc76635184dd783089ec3e1ebb21c261137d8db size: 953
# 为镜像增加tag: docker tag stevenyin/centos:1.12

发布到阿里云镜像服务上

  1. 登陆阿里云
  2. 找到容器镜像服务
  3. 创建命名空间

  1. 创建容器镜像

  1. 推送镜像具体步骤

    1. 登录阿里云Docker Registry
    $ sudo docker login --username=yinghaoye123aq registry.cn-shanghai.aliyuncs.com
    用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。2. 从Registry中拉取镜像
    $ sudo docker pull registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[镜像版本号]
    3. 将镜像推送到Registry
    $ sudo docker login --username=yinghaoye123aq registry.cn-shanghai.aliyuncs.com
    $ sudo docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[镜像版本号]
    $ sudo docker push registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[镜像版本号]
    请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。4. 选择合适的镜像仓库地址
    从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shanghai.aliyuncs.com 作为Registry的域名登录。
    5. 示例
    使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。$ sudo docker images
    REPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    registry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
    $ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-shanghai.aliyuncs.com/acs/agent:0.7-dfb6816
    使用 "docker push" 命令将该镜像推送至远程。$ sudo docker push registry-vpc.cn-shanghai.aliyuncs.com/acs/agent:0.7-dfb6816
    

Docker 网络

理解Docker0

# [root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -p 3355:8080 --name tomcat9 tomcat:9.0
# 查看容器内网络地址 ip addr,启动后会发现有261: eth0@if262 IP地址
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
261: eth0@if262: <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 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
[root@izuf6cn5k7l8xuxojhszqbz ~]# # linux 能不能ping通容器内部
[root@izuf6cn5k7l8xuxojhszqbz ~]# 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.086 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms

原理

  1. 每启动一个docker容器,docker就会给docker容器分配一个IP,只要安装docker就会产生docker0的桥接模式的网卡,使用的技术是evth-pair技术!

  1. 再次启动一个容器发现又多了一对网卡

# 容器带来的网卡都是一对一对的
# evth-pair就是一对虚拟的网络设备接口,他们都是成对出现的一端连着协议,另一端彼此相连
  1. 两个容器间可以ping通
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9 ping 172.17.0.3
# 容器间是可以ping通的

网络模型

在不指定网络的情况下,都是由docker0路由的,docker会默认分派一个可用的IP

docker 使用的是liunx中的桥接,宿主机是docker中的网桥,docker0

–link

# 不能通过服务名ping通另一个容器,只能通过IP
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9
ping: tomcat9: Name or service not known
[root@izuf6cn5k7l8xuxojhszqbz ~]#
# 通过--link可以通过容器名使容器间进行联通[root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.2 --link tomcat9 tomcat:9.0
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.2 ping tomcat9
PING tomcat9 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat9 (172.17.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from tomcat9 (172.17.0.2): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcat9 (172.17.0.2): icmp_seq=3 ttl=64 time=0.064 ms

探究inspect

tomcat9.2是在本地配置了tomcat9

# 在hosts里配置,远离在这里发现
[root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it tomcat9.2 cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  tomcat9 a3d12cff39da
172.17.0.4  7f5cb56cad3f
[root@izuf6cn5k7l8xuxojhszqbz /]#

本质探究: – link就是在hosts文件中增加了172.17.0.2 tomcat9 a3d12cff39da 的映射

局限:docker0不支持容器名访问

自定义网络

查看网络

网络模式

bridge:桥接网络docker(默认,自己创建也是有桥接模式)

none:不配置网络

host:和宿主机共享网络

container:容器内可以连通(用的少,不建议使用)

测试

# 直接启动 --net bridge 默认就是docker0
docker run -d -P --name tomcat9 --net bridge tomcat:9.0# docker0不能通过域名访问,可以通过--link 连通# 自定义网路
--driver bridge 桥接模式
--subnet 192.168.0.0/16 子网地址
--gateway 192.168.0.1 网关
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
36c4197f8b73de837495b148d4b95a2f03c6747608733a2b5d506b98c653f034
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1edaf6a32eb9        bridge              bridge              local
18b32561b08d        host                host                local
abdd0e9a3c22        mydata_default      bridge              local
36c4197f8b73        mynet               bridge              local
a7f1b5a0ad78        none                null                local
[root@izuf6cn5k7l8xuxojhszqbz ~]#

# 使用自定义网络启动容器
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.1 --net mynet tomcat:9.0
658aab97504ae8ee63204c78bd431fc37b41677c51121fa96c2041961d912a80
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.2 --net mynet tomcat:9.0
97216395cd5188beab139a3f957019d42aa1b9da91a26d6b3cfd907fabc6b78f
# 查看自定义网络
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker network inspect mynet
[{"Name": "mynet","Id": "36c4197f8b73de837495b148d4b95a2f03c6747608733a2b5d506b98c653f034","Created": "2020-10-25T21:45:21.745587216+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"658aab97504ae8ee63204c78bd431fc37b41677c51121fa96c2041961d912a80": {"Name": "tomcat9.1","EndpointID": "168eb519cd776907149fd9d97121e0a068f2ea28a6b81e86cbac04b742d82721","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"97216395cd5188beab139a3f957019d42aa1b9da91a26d6b3cfd907fabc6b78f": {"Name": "tomcat9.2","EndpointID": "00b1cc23a06c62087e7606b8b5286807ce0b7c3aca7d43a26cb8362147d10416","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]
[root@izuf6cn5k7l8xuxojhszqbz ~]#
# 再次测试不使用--link也可以通过容器名访问
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9.2
PING tomcat9.2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.066 ms
[root@izuf6cn5k7l8xuxojhszqbz ~]#

网络联通

 # 网络联通 docker network connect 网络名 容器名docker network connect mynet tomcat9.2.2# 联通之后将tomcat9.1.1放入mynet网络下# 一个容器两个IP

[root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9.1.1
PING tomcat9.1.1 (192.168.0.4) 56(84) bytes of data.
64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.082 ms
[root@izuf6cn5k7l8xuxojhszqbz ~]# 

实战部署Redis

安装单机版Redis

1.下载镜像

docker pull redis

2.创建挂载的目录和配置文件

mkdir -p /mydata/redis/conf
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# cd /mydata/redis/conf/
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# touch redis.conf

3.启动redis

# 结果
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

4.命令解释

命令解释
-p 6379:6379 端口映射:前表示主机部分,:后表示容器部分。
–name myredis 指定该容器名称,查看和进行操作都比较方便。
-v 挂载目录,规则与端口映射相同。
-d redis 表示后台启动redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis.conf
appendonly yes 开启redis 持久化

  1. 进入redis
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker exec -it redis redis-cli

实战部署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.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 启动reids容器
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.30.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 创建集群
[root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it redis-1 /bin/sh
/data # redis-cli --cluster create 172.30.0.11:6379 172.30.0.12:6379 172.30.0.13:6379 172.30.0.14:6379 172.30.0.15:6379 172.30.0.16:6379 --c
luster-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.30.0.15:6379 to 172.30.0.11:6379
Adding replica 172.30.0.16:6379 to 172.30.0.12:6379
Adding replica 172.30.0.14:6379 to 172.30.0.13:6379
M: 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379slots:[0-5460] (5461 slots) master
M: 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379slots:[5461-10922] (5462 slots) master
M: f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379slots:[10923-16383] (5461 slots) master
S: 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379replicates f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6
S: 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379replicates 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd
S: a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379replicates 039ee87ac86de914417233448396a3c089669a2b
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.30.0.11:6379)
M: 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379slots: (0 slots) slavereplicates 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd
S: 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379slots: (0 slots) slavereplicates f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6
M: 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
M: f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379slots: (0 slots) slavereplicates 039ee87ac86de914417233448396a3c089669a2b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
/data # # 测试集群
/data # redis-cli -c
127.0.0.1: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:1
cluster_stats_messages_ping_sent:480
cluster_stats_messages_pong_sent:475
cluster_stats_messages_sent:955
cluster_stats_messages_ping_received:470
cluster_stats_messages_pong_received:480
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:955
127.0.0.1:6379> cluster nodes
20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379@16379 slave 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 0 1603708641983 5 connected
534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379@16379 slave f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 0 1603708641000 4 connected
96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379@16379 myself,master - 0 1603708640000 1 connected 0-5460
039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379@16379 master - 0 1603708640580 2 connected 5461-10922
f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379@16379 master - 0 1603708640000 3 connected 10923-16383
a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379@16379 slave 039ee87ac86de914417233448396a3c089669a2b 0 1603708640000 6 connected
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.30.0.13:6379
OK
172.30.0.13:6379> get a
^C
/data # redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.30.0.14:6379
"b"
172.30.0.14:6379> cluster nodes
534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379@16379 myself,master - 0 1603708963000 7 connected 10923-16383
a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379@16379 slave 039ee87ac86de914417233448396a3c089669a2b 0 1603708964000 2 connected
039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379@16379 master - 0 1603708964000 2 connected 5461-10922
f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379@16379 master,fail - 1603708902628 1603708901000 3 connected
96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379@16379 master - 0 1603708965564 1 connected 0-5460
20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379@16379 slave 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 0 1603708964563 1 connected
172.30.0.14:6379> 

docker搭建集群完成!

安装ZooKeeper

一、单机搭建

  1. 下载镜像

    [root@izuf6cn5k7l8xuxojhszqbz ~]# docker pull zookeeper:3.5
    
  2. 创建数据挂载目录

    /mydata/zookeeper/conf
    /mydata/zookeeper/data
    /mydata/zookeeper/datalog

  3. 运行zookeeper

    docker run -d --name zookeeper3.5 \
    --restart always \
    -p 2181:2181 -p 2888:2888 -p 3888:3888 \
    -v /mydata/zookeeper/conf:/conf \
    -v /mydata/zookeeper/data:/data \
    -v /mydata/zookeeper/datalog:/datalog \
    zookeeper:3.5
    
  4. 进入zookeeper容器

    [root@izuf6cn5k7l8xuxojhszqbz zookeeper]# docker exec -it  zookeeper3.5 /bin/bash
    root@1d0a2f5178b8:/apache-zookeeper-3.5.8-bin/bin# ls
    README.txt    zkCli.cmd  zkEnv.cmd  zkServer-initialize.sh  zkServer.sh      zkTxnLogToolkit.sh
    zkCleanup.sh  zkCli.sh   zkEnv.sh   zkServer.cmd        zkTxnLogToolkit.cmd
    root@1d0a2f5178b8:/apache-zookeeper-3.5.8-bin/bin# ./zkCli.sh
    Connecting to localhost:2181
    log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Welcome to ZooKeeper!
    JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0] create /test test
    Created /test
    [zk: localhost:2181(CONNECTED) 1] get /test
    test
    [zk: localhost:2181(CONNECTED) 2]
    

二、集群搭建

  1. 在/mydata/下创建zookeeper-cluster文件夹

    mkdir zookeeper-cluster
    
  2. 在/mydata/zookeeper-cluster下创建三个zookeeper0x文件夹

    mkdir zookeeper01
    mkdir zookeeper02
    mkdir zookeeper03
    
  3. 每个zookeeper0x下建立如下

    mkdir conf data datalog
    

    1. 在/mydata/zookeeper-cluster目录下创建docker-compose.yml文件并编写
    touch docker-compose.yml  //创建文件
    vim docker-compose.yml   //进入vim编译器
    

    编写docker-compose.yml文件

    version: '3'#版本号固定写法
    services:zoo1:image: zookeeper #使用的镜像restart: always #宕机后自动重启hostname: zoo1 #承载zookeeper容器的主机(父容器)名 可省略container_name: zoo1 #容器名privileged: true #使用该参数,container内的root拥有真正的root权 privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。ports: #主机和容器的端口映射- "2181:2181" volumes:  #创建zookeeper容器在宿主机的挂载目录- /mydata/zookeeper-cluster/zookeeper01/data:/data #数据- /mydata/zookeeper-cluster/zookeeper01/datalog:/datalog #日志- /mydata/zookeeper-cluster/zookeeper01/conf:/conf #配置文件environment: #zookeeper3.4 和zookeeper 3.5在docker环境下搭建集群差异就在这里 #zoo1为容器名,也是主机名,意思为使用容器的内网通信(1)Zookeeper3.5 中指定的 ZOO_SERVERS 参数的 IP 地址和端口号后面多加了 “;2181 ”。(2)ZOO_SERVERS 指定ip时本机的ip地址写 0.0.0.0。ZOO_MY_ID: 1ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo2:image: zookeeperrestart: alwayshostname: zoo2container_name: zoo2privileged: trueports:- "2182:2181"volumes:- /mydata/zookeeper-cluster/zookeeper02/data:/data- /mydata/zookeeper-cluster/zookeeper02/datalog:/datalog- /mydata/zookeeper-cluster/zookeeper02/conf:/confenvironment:ZOO_MY_ID: 2ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo3:image: zookeeperrestart: always hostname: zoo3container_name: zoo3privileged: trueports: - "2183:2181"volumes:- /mydata/zookeeper-cluster/zookeeper03/data:/data- /mydata/zookeeper-cluster/zookeeper03/datalog:/datalog- /mydata/zookeeper-cluster/zookeeper03/conf:/confenvironment:ZOO_MY_ID: 3ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
    1. 运行docker-compose.yml文件
    docker-compose up -d
    
    1. 停止集群
    docker-compose down
    
    1. 查看创建好的zookeeper集群
    docker ps
    或在docker-compose.yml文件所在目录输入
    docker-compose ps
    

Docker Compose

简介

Docker Compose 定义、运行、管理容器

A docker-compose.yml looks like this:

version: "3.8"
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes:logvolume01: {}

Compose概念

  1. 服务service,容器、应用(web、Redis、MySQL…)
  2. project(项目),一组关联的容器

安装

  1. 运行安装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

  1. 给docker-compose可执行的权限
sudo chmod +x /usr/local/bin/docker-compose

  1. 快速开始:https://docs.docker.com/compose/gettingstarted/

Docker笔记整理相关推荐

  1. Kafka入门篇学习笔记整理

    Kafka入门篇学习笔记整理 Kafka是什么 Kafka的特性 应用场景 Kafka的安装 单机版部署 集群部署环境准备 Kafka 2.x集群部署 Kafka 3.x集群部署 监听器和内外网络 K ...

  2. 运维开发笔记整理-前后端分离

    运维开发笔记整理-前后端分离 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流 ...

  3. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)

    <繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...

  4. 一文让你完全弄懂逻辑回归和分类问题实战《繁凡的深度学习笔记》第 3 章 分类问题与信息论基础(上)(DL笔记整理系列)

    好吧,只好拆分为上下两篇发布了>_< 终于肝出来了,今天就是除夕夜了,祝大家新快乐!^q^ <繁凡的深度学习笔记>第 3 章 分类问题与信息论基础 (上)(逻辑回归.Softm ...

  5. 一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

    <繁凡的深度学习笔记>第 2 章 回归问题与神经元模型(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net/ http ...

  6. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作 #创建 #数据库的创建 USE mysql; CREATE DATABASE db_x; #删除 #删除数据库 DROP DA ...

  7. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  9. python eval 入门_Python学习笔记整理3之输入输出、python eval函数

    Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...

最新文章

  1. P2P之UDP穿透NAT的原理
  2. Android的一些属性使用
  3. 阿里云云服务器更新GCC是提示错误解决方案
  4. 关于判断checkbox选中问题
  5. rhel6下组建两台主机的HA集群
  6. CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置
  7. 洛谷——P1927 防护伞
  8. 求解偏微分方程开源有限元软件deal.II学习--Step 13
  9. android studio adb 连接mumu 模拟器
  10. wpf 点击按钮弹出新对话框_WPF学习弹出新窗口
  11. Green Screen Wizard Pro(绿幕摄影软件)官方正式版V12.1 | 绿屏拍摄有什么软件?
  12. 第21章 DHCP
  13. 2020年SEM小搜投放指南:竞价小渠道如何把效果做到极致
  14. 电子合同是什么意思,电子合同怎么签才有效?
  15. 揭开中本聪的真实身份?这只是杀毒软件之父疯狂人生中的一件小事
  16. 【QT】回调函数的实现
  17. layui复选框,设置部分可选
  18. aria2c指定下载存储路径的一个问题(可能不算bug)
  19. 201掘安杯网络安全赛web的write up
  20. git(7)自定义 Git

热门文章

  1. spring 事务 配置 多个
  2. linux虚拟文件系统vfs
  3. MariaDB exists 学习
  4. 关于KVM的几篇细节文档
  5. 关于我喜欢计算机的作文600字,关于我喜欢的字作文600字5篇
  6. bool类型头文件_[C++基础入门] 2、数据类型
  7. java exception 乱码_java 常见中文乱码问题解决
  8. java编写科赫曲线_分形——科赫曲线
  9. 基于stm32f405控制三相无刷电机例程_直流有刷电机和无刷电机的区别
  10. POI:根据单元格的自定义名获取单元格的位置