Docker

文档网址:https://docs.docker.com/

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

docker命令文档地址:https://docs.docker.com/reference/

虚拟器技术缺点:

1.资源占用十分多

2.冗余步骤多

3.启动很慢

容器化技术

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

比较docker和虚拟机技术的不同

传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件

容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所有就轻便了。

每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文档,安装程序。

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

更便捷的升级和扩缩容

使用了Docker之后,我们部署应用就和搭积木一样。

项目打包为一个镜像,扩展服务器A!服务器B

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的。‘

更高效的计算资源利用:

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

Docker安装

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==》run ==>tomcat1容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。

启动,停止,删除,基本命令!

目前就可以把这个容器理解为就是一个简易的linux系统

仓库(repository):

仓库就是存放镜像的地方!

仓库分为公有仓库和私有仓库!

Docker Hub(默认是国外的)

阿里云….都有容器服务器(配置镜像加速)

安装Docker

[root@iZbp151pi15pfb733a7a0dZ ~]# uname -r  
3.10.0-1062.18.1.el7.x86_64   #系统内核3.10以上
#系统环境
[root@iZbp151pi15pfb733a7a0dZ ~]# 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"

安装

第一步:卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
第二步:安装新的安装包
yum install -y yum-utils
第三步:设置镜像仓库
yum-config-manager \
    --add-repo \
    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 fast
#第四步:安装docker  docker-ce 社区  ee企业版
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
第五步:启动docker
systemctl start docker
检测是否安装成功
docker version
第六步运行hello-world
docker run hello-world
第七步:查看一下下载的这个hello-world镜像
docker images



# 了解 卸载docker
1.卸载依赖
 yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
 2.删除资源
 rm -rf /var/lib/docker
 # /var/lib/docker   docker的默认工作路径
 
启动docker
systemctl start docker
查看镜像
docker images

阿里云镜像加速

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

2.找到镜像加速地址

3.镜像工具里面的镜像加速器

image-20220618222722226

4.配置使用

1.sudo mkdir -p /etc/docker

2.sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v6xry2a2.mirror.aliyuncs.com"]
}
EOF

3.sudo systemctl daemon-reload

4.sudo systemctl restart docker

docker run的流程分析图:

image-20220618223359038

底层原理

docker是怎么工作的?

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

DockerServer接收到Docker-Client的指令,就会去执行这个命令!

image-20220618224032259

Docker为什么比虚拟机快?

vm安全性最高。

1.Docker有着比虚拟机更少的抽象层

2.Docker利用的是宿主机的内核,vm需要是Guest OS.

image-20220618224354106

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!

docker常用命令

帮助命令

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

镜像命令

[root@iZbp151pi15pfb733a7a0dZ ~]# docker images
REPOSITORY    TAG          IMAGE ID       CREATED        SIZE
rabbitmq      management   6c3c2a225947   6 months ago   253MB
hello-world   latest       feb5d9fea6a5   8 months ago   13.3kB

#解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的id
CREATED     镜像的创建时间
SIZE        镜像的大小

  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs
可选项
-a, --all        #列出所有镜像
-q, --quite      #只显示镜像的id

[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                          MySQL is a widely used, open-source relation…   12745     [OK]       
mariadb                        MariaDB Server is a high performing open sou…   4893      [OK]       


#可选项,通过搜索来过滤
--filter=STARS=3000  #搜索出来的镜像就是STARS大于3000的
[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12745     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4893      [OK]       
[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql --filter=STARS=5000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12745     [OK]  

下载镜像 docker pull

# 下载镜像 docker pull 镜像名[:tag]
[root@iZbp151pi15pfb733a7a0dZ ~]# docker pull mysql
Using default tag: latest       #如果不写tag,默认就是latest,最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete     #分层下载,docker image的核心 联合文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest:sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709#签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址
#命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载,下载版本必须为docker文档里面所有的版本
[root@iZbp151pi15pfb733a7a0dZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists 
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜像 docker rmi

# docker rmi -f 镜像id #删除指定的镜像
# docker rmi -f 镜像id 镜像id #删除多个镜像
# docker rmi -f $(docker images -aq) #删除全部的镜像

容器命令

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

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

#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d             后台方式的运行
-p             指定容器的端口  -p  8080:8080
      -p 主机端口:容器端口 (常用)
      -p ip:主机端口:容器端口
      -p 容器端口
-p   随机指定端口

#测试,启动并进入容器
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it centos /bin/bash
[root@85c129bccffb /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#从容器中退回主机
exit

启动进入容器
docker run -it centos /bin/bash
列出所有的运行的容器
#docker ps 命令
#  列出当前正在运行的容器
-a   #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q # 只显示容器的编号
-aq #显示所有当前容器的编号

[root@iZbp151pi15pfb733a7a0dZ /]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS                          PORTS                                                                                                                                       NAMES
85c129bccffb   centos                "/bin/bash"              2 minutes ago   Exited (0) About a minute ago                                                                                                                                               vigorous_northcutt
5c25c2801811   rabbitmq:management   "docker-entrypoint.s…"   24 hours ago    Up 24 hours                     0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
7ff672b2ca67   feb5d9fea6a5          "/hello"                 35 hours ago    Exited (0) 35 hours ago                                                                                                                                                     bold_montalcini

退出容器
exit  #直接容器停止并退出
Ctrl  +  p  + q #容器不停止退出
[root@iZbp151pi15pfb733a7a0dZ /]# docker run -it centos /bin/bash
[root@0f92d0005998 /]# [root@iZbp151pi15pfb733a7a0dZ /]# 

删除容器
docker rm 容器id   #删除指定的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id     #启动容器
docker restart 容器id   #重启容器
docker stop 容器id      #停止档期正在运行的容器
docker kill 容器id      #强制停止当期的容器
常用的其他命令
后台启动容器
# 命令docker run -d 镜像名
docker run -d centos

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

#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了。
查看日志命令
#显示日志
-tf  #显示日志
--tail number #要显示日志条数

查看容器中进程信息
#命令 docker top  容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker top 0f92d0005998 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3023                3002                0                   

查看镜像源数据
#命令
docker inspect 容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker inspect 0f92d0005998
[
    {
        "Id": "0f92d0005998c3e180afb94ef9fb25b57b3317bf77e3ea73d2092e255127ac01",
        "Created": "2022-06-20T01:38:42.48966518Z",
        "Path": "/bin/bash",
        "Args": [],
进入当前正在运行的容器
# 我们通常容器是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bin/bash


[root@iZbp151pi15pfb733a7a0dZ /]# docker exec -it 0f92d0005998 /bin/bash
[root@0f92d0005998 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@0f92d0005998 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 01:38 pts/0    00:00:00 /bin/bash
root        15     0  0 02:37 pts/1    00:00:00 /bin/bash
root        30    15  0 02:38 pts/1    00:00:00 ps -ef

#方式二
docker attach 容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker attach 0f92d0005998
正在执行当前的代码...

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

从容器内拷贝文件到主机上
docker cp 容器id:容器内路径  目的的主机路径
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it centos /bin/bash
[root@1dae4d793eec /]# docker ps
bash: docker: command not found
[root@1dae4d793eec /]# [root@iZbp151pi15pfb733a7a0dZ ~]# docker ps     ##Ctrl+p+q
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
1dae4d793eec   centos                "/bin/bash"              20 seconds ago   Up 19 seconds                                                                                                                                               tender_mayer
5c25c2801811   rabbitmq:management   "docker-entrypoint.s…"   25 hours ago     Up 25 hours     0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
[root@iZbp151pi15pfb733a7a0dZ ~]# cd /home
#查看当前主机目录下
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
1dae4d793eec   centos                "/bin/bash"              38 seconds ago   Up 37 seconds                                                                                                                                               tender_mayer
5c25c2801811   rabbitmq:management   "docker-entrypoint.s…"   25 hours ago     Up 25 hours     0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
#进入docker容器内部
[root@iZbp151pi15pfb733a7a0dZ home]# docker attach 1dae4d793eec
[root@1dae4d793eec /]# cd /home
[root@1dae4d793eec home]# ls
#在容器内新建一个文件
[root@1dae4d793eec home]# touch test.java
[root@1dae4d793eec home]# exit
exit
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS        PORTS                                                                                                                                       NAMES
5c25c2801811   rabbitmq:management   "docker-entrypoint.s…"   25 hours ago   Up 25 hours   0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
#将1dae4d793eec容器下边的home目录的test.java文件拷贝到服务器home目录下
[root@iZbp151pi15pfb733a7a0dZ home]# docker cp 1dae4d793eec:/home/test.java /home
[root@iZbp151pi15pfb733a7a0dZ home]# ls
test.java  www
#拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现

命令小结

attach    Attach to a running container  #当前shell下attach连接指定运行镜像
build     Build an image from a Dockerfile  #通过Dockerfile定制镜像
commit    Create a new image from a container's changes  #提交当前容器为新的镜像
cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中
create    Create a new container  #创建一个新的容器,同run 但不启动容器
diff    Inspect changes on a container's filesystem  #查看docker容器变化
events    Get real time events from the server#从docker服务获取容器实时事件
exec    Run a command in a running container#在已存在的容器上运行命令
export    Export a container's filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)
history    Show the history of an image  #展示一个镜像形成历史
images    List images  #列出系统当前镜像
import    Import the contents from a tarball to create a filesystem image  #从tar包中的内容创建一个新的文件系统映像(对应export)
info    Display system-wide information  #显示系统相关信息
inspect    Return low-level information on a container or image  #查看容器详细信息
kill    Kill a running container  #kill指定docker容器
load    Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)
login    Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout    Log out from a Docker registry  #从当前Docker registry退出
logs    Fetch the logs of a container  #输出当前容器日志信息
pause    Pause all processes within a container#暂停容器
port    List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口
ps    List containers  #列出容器列表
pull    Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像
push    Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器
rename    Rename a container  #重命名容器
restart    Restart a running container  #重启运行的容器
rm    Remove one or more containers  #移除一个或者多个容器
rmi    Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run    Run a command in a new container  #创建一个新的容器并运行一个命令
save    Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search    Search the Docker Hub for images  #在docker
hub中搜索镜像
start    Start one or more stopped containers#启动容器
stats    Display a live stream of container(s) resource usage statistics  #统计容器使用资源
stop    Stop a running container  #停止容器
tag         Tag an image into a repository  #给源中镜像打标签
top       Display the running processes of a container #查看容器中运行的进程信息
unpause    Unpause all processes within a container  #取消暂停容器
version    Show the Docker version information#查看容器版本号
wait         Block until a container stops, then print its exit code  #截取容器停止时的退出状态值

下载镜像

#1.搜索镜像 docker search nginx  最好去官网地址搜索
#2.下载镜像 docker pull nginx
#3.运行测试

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,容器内部端口
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d --name nginx02 -p 8082:80 nginx
7ed90c7034f2de7bb34fc670d332e5b4c8a586ce6a11a29e039ae3ae33713124
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
7ed90c7034f2   nginx                 "/docker-entrypoint.…"   25 seconds ago   Up 25 seconds   0.0.0.0:8082->80/tcp                                                                                                                        nginx02
5c25c2801811   rabbitmq:management   "docker-entrypoint.s…"   29 hours ago     Up 29 hours     0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
[root@iZbp151pi15pfb733a7a0dZ home]# curl localhost:8082

端口暴露概念图:

image-20220620152219085

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

#官方的使用
docker run -it --rm tomcat:9.0
#我们之前的启动都是后台,停止了容器之后,容器还是可以查到  docker run -it --rm 一般以用来测试,用完就删除
# 下载在启动
docker pull tomcat
#启动运行
docker run -d -p 8082:8080 --name tomcat01 tomcat
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
6a6997f89edf02351e4543f214cb67eb420806c8ec68be7d5d384f2395f124fd

#测试访问没有问题


[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
#进入容器
[root@iZbp151pi15pfb733a7a0dZ home]# docker exec -it tomcat01 /bin/bash
root@6a6997f89edf:/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@6a6997f89edf:/usr/local/tomcat# ls -al
total 172
drwxr-xr-x 1 root root  4096 Dec 22 17:16 .
drwxr-xr-x 1 root root  4096 Dec 22 17:00 ..
-rw-r--r-- 1 root root 18970 Dec  2  2021 BUILDING.txt
-rw-r--r-- 1 root root  6210 Dec  2  2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec  2  2021 LICENSE
-rw-r--r-- 1 root root  2333 Dec  2  2021 NOTICE
-rw-r--r-- 1 root root  3378 Dec  2  2021 README.md
-rw-r--r-- 1 root root  6898 Dec  2  2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec  2  2021 RUNNING.txt
drwxr-xr-x 2 root root  4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root  4096 Jun 20 08:16 conf
drwxr-xr-x 2 root root  4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root  4096 Jun 20 08:16 logs
drwxr-xr-x 2 root root  4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root  4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root  4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root  4096 Dec  2  2021 webapps.dist
drwxrwxrwx 2 root root  4096 Dec  2  2021 work
#发现为题:1.linux命令少了,2.没有webapps。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。
#保证最小的环境


解决办法:
#将webapps.list的所有文件放在webapps目录下
root@6a6997f89edf:/usr/local/tomcat# cd webapps
root@6a6997f89edf:/usr/local/tomcat/webapps# ls
root@6a6997f89edf:/usr/local/tomcat/webapps# cd ..
root@6a6997f89edf:/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@6a6997f89edf:/usr/local/tomcat# cd webapps.dist/
root@6a6997f89edf:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@6a6997f89edf:/usr/local/tomcat/webapps.dist# cd ..
root@6a6997f89edf:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@6a6997f89edf:/usr/local/tomcat# 


思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?

我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了

部署 es+kibana

# 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
#docker stats 查看 cpu的状态


[root@iZbp151pi15pfb733a7a0dZ home]# curl localhost:9200
{
  "name" : "45e5d07a0f70",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "Pjy_3HfVRL--mverC2eetQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}


#服务器很小,启动就会十分卡,最好先关闭一些进程。

解决办法 
#赶紧关闭,增加内存的限制,修改配置文件 -e 环境配置修改

#node 后面加 -e ES_JAVA_OPS="-Xms64m -Xmx512m" 
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPS="-Xms64m -Xmx512m" elasticsearch:7.6.2

使用kibana连接es?思考网络如何才能连接过去?

image-20220620171325819

可视化

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://ip:8088/ 阿里云地址

Docker镜像讲解

镜像是什么

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

所有的应用,直接打包docker镜像,就可以直接跑起来!

如何得到镜像

1.从远程仓库下载

2.朋友拷贝给你

3.自己制作一个镜像dockerFile

Docker镜像加载原理

image-20220620190913011

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

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

虚拟机是分钟级,容器是秒级。

分层理解

特点:Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层!、

image-20220620192504289

如何提交一个自己的镜像

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

实战测试

# 1. 启动一个默认的tomcat
docker run -it -p 8082:8080 tomcat:9.0

# 2. 发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的!
root@541a11be8902:/usr/local/tomcat/webapps# ls

# 3.我自己拷贝进去了基本的文件
root@541a11be8902:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@541a11be8902:/usr/local/tomcat# exit
[root@iZbp151pi15pfb733a7a0dZ ~]# docker ps

# 4. 将我们操作过的容器通过commit提交为一个镜像!我们以后就可以使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像

docker commit -a="super" -m ="add webapps app" 541a11be8902 tomcat02:1.0

如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们以前学习vm时候,快照。

容器数据卷

什么是容器数据卷

docker的理念回顾

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

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

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

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

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

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

使用数据卷

直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录
#测试
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

#启动起来的时候我们可以通过docker inspect 容器id           查看卷信息
docker inspect 556ffcee0777

image-20220620214423957

测试文件的同步

image-20220620214930166

好处:我们以后修改只需要在本地修改即可,容器内会自动同步

实战测试:安装mysql

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

#获取镜像
[root@iZbp151pi15pfb733a7a0dZ home]# docker pull mysql:5.7

#运行容器,需要做数据挂载! #安装启动mysql,需要配置密码的,这是要注意点!
#官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my=secret-pw -d mysql:tag
#启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082: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
23bebc1a1c4f901a10ae5468b99a75c96f56c8e64cf18d4edaf90764bafe3500

#启动成功后,我们在本地使用sqlyog来测试一下
#sqlyog -连接到服务器的8082和容器内的3306映射,这个时候我们就可以连接上了!
#在本地测试创建一个数据库,查看一下我们映射的路径是否ok!

假设我们将容器删除,但是发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。

具名和匿名挂载

匿名挂载
#匿名挂载
-v 容器内路径!

[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有卷的情况
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume ls
DRIVER    VOLUME NAME
local     6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a
#这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径。

具名挂载
#通过 -v 卷名:容器内路径
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
8c2d457d79689c03c0af7fe3c14f4128997b945a0e089cb7acb2006eccd1370a
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume ls
DRIVER    VOLUME NAME
local     6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a
local     70b8a46ae4d936dc8d1c86ef2ec227c14d74bf26efb4eda1afdc8753bfa4169a
local     juming-nginx
#查看卷信息
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-06-26T08:09:21+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",   #卷路径
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
#所有的docker容器内的卷,没有指定目录的情况下都是在 `/var/lib/docker/volumes/xxx/_data`中

[root@iZbp151pi15pfb733a7a0dZ home]# cd /var/lib/docker
[root@iZbp151pi15pfb733a7a0dZ docker]# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
[root@iZbp151pi15pfb733a7a0dZ docker]# cd volumes
[root@iZbp151pi15pfb733a7a0dZ volumes]# ls
6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a  backingFsBlockDev  metadata.db
70b8a46ae4d936dc8d1c86ef2ec227c14d74bf26efb4eda1afdc8753bfa4169a  juming-nginx
[root@iZbp151pi15pfb733a7a0dZ volumes]# cd juming-nginx
[root@iZbp151pi15pfb733a7a0dZ juming-nginx]# ls
_data
[root@iZbp151pi15pfb733a7a0dZ juming-nginx]# cd _data
[root@iZbp151pi15pfb733a7a0dZ _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

如何确定是具名挂载还是匿名挂载,还是指定路径挂载!

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

拓展:

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

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

DockerFile

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

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

#1.创建一个dockerfile文件,名字可以随机  建议 Dockerfile
#2.文件中的内容 指令(大写)  参数
FROM centos
VOLUME ["volume01","volume02"]

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

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

3.启动自己的容器

image-20220626084733003

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

image-20220626090659519

测试一下刚才的文件是否同步出去了。

[root@iZbp151pi15pfb733a7a0dZ ~]# cd /var/lib/docker/volumes/32885e77e94774a0c813df8ca0f6eb2d6f51886c8954537fa04f8a99c948db73/_data
[root@iZbp151pi15pfb733a7a0dZ _data]# ls
container.txt

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时间没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径。

数据卷容器

多个mysql同步数据!

image-20220626210042198

启动三个容器,通过我们刚才自己写的镜像启动。

[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it --name docker01 superbrother/centos:1.0

[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it --name docker02 --volumes-from docker01 superbrother/centos:1.0

共享卷是一种拷贝的概念。

只要通过 - - volume- form 就可以实现数据共享了。

多个mysql实现数据共享

[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082:3306 -v/etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:5.7

#这个时候,可以实现两个容器数据同步

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

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

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

构建步骤:

1.编写一个dockerfile文件

2.docker bulid 构建成为一个镜像

3.docker run 运行镜像

  1. docker push 发布镜像(DockerHub\ 阿里云镜像仓库!)

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以。

DockerFile构建过程

基础知识:

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

2.执行从上到下的顺序执行

3.#表示注释

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

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

docker镜像逐渐成为企业交付的标准,必须要掌握。

步骤:开发,部署,运维。。。缺一不可。

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

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

DockerFile的指令

image-20220627081939057

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

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

实战测试

创建自己的centos

#1.编写dockerfile的文件
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# vim mydockerfile-docker
#查看这个文件内容
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# cat mydockerfile-docker
FROM centos:7   #一定要加版本号,更新之后不加版本号,下载会失败
MAINTAINER superbrother<1542010896@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

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

#2.通过这个文件构建镜像
#命令: docker build -f mydockerfile(-f后面指文件路径) -t mycentos:0.1 .(-t后面指镜像名,一定注意还有一个 .) .
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker build -f mydockerfile-docker -t mycentos:0.1 .
#构建成功信息
Successfully built f7922b622ac7
Successfully tagged mycentos:0.1
#测试运行
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker run -it mycentos:0.1
[root@03bf86fe9483 local]# pwd
/usr/local

对比:之前的原生centos,很多基础命令都没有,如:pwd,ifconfig。我们增加之后都有了。

我们可以列出本地进行的变更历史,拿到一个镜像就可以知道它是怎么做的。

[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker history f7922b622ac7

CMD 和 ENTRYPOINT 的区别:

如何vim编写的镜像,是cmd,则运行的时候,是不可以追加命令的,而entrypoint是可以追加命令的。

实战:tomcat镜像

1.准备镜像文件tomcat压缩包,jdk的压缩包!

利用xftp将压缩包上传到服务器。

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

vim Dockerfile

FROM centos:7
MAINTAINET superbrother

COPY readme.txt /usr/local/readme.txt
ADD jdk-8ull-linux-x64.tar.gz /usr/local
ADD appache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jkd1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATAINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out

3.构建镜像

#docker build -t diytoomcat .

4.启动镜像

docker run -d -p 9090:8080 --name superbrothertomcat -v /home/superbrother/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/superbrother/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat

5.访问测试

6.发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

发布自己的镜像

发布DockerHub上

1.在docker仓库注册自己的账号

2.确定这个账号可以登录 我的账号是:superbroo

3.在我们服务器上提交自己的镜像。

[root@iZbp151pi15pfb733a7a0dZ /]# docker login --help

Usage:  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

3.登录docker账号

[root@iZbp151pi15pfb733a7a0dZ /]# docker login -u superbroo
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

4.登录成功后,就可以提交镜像了

#增加一个tag  解决,push镜像问题。
[root@iZbp151pi15pfb733a7a0dZ /]# docker tag f7922b622ac7 superbroo/mycentos:0.1
[root@iZbp151pi15pfb733a7a0dZ /]# docker images
REPOSITORY            TAG          IMAGE ID       CREATED         SIZE
mycentos              0.1          f7922b622ac7   7 hours ago     601MB
superbroo/mycentos    0.1          f7922b622ac7   7 hours ago     601MB
<none>                <none>       c6f7205d65ac   7 hours ago     231MB
superbrother/centos   1.0          f6879539b44c   31 hours ago    231MB
nginx                 latest       605c77e624dd   5 months ago    141MB
mysql                 5.7          c20987f18b13   6 months ago    448MB
rabbitmq              management   6c3c2a225947   6 months ago    253MB
centos                7            eeb6ee3f44bd   9 months ago    204MB
centos                latest       5d0da3dc9764   9 months ago    231MB
portainer/portainer   latest       580c0e4e98b0   15 months ago   79.1MB
# docker push上去即可,自己发布的镜像,带上版本号
[root@iZbp151pi15pfb733a7a0dZ /]# docker push superbroo/mycentos:0.1
The push refers to repository [docker.io/superbroo/mycentos]
9543277ac0b1: Pushing   34.5MB/171.2MB
96ebc4bc2c88: Pushing  42.36MB/226.2MB
174f56854903: Mounted from library/centos 

发布到阿里云服务上

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

4.创建容器

5.浏览阿里云

image-20220627161812521

Docker网络

实战部署redis集群

springboot微服务打包Docker镜像

1.构建springboot项目

2.打包应用

3.编写dockerfile

4.构建镜像

5.发布运行

https://blog.csdn.net/weixin_40496191/article/details/122714245 部署步骤

posted on 2022-08-09 15:13  super-brother  阅读(99)  评论(0编辑  收藏  举报