Docker入门

目录
  • Docker运行流程
  • Docker的基本组成
  • Docker安装
    • 阿里云镜像加速
  • Docker命令
    • 容器信息命令
    • 镜像命令
      • docker images 查看本地的主机上的镜像
      • docker search 搜索镜像
      • docker pull 镜像下载
      • docker rm镜像删除
    • 容器命令
      • docker run 新建并启动容器
      • 退出容器
      • 进入当前正在运行的容器
      • 列出所有运行的容器
      • 删除容器
      • 启动和停止容器
    • 其他重要命令
      • 容器日志
      • 容器进程
      • 容器元数据
      • 从容器内拷贝至主机
    • 小结
    • Docker可视化工具
  • Docker镜像
    • UnionFS(联合文件系统)
    • Docker 镜像加载原理
    • 分层理解
    • commit 镜像
  • 容器数据卷
    • 添加数据卷
    • 实战:安装Mysql
    • 具名和匿名挂载
    • 默认卷所在路径
  • DockerFile
    • 初识Dockerfile
    • 数据卷容器
      • 实现多台虚拟机数据共享
      • 实现多个mysql数据共享
    • Dockerfile构建过程
      • Dockerfile基础知识
      • dockerfile常用指令
      • 实战测试-构建myCentos
      • 实战测试-构建Tomcat
    • 发布镜像
      • 发布到DockerHub
      • 发布到阿里云容器服务
    • 小结
  • Docker网络原理
    • 网络原理概述
    • 容器互联 --link
    • 自定义网络配置
      • 配置前环境准备
      • 自定义配置
      • 在自己配置的网络内启动容器
    • 网络连通
    • 实战:部署Redis集群
  • SpringBoot微服务打包Docker镜像
  • Docker Compose
  • Docker Swarm
  • CI\CD Jenkins

Docker运行流程

1、Java开发项目+运行环境

2、打包项目带上所有环境(redis、mysql、jdk...)

3、Docker仓库

4、下载发布的镜像

5、直接运行

Docker的基本组成

Docker入门_第1张图片

镜像(image): 就相当于是一个 root 文件系统

容器(container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等

仓库(repository): 仓库可看成一个代码控制中心,用来保存镜像

Docker安装

配置环境

# 系统内核
[root@centos701 /]# uname -r
3.10.0-1127.el7.x86_64

#系统版本
[root@centos701 /]# 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"

安装:参考官方的帮助文档

docker安装文档

# 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.设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 更新yum软件包索引
[root@centos701 /]# yum makecache fast

# 4.安装docker 社区版
yum install docker-ce docker-ce-cli containerd.io

# 5.启动docker
sudo systemctl start docker

# 6.检测Docker是否正确安装
docker version

# 7.启动hello world
sudo docker run hello-world

...

# 8.卸载docker依赖
$ sudo yum remove docker-ce docker-ce-cli containerd.io

# 9.删除资源
$ sudo rm -rf /var/lib/docker

阿里云镜像加速

  • 登录阿里云-容器镜像服务
  • 选择镜像加速器

  • 配置使用

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

Docker命令

容器信息命令

##查看docker容器版本
docker version
##查看docker容器信息
docker info
##查看docker容器帮助
docker --help

帮助文档地址

镜像命令

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

# 列出本地images
docker images

# 可选项
  -a, --all            # 列出所有的镜像
      --digests        # 显示镜像摘要信息(DIGEST列)
      --no-trunc       # 显示镜像完整信息
      
  -q, --quiet          # 只显示ID
  
  -aq				   # 显示所有的镜像ID

docker search 搜索镜像

# 搜索仓库MySQL镜像
docker search mysql

# --filter=stars=600:只显示 starts>=600 的镜像
docker search --filter=stars=600 mysql

docker pull 镜像下载

# 下载 mysql 官方最新镜像,相当于:docker pull mysql:latest(默认下载最新版)
docker pull mysql

# 指定版本下载
docker pull mysql:5.7

docker rm镜像删除

# 单个镜像删除,相当于:docker rmi mysql:latest
docker rm mysql

# 强制删除(针对基于镜像有运行的容器进程)
docker rm -f mysql

#多个镜像删除,不同镜像间以空格间隔
docker rm -f mysql tomcat nginx

#删除本地全部镜像
docker rmi -f $(docker images -q)

容器命令

# 下载centos镜像
docker pull centos

docker run 新建并启动容器

# 新建并启动容器,参数:

--name  为容器指定一个名称
-d  	后台启动容器
-it  	以交互模式运行容器;

-p  	为容器重新分配一个伪输入终端
	-p 主机端口:容器端口
	-p ip:主机端口:容器端口
	-p 容器端口
	
-P		随机指定端口

# 启动并进入容器
[root@centos701 ~]# docker run -it centos /bin/bash
[root@7cba555266ed /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr


[^注意 ]: Docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中,命令/bin/bash 就是在容器启动后运行bash

# 后台启动容器,参数:-d  已守护方式启动容器

# 启动nginx 配置主机端口映射
docker run -d --name nginx01 -p 3344:80 nginx

[root@centos701 ~]# docker ps

CONTAINER ID  IMAGE         COMMAND             CREATED        STATUS           PORTS                  NAMES

1e400bdaf5a8  nginx "/docker-entrypoint.…"   10 seconds ago   Up 8 seconds    0.0.0.0:3344->80/tcp   nginx01

a45b98f28f42  centos      "/bin/bash"        26 minutes ago   Up 26 minutes                    youthful_bose

# 本机自测端口 
[root@centos701 ~]# curl localhost:3344



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

# 输入本机IP+端口即可在浏览器中对Nginx进行访问 http://192.168.2.140:3344/

退出容器

exit # 直接停止容器并退出
Ctrl + P + Q # 容器后台运行并退出

进入当前正在运行的容器

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

# 方式一: 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 容器ID/NAMES /bin/bash

# 方式二: 进入容器正在执行的终端,不会启动新的进程
docker attach 容器ID

列出所有运行的容器

# 列出当前运行的容器信息
[root@centos701 ~]# docker ps

# 列出所有的容器信息: 当前+过去运行过的
[root@centos701 ~]# docker ps -a

# 查看正在运行的容器的ID
[root@centos701 ~]# docker ps -q

#显示运行容器总文件大小
[root@centos701 ~]# docker ps -s

# 显示最近创建容器
[root@centos701 ~]# docker ps -l

# 显示最近创建的3个容器
[root@centos701 ~]# docker ps -n 3

# 不截断输出
[root@centos701 ~]# docker ps --no-trunc 

删除容器

# 停止一个运行中的容器
docker stop 容器ID/NAMES

# 杀掉一个运行中的容器
docker kill 容器ID/NAMES

# 删除一个已停止的容器
docker rm 容器ID/NAMES

# 删除一个运行中的容器
docker rm -f 容器ID/NAMES

# 删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

# -l 移除容器间的网络连接,连接名为 db
docker rm -l db 

# -v 删除容器,并删除容器挂载的数据卷
docker rm -v 容器ID/NAME

启动和停止容器

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

其他重要命令

容器日志

# 查看redis容器日志,默认参数
docker logs redis

# 查看redis容器日志,参数:-f  跟踪日志输出;-t   显示时间戳;--tail  仅列出最新N条容器日志;
docker logs -f -t --tail=20 redis

# 查看容器redis从2019年05月21日后的最新10条日志。
docker logs --since="2019-05-21" --tail=10 redis

容器进程

# top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
# 列出容器中运行进程
docker top 容器ID

容器元数据

# 获取镜像的元信息
docker inspect 容器ID

# 获取正在运行的容器redis的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis

从容器内拷贝至主机

# 将contos容器中的文件copy至本地路径
docker cp 容器ID:/[container_path] [local_path]

# 将主机文件copy至容器
docker cp [local_path] 容器ID:/[container_path]/

# 将主机文件copy至容器,目录重命名为[container_path](注意与非重命名copy的区别)
docker cp [local_path] 容器ID:/[container_path]

小结

Docker入门_第2张图片

Docker可视化工具

  • protainer
docker run -d -p 9000:9000 \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name prtainer-test \
    docker.io/portainer/portainer

http://192.168.2.140:9000/ 通过本地IP加端口号9000访问 密码8位:12341234

Docker镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

UnionFS(联合文件系统)

​ Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来层层的叠加,

同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

​ 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统你那个,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。

Docker 镜像加载原理

​ docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS

​ bootfs ( boot file system ) 主要包含 bootloader 和kernel,bootloader 主要是引导加载 kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

​ rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。

​ 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

Docker入门_第3张图片

分层理解

所有docker镜像都是起始于一个基础镜像,当镜像修改或增加内容时,就会在当前镜像层之上,创建新的镜像层容器数据卷

分层时有文件更新直接替换,基础镜像一样时直接拿过来复用

Docker入门_第4张图片

如redis下载时,第一层相同,直接复用,其他几层分层下载

afb6ec6fdc1c: Already exists 
608641ee4c3f: Pull complete 
668ab9e1f4bc: Pull complete 
78a12698914e: Pull complete 
d056855f4300: Pull complete 
618fdf7d0dec: Pull complete 

特点: docker镜像是只读的,容器启动时,一个新的可写层被加载到镜像顶部,这一层就是容器层,容器之下为镜像层

例如: tomcat镜像层+WEB项目容器层====>打包发布

commit 镜像

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

docker commit -m="提交的描述信息“ -a="作者" 容器id 目标镜像名

[root@centos701 ~]# docker commit -m="firt commit" -a="duckbb" f6782bec938a tomcat02
sha256:b318ebe32790ae04a980a54717a6f45ef6a1c6dbf186d9644f6707e3789eaf06
[root@centos701 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat02              latest              b318ebe32790        8 seconds ago       652MB
nginx                 latest              4392e5dad77d        4 days ago          132MB
portainer/portainer   latest              cd645f5a4769        5 days ago          79.1MB
mysql                 5.7                 a4fdfd462add        2 weeks ago         448MB
tomcat                9.0                 1b6b1fe7261e        3 weeks ago         647MB
tomcat                latest              1b6b1fe7261e        3 weeks ago         647MB
centos                latest              470671670cac        4 months ago        237MB
hello-world           latest              bf756fb1ae65        5 months ago        13.3kB

容器数据卷

​ 当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享

​ docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷

  • 特点
    • 数据卷可以在容器之间共享或重用数据
    • 数据卷中的更改可以直接生效
    • 数据卷中的更改不会包含在镜像的更新中
    • 数据卷的生命周期一直持续到没有容器使用它为止

添加数据卷

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

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

# 将主机的home下test文件夹同docker镜像centos中的home目录进行挂载
[root@centos701 home]# docker run -it -v /home/test:/home centos /bin/bash  

# 通过元数据进行查看是否挂载成功
docker inspect 容器ID
# 其中返回的数据中 Mounts > Source和Destination 会显示挂载信息

方式二:通过DockerFile添加

实战:安装Mysql

# 获取镜像
docker pull mysql:5.7

# 启动mysql,需要配置密码
# 官方的命令
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 实现myslq配置文件和mysql数据的挂载,配置mysql密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
  • 启动完成后 在win下mysql进行连接:即可访问

  • 在win系统下新建数据库 db_docker_test 同时也会出现在centos 中 /home/mysql/data 中
[root@centos701 db_docker_test]# pwd
/home/mysql/data/db_docker_test

具名和匿名挂载

# 匿名挂载
- v 容器内的路径
docker run -d -P --name nginx02 -v /ect/nginx nginx 

# 查看所有的Volume
docker volume ls

DRIVER              VOLUME NAME (匿名)
local               7cba9dbf7d218ed32223f3601454e170ebccd62c05fbb35a72592b2fe98200ba
local               44211afca55e7f26514fb02f7084908666125f8359b993005f032365af062b90

# 具名挂载: -v 卷名:容器内路径

docker run -d -P --name nginx03 -v juming-nginx:/ect/nginx nginx 

DRIVER              VOLUME NAME
local               7cba9dbf7d218ed32223f3601454e170ebccd62c05fbb35a72592b2fe98200ba
local               44211afca55e7f26514fb02f7084908666125f8359b993005f032365af062b90
local               juming-nginx

# 查看具名卷的信息---所有的卷所在在默认目录 Mountpoint
[root@centos701 home]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-06-07T21:01:50+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

默认卷所在路径

/var/lib/docker/volumes/

# 挂载方式总结
-v 容器内路径		# 匿名挂载
-v 卷名:容器内路径		# 具名挂载
-v /宿主主机路径:容器路径	# 指定路径挂载

拓展

# 通过 -v 容器内路径:ro/rw 改变读写权限
# ro readonly 只读---只能通过宿主机操作,容器内部无法操作
# rw readwrite 可读可写

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

DockerFile

Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令每一条指令构建一个新的镜像层,因此每一条指令的内容,就是描述该层应当如何构建,最终生成DockerImages镜像

初识Dockerfile

# 创建一个Dockerfile文件路径
[root@centos701 home]# mkdir docker-test-volume

# 创建一个Dockerfile文件
[root@centos701 docker-test-volume]# touch dockerfile

# 文件中的内容
FROM centos

VOLUME ["volume01","volume02"]

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

# 生成镜像
[root@centos701 docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile -t dockbb-centos:1.0 .  
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in b493ccdd7ff8
Removing intermediate container b493ccdd7ff8
 ---> 0656198c3da6
Step 3/4 : CMD echo "--------end--------"
 ---> Running in 23ac87925ed9
Removing intermediate container 23ac87925ed9
 ---> f6647595f953
Step 4/4 : CMD /bin/bash
 ---> Running in ed45d3051994
Removing intermediate container ed45d3051994
 ---> b684b199402a
Successfully built b684b199402a
Successfully tagged dockbb-centos:1.0

# 查看镜像
[root@centos701 docker-test-volume]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
dockbb-centos         1.0                 b684b199402a        3 minutes ago       237MB

# 启动镜像
[root@centos701 docker-test-volume]# docker run -it dockbb-centos:1.0 /bin/bash

# 查看容器内卷的路径
[root@59d13517539c /]# ls -l

total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jun  8 02:12 dev
drwxr-xr-x.   1 root root  66 Jun  8 02:12 etc
drwxr-xr-x.   2 root root   6 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   6 Jan 13 21:48 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 135 root root   0 Jun  8 02:12 proc
dr-xr-x---.   2 root root 162 Jan 13 21:49 root
drwxr-xr-x.  11 root root 163 Jan 13 21:49 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jun  7 06:21 sys
drwxrwxrwt.   7 root root 145 Jan 13 21:49 tmp
drwxr-xr-x.  12 root root 144 Jan 13 21:49 usr
drwxr-xr-x.  20 root root 262 Jan 13 21:49 var
drwxr-xr-x.   2 root root   6 Jun  8 02:12 volume01
drwxr-xr-x.   2 root root   6 Jun  8 02:12 volume02

# 查看宿主机卷挂载路径
[root@centos701 db_docker_test]# docker inspect 59d13517539c

# 外部路径Source
 "Mounts": [
            {
                "Type": "volume",
                "Name": "3831f6630d6abe9ca353bbe8de8b7aa16b198e61b9834135fd555233b872cc75",
                "Source": "/var/lib/docker/volumes/3831f6630d6abe9ca353bbe8de8b7aa16b198e61b9834135fd555233b872cc75/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "233d54a1ba32fcb93fe5664f0acba7e642cc6d255a02233a1188ee142dba083e",
                "Source": "/var/lib/docker/volumes/233d54a1ba32fcb93fe5664f0acba7e642cc6d255a02233a1188ee142dba083e/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

数据卷容器

我们经常需要多个容器之间进行数据共享我们需要用到命令 “--volumes-from”

实现多台虚拟机数据共享

核心思想:使第一个启动的容器变为数据卷容器,让其他的容器进行第一个容器进行挂载即可,被挂载的为父容器

# 启动容器
[root@centos701 /]# docker run -it --name docker01 dockbb-centos:1.0

# 查看数据卷
[root@86c9fe745884 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jun  8 02:36 dev
drwxr-xr-x.   1 root root  66 Jun  8 02:36 etc
drwxr-xr-x.   2 root root   6 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   6 Jan 13 21:48 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 116 root root   0 Jun  8 02:36 proc
dr-xr-x---.   2 root root 162 Jan 13 21:49 root
drwxr-xr-x.  11 root root 163 Jan 13 21:49 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jun  7 06:21 sys
drwxrwxrwt.   7 root root 145 Jan 13 21:49 tmp
drwxr-xr-x.  12 root root 144 Jan 13 21:49 usr
drwxr-xr-x.  20 root root 262 Jan 13 21:49 var
drwxr-xr-x.   2 root root   6 Jun  8 02:36 volume01
drwxr-xr-x.   2 root root   6 Jun  8 02:36 volume02

# 启动第二个容器 并 同步第一个容器的数据卷
[root@centos701 /]# docker run -it --name docker02 --volumes-from docker01 dockbb-centos:1.0

# 查看数据卷 - 此时volume01和volume02同第一个容器的volume01和volume02同步
[root@ce6f8c6fa0ad /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jun  8 02:39 dev
drwxr-xr-x.   1 root root  66 Jun  8 02:39 etc
drwxr-xr-x.   2 root root   6 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   6 Jan 13 21:48 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 117 root root   0 Jun  8 02:39 proc
dr-xr-x---.   2 root root 162 Jan 13 21:49 root
drwxr-xr-x.  11 root root 163 Jan 13 21:49 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jun  7 06:21 sys
drwxrwxrwt.   7 root root 145 Jan 13 21:49 tmp
drwxr-xr-x.  12 root root 144 Jan 13 21:49 usr
drwxr-xr-x.  20 root root 262 Jan 13 21:49 var
drwxr-xr-x.   2 root root   6 Jun  8 02:36 volume01
drwxr-xr-x.   2 root root   6 Jun  8 02:36 volume02

# 在第二容器的volume02数据卷中创建文件,
[root@ce6f8c6fa0ad volume02]# touch  test.txt

# 在第一容器的volume02数据卷查看
[root@86c9fe745884 /]# cd volume02
[root@86c9fe745884 volume02]# ls
test.txt

# 由于第一个容器在宿主机进行了数据卷挂载,那么也会进行数据同步

# 查看第一个容器的元信息,查看挂载路径
[root@centos701 _data]# docker inspect ce6f8c6fa0ad

[root@centos701 _data]# cd /var/lib/docker/volumes/076967d5ed3b8e5d311996a3103bfed8903da1af109239800fd088f433737b61/_data
[root@centos701 _data]# ls
test.txt

实现多个mysql数据共享

# 实现myslq配置文件和mysql数据的挂载,配置mysql密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# mysql01 同步 mysql02 的数据
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

Dockerfile构建过程

  • 编写一个dockerfile文件
  • docker build构建成为一个镜像
  • docker run 运行镜像
  • docker push发布镜像(DockerHub、阿里云镜像仓库)

Dockerfile基础知识

  1. 每一个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. # 表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

Docker入门_第5张图片

dockerfile常用指令

FROM			# 基础镜像
MAINTAINER 		# 镜像的维护者信息:姓名+邮箱
RUN				# 镜像构建的时候需要运行的命令
ADD				# 步骤:tomcat镜像,添加tomcat压缩包,会自动解压
WORKDIR			# 镜像的工作目录
VOLUME			# 挂载目录
EXPOSE			# 保留端口配置

CMD				# 指定容器启动时运行的命令,只有最后一条CMD指令会生效,之前的命令将被替换掉:
				# CMD ["ls","-a"],如果启动编写CMD的镜像并追加命令 -l, 则 ls -a 会被 -l直接替换
				
ENTRYPOINT		# 指定容器启动时运行的命令,可以追加命令:以CMD为例 追加命令 -l,最终命令为变为 ls -a -l

ONBUILD			# 当构建一个被继承的Dockerfile,此时就会运行OBUILED指令
COPY			# 类似ADD,将文件拷贝至镜像中
ENV				# 构建时设置环境变量

Docker入门_第6张图片

实战测试-构建myCentos

DockerHub中99%的镜像都是从基础镜像FROM scratch,然后配置需要的软件

[root@centos701 home]# mkdir dockerfile
[root@centos701 dockerfile]# vi dockerfile-myCentos

# 编写Dockerfile的文件
FROM centos
MAINTAINER duckbb<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install yum
RUN yum -y install net-tools

EXPOSE 80

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

[root@centos701 dockerfile]# docker build -f /home/dockerfile/dockerfile-myCentos -t mycentos:1.0 .  

实战测试-构建Tomcat

  1. 首先上传jdk-8u251-linux-x64.tar.gz,apache-tomcat-9.0.35.tar.gz包
# 创建readme.txt文本
[root@centos701 app]# ll
总用量 201488
-rw-r--r--. 1 root root  11188192 6月   8 13:12 apache-tomcat-9.0.35.tar.gz
-rw-r--r--. 1 root root 195132576 6月   8 13:19 jdk-8u251-linux-x64.tar.gz
-rw-r--r--. 1 root root         0 6月   8 13:29 readme.txt
  1. 编写dockerfile文件,官方命令Dockerfile, build会自动寻找这个文件,就不需要 -f
FROM centos
MAINTAINER duckbb<[email protected]>

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

ADD jdk-8u251-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.35.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 配置JDK和Tomcat的环境
ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLAAPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/lcoal/apache-tomcat-9.0.35/bin/logs/catalina.out
  1. 构建镜像:docker build
[root@centos701 app]# docker build -t mytomcat .

Sending build context to Docker daemon  206.3MB
Step 1/15 : FROM centos
 ---> 470671670cac
Step 2/15 : MAINTAINER duckbb<[email protected]>
 ---> Running in 3ec9c80d01bf
Removing intermediate container 3ec9c80d01bf
 ---> b3cc78786c6c
Step 3/15 : COPY readme.txt /usr/local/readme.txt
 ---> b6bf650ad46b
Step 4/15 : ADD jdk-8u251-linux-x64.tar.gz /usr/local
 ---> 5d7c81f64e23
Step 5/15 : ADD apache-tomcat-9.0.35.tar.gz /usr/local
 ---> 6c26fb96193f
Step 6/15 : RUN yum -y install vim
 ---> Running in af25667d0234
 
...

Step 15/15 : CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/lcoal/apache-tomcat-9.0.35/bin/logs/catalina.out
 ---> Running in 02712520f11c
Removing intermediate container 02712520f11c
 ---> c2be9b3d98d2
Successfully built c2be9b3d98d2
Successfully tagged mytomcat:latest
  1. 启动镜像:对制作好的Tomcat镜像实现挂载
# 创建主机挂载文件夹
[root@centos701 home]# mkdir tomcat

# 启动并挂在webapps和logs文件夹
[root@centos701 tomcat]# docker run -d -p 3380:8080 --name my_tomcat01 -v /home/tomcat/webapps/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/tomcat/tomcat_logs:/usr/local/apache-tomcat-9.0.35/logs mytomcat  


# 完成挂载
[root@centos701 tomcat]# ll
总用量 0
drwxr-xr-x. 2 root root 197 6月   8 14:06 tomcat_logs
drwxr-xr-x. 3 root root  18 6月   8 14:35 webapps
  1. 访问测试
[root@centos701 tomcat]# curl localhost:3380
  1. 在宿主机编写JSP文件,同步到Tomcat运行
[root@centos701 tomcat]# cd webapps/test/
[root@centos701 test]# mkdir WEB-INF

[root@centos701 test]# vi web.xml

  



[root@centos701 test]# vi index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>



hello world


	

Hello Docker

<% System.out.println("------------test logs------------"); %>
  1. win浏览器中进行测试访问
http://192.168.2.140:3380/test/index.jsp
  1. 查看日志
[root@centos701 test]# cat /home/tomcat/tomcat_logs/cat catalina.out 

...
08-Jun-2020 06:37:15.816 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
08-Jun-2020 06:37:15.850 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [522] milliseconds
------------test logs------------
------------test logs------------

发布镜像

发布到DockerHub

# 登录DockerHub
[root@centos701 tomcat_logs]# docker login -u duckbb
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 查看镜像
[root@centos701 tomcat_logs]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mytomcat              latest              c2be9b3d98d2        About an hour ago   718MB
...

# 更改镜像名称和版本:c2be9b3d98d2(IMAGE ID)
[root@centos701 tomcat_logs]# docker tag c2be9b3d98d2 mytomcat:1.0

# 推送镜像
[root@centos701 tomcat_logs]# docker push mytomcat:1.0

发布到阿里云容器服务

  1. 登录阿里云
  2. 进入容器镜像服务
  3. 命名空间----->创建命名空间
  4. 镜像仓库----->创建镜像仓库----->选择本地仓库
# 登录阿里云
[root@centos701 tomcat_logs]# docker login --username=jasonyanc registry.cn-shenzhen.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# c2be9b3d98d2为推送镜像的ID
[root@centos701 tomcat_logs]# docker tag c2be9b3d98d2 registry.cn-shenzhen.aliyuncs.com/duckbb-jason/duckbb:1.0

# 推送
[root@centos701 tomcat_logs]# docker push registry.cn-shenzhen.aliyuncs.com/duckbb-jason/duckbb:1.0

# 拉取镜像
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/duckbb-jason/duckbb:[镜像版本号]
  1. 在容器镜像服务中查看推送的镜像

小结

Docker入门_第7张图片

Docker网络原理

网络原理概述

参考此文

​ 容器间的互联默认是通过主机进行桥接 (相当于主机是一个路由器,连接该路由器的容器可以进行查表,查找想要访问的ip ,然后进行访问) 方式进行访问的

Docker入门_第8张图片

实现容器互联-通过服务名进行连接

这种方法麻烦不常用

# 启动Tomcat01
[root@centos701 tomcat]# docker run -d -P --name=tomcat01 tomcat                

# 启动Tomcat02并--linkTomcat01
[root@centos701 tomcat]# docker run -d -P --name=tomcat02 --link tomcat01 tomcat 

# 进入Tomcat02 ping Tomcat01
root@38d3052fe9aa:/usr/local# ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=19.1 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.044 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=4 ttl=64 time=0.117 ms

# 查看tomcat02的hosts配置文件,发现其中包含tomcat01的ip映射地址
root@38d3052fe9aa:/usr/local# 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      tomcat01 7fda594270bd
172.17.0.3      38d3052fe9aa

# 此时tomcat01并没有--link tomcat02,因此tomcat01 无法 通过容器名进行连接
# 需要关闭tomcat01 并进行 --link

[root@centos701 tomcat]# docker exec -it tomcat01 ip addr
1: lo:  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
46: eth0@if47:  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
       
[root@centos701 tomcat]# docker exec -it tomcat01 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      7fda594270bd

自定义网络配置

# 查看所有docker网络
[root@centos701 tomcat]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
367d45995479        bridge              bridge              local
e51dd388364c        host                host                local
2596d1a85fa9        none                null                local
网络模式 简介
Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
Bridge 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信
None 该模式关闭了容器的网络功能
Container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围

配置前环境准备

# 关闭所有的容器,并查看网卡
[root@centos701 tomcat]# ip addr

1: lo:  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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f8:f7:f2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.140/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::299d:90bc:d3b1:e33e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0:  mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:b1:2a:d1:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:b1ff:fe2a:d103/64 scope link 
       valid_lft forever preferred_lft forever
       

自定义配置

# 启动容器会默认使用 --net bridge 进行启动,bridge 网络代表docker0所有Docker安装中存在的网络
docker run -d -P --name tomcat01 tomcat 
docker run -d -P --name tomcat01 --net bridge tomcat	# 自动添加

# 自定义:
# --driver 		网络模式 
# -subnet		子网 
# --gateway		网关
[root@centos701 tomcat]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.2.1 mynet
b06f20ded8067eb87fd9f65a28fefb3d4b59f4faa058cbde183a4d4b8c3bd3ca

[root@centos701 tomcat]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
367d45995479        bridge              bridge              local
e51dd388364c        host                host                local
b06f20ded806        mynet               bridge              local
2596d1a85fa9        none

# 查看mynet网络配置信息
[root@centos701 tomcat]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "b06f20ded8067eb87fd9f65a28fefb3d4b59f4faa058cbde183a4d4b8c3bd3ca",
        "Created": "2020-06-08T17:57:04.573181515+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]


在自己配置的网络内启动容器

推荐使用:这样容器之间进行访问就会更加方便,尤其是对集 群非常适合

# 基于自己的配置的网络启动容器
[root@centos701 tomcat]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
828d43498020edd97e1e4f54968d6a2e4766ad476d1afb914edb7530524c6bec

[root@centos701 tomcat]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 
5b8472ed30373479f7d91a43dc061280114aa1897f537eb60d849bd06c9b084e

# tomcat-net-01 ping tomcat-net-02成功 ,反之也可以ping通
[root@centos701 tomcat]# docker exec -it tomcat-net-01 /bin/bash
root@828d43498020:/usr/local/tomcat# ping tomcat-net-02
PING tomcat-net-02 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.117 ms
64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.101 ms

网络连通

​ 上一节中 tomcat-net-01和tomcat-net-02 都是基于 自定义mynet网络进行启动的,那就和基于docker0默认网络配置启动的 tomcat01和tomcat02 隔离了

本节实现 不同网络之间容器的连通

  • 基于docker0网络启动tomcat01和tomcat02
# 基于docker0网络启动tomcat01和tomcat02
[root@centos701 tomcat]# docker start tomcat01
tomcat01
[root@centos701 tomcat]# docker start tomcat02                  
tomcat02

[root@centos701 tomcat]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5b8472ed3037        tomcat              "catalina.sh run"   12 minutes ago      Up 12 minutes       0.0.0.0:32775->8080/tcp   tomcat-net-02

828d43498020        tomcat              "catalina.sh run"   21 minutes ago      Up 21 minutes       0.0.0.0:32774->8080/tcp   tomcat-net-01

38d3052fe9aa        tomcat              "catalina.sh run"   58 minutes ago      Up About a minute   0.0.0.0:32777->8080/tcp   tomcat02

7fda594270bd        tomcat              "catalina.sh run"   58 minutes ago      Up About a minute   0.0.0.0:32776->8080/tcp   tomcat01

  • 在不同网络中,使用容器名称进行 ping 接
# 用tomcat01 ping tomcat-net-01 --net 会连接失败

[root@centos701 tomcat]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
  • 使用mynet网络连接docker网络中的容器
# 使用mynet网络连接docker0网络上的容器(tomcat01和tomcat02)
[root@centos701 tomcat]# docker network connect mynet tomcat01

# 查看mynet网络配置,会发现tomcat01已经被加入该网络
[root@centos701 tomcat]# docker inspect mynet
[
    {
        "Name": "mynet",
        "Id": "b06f20ded8067eb87fd9f65a28fefb3d4b59f4faa058cbde183a4d4b8c3bd3ca",
        "Created": "2020-06-08T17:57:04.573181515+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "5b8472ed30373479f7d91a43dc061280114aa1897f537eb60d849bd06c9b084e": {
                "Name": "tomcat-net-02",
                "EndpointID": "04362f0b7d27eda49100e24f34d7fd69a31867409f9d99dd7d310ddde35c2807",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "7fda594270bd8c5a4ca07920b296b5994575539e854c688921e15f28bc98950d": {
                "Name": "tomcat01",
                "EndpointID": "d38a5ddf12d7d6b2587b843361601034026702385ec0ba1724d42b0a800f7a12",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "828d43498020edd97e1e4f54968d6a2e4766ad476d1afb914edb7530524c6bec": {
                "Name": "tomcat-net-01",
                "EndpointID": "9d36699613b47e15bcb2bf1fc7cca74732e9b94df15dbdca65b4533027fd4e06",
                "MacAddress": "02:42:c0:a8:00:01",
                "IPv4Address": "192.168.0.1/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
  • 再次检查ping接
# 检查是否可以 ping 成功
[root@centos701 tomcat]# docker exec -it tomcat01 ping tomcat-net-01

PING tomcat-net-01 (192.168.0.1) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=3 ttl=64 time=0.044 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=4 ttl=64 time=0.061 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=5 ttl=64 time=0.055 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=6 ttl=64 time=0.049 ms
64 bytes from tomcat-net-01.mynet (192.168.0.1): icmp_seq=7 ttl=64 time=0.042 ms

实战:部署Redis集群

创建3个master 和 3个slave

# 创建网卡
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

# 创建好之后,可以进入/mydata/redis中查看配置信息

创建redis集群容器,并启动

# 启动redis-1
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.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动 redis-2
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.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动 redis-3
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.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动 redis-4
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.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动 redis-5
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.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动 redis-6
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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

配置集群

# 启动好之后进入容器配置集群
$ docker exec -it redis-1 /bin/sh
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

# 集群客户端启动
$ 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:632
cluster_stats_messages_pong_sent:648
cluster_stats_messages_sent:1280
cluster_stats_messages_ping_received:643
cluster_stats_messages_pong_received:632
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1280

# 节点信息
127.0.0.1:6379> cluster nodes
7bd9860399c5afca1a976fa0f7b3b29c103846b3 172.38.0.15:6379@16379 slave 59232f8bcba54a2aa1bb4ad0d7c2340a09094548 0 1591619949602 5 connected

87ba164120a6a8f32dda413866e892386fc0cd13 172.38.0.12:6379@16379 master - 0 1591619948000 2 connected 5461-10922

ef2c63ed119119e9f2079d093fbc1f465092466a 172.38.0.14:6379@16379 slave c00b25cbe0d35a65c4a6e245a0fc0a7041e7fee7 0 1591619949501 4 connected

1fda7ca221e8ee510b1f49e02201018764523cb9 172.38.0.16:6379@16379 slave 87ba164120a6a8f32dda413866e892386fc0cd13 0 1591619948000 6 connected

c00b25cbe0d35a65c4a6e245a0fc0a7041e7fee7 172.38.0.13:6379@16379 master - 0 1591619949000 3 connected 10923-16383

59232f8bcba54a2aa1bb4ad0d7c2340a09094548 172.38.0.11:6379@16379 myself,master - 0 1591619948000 1 connected 0-5460

# 设置数据
127.0.0.1:6379> set name zhangsan
-> Redirected to slot [5798] located at 172.38.0.12:6379

SpringBoot微服务打包Docker镜像

创建SpringBoot项目

// 创建一个控制器实现跳转
package com.jason.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @authot jason_yan
 * @date 2020/6/8-20:54
 */
@RestController
public class GanController {

    @RequestMapping("/gan")
    public String gan(){
        return "淦";
    }
}

访问地址:http://localhost:8080/gan 即可显示 “淦”

maven打包:mvn clean package

在idea中安装Docker插件:settings---->plugins----->下载docker (编写Dockerfile文件会高亮)

在根目录创建Dockerfile

FROM java:8
COPY .*.jar /app.jar

# 提示端口
CMD ["--server.port=8080"]

EXPOSE 8080

# 执行启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

在虚拟机中创建/home/idea目录

[root@centos701 app]# mkdir /home/idea

将jar包 和 Dockerfile文件上传至虚拟机/home/idea中

[root@centos701 idea]# ll
总用量 16084
-rw-r--r--. 1 root root 16462350 6月   8 21:02 demo-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 root root      167 6月   8 21:18 Dockerfile

构建镜像

[root@centos701 idea]# docker build -t gan .

# 查看镜像
[root@centos701 idea]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
gan                 latest              2d778fd15ac2        11 hours ago        660MB
tomcat              latest              1b6b1fe7261e        3 weeks ago         647MB
redis               5.0.9-alpine3.11    3661c84ee9d0        6 weeks ago         29.8MB
java                8                   d23bdf5b1b1b        3 years ago         643MB

运行镜像

[root@centos701 idea]# docker run -d -p 8080:8080 --name springboot_pro01 gan
04e9f1ff840cc4c0d3220684782242c872449ae6138d65f30e90c218684bc434

# 测试接口
[root@centos701 idea]# curl localhost:8080/gan
淦

win 浏览器测试

测试地址

Docker Compose

Docker Swarm

CI\CD Jenkins

你可能感兴趣的:(Docker入门)