Docker使用教程笔记

Posted 小吴吃肉啦~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker使用教程笔记相关的知识,希望对你有一定的参考价值。

Docker

Docker出现的原因

环境配置十分的麻烦,每一个机器都要部署环境(eg:集群Redis Es Hadoop) 是非常的麻烦

为了解决上述的麻烦, 在项目jar包中 将环境也配置在jar包中,进行打包–>简称:镜像,我们将镜像放在 Docker仓库中 (好比是一个商店),我们运行项目直接在商店下载—直接运行即可!

Docker的思想来源于集装箱

就是打包装箱,每个箱子都是互相隔离的

Docker和虚拟机的对比

虚拟机的缺点:

  • 资源占用十分多

  • 沉余步骤多

  • 启动慢

    如下是虚拟就的图,每一个app启动都需要调用Lib ,启动慢

容器化技术

容器化技术不是你的一个完整的操纵系统

每一个app + lib 就是一个容器,而且每个箱子都是隔离

每一个容器直接操纵在系统上充分的利用系统资源

Docker和 虚拟机的不同

  • 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在 宿主机的内容 容器没有自己的内核,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互补影响

Docker的基本组成

**镜像(image):**docker镜像 就好比有一个模板,可以通过这模板来创建容器服务,比如说我们有个 tomcat镜像 -->(将他运行起来) run----> 就变成了 tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行or 项目运行就是在容器中的)

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

他有 启动 停止 删除 等基本命令

可以把他看成一个简单的linux的系统

仓库(repository): 仓库就是存放镜像的地方 仓库分为 公有仓库和私有仓库

​ Docker hub (默认是国外的)

Docker安装

https://blog.csdn.net/u014644574/article/details/112494541?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165767551216782248536919%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165767551216782248536919&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-112494541-null-null.142v32experiment_2_v1,185v2control&utm_term=centos7&spm=1018.2226.3001.4187

安装命令

#1.安装所需的软件包
yum install -y yum-utils

#2.设置镜像的仓库。   -----阿里云的镜像库
yum-config-manager \\
    --add-repo \\
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  
#3.更新yum软件包索引
yum makecache fast
 
#4.安装docker的引擎   docker-ce---> 社区版  ee是企业版
yum install docker-ce docker-ce-cli containerd.io

#5. 启动docker
systemctl start docker

#6. 查看docker版本号
systemctl start docker

测试


)]

查看镜像

docker images

阿里云镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'

  "registry-mirrors": ["https://zto7rr04.mirror.aliyuncs.com"]

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker run 的运行流程图

底层原理

Docker是怎么工作的?

Docker 是一个Client-Server 结构的系统,Docker的守护进程(Docker daemon)运行在主机上,通过Socket从客户端访问
Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令

Docker 为什么比虚拟机快?

Docker 有着比虚拟机更少的抽象层
Docker 利用的是宿主机的内核,VM 需要的是Guest OS(需要再搭建一个系统环境)

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

Docker常用命令

docker version
docker info  # docker系统信息

https://docs.docker.com/engine/reference/run/  #docker官网 地址 

镜像命令

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

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

docker search 查找镜像

NAME                              DESCRIPTION                                     STARS               OFFICIAL         AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9822                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3586                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   719                                     [OK]
 
# 可选项
--filter=STARS=3000     # 搜素出来的镜像就是STARS大于3000的
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker search mysql --filter=STARS=3000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9822                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3586                [OK]     

docker pull 下拉镜像

# 下载镜像,docker pull 镜像名[:tag]
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql
Using default tag: latest           # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
bf5952930446: Pull complete         # 分层下载,dockerimages的核心,联合文件系统
8254623a9871: Pull complete 
938e3e06dac4: Pull complete 
ea28ebf28884: Pull complete 
f3cef38785c2: Pull complete 
894f9792565a: Pull complete 
1d8a57523420: Pull complete 
6c676912929f: Pull complete 
ff39fdb566b4: Pull complete 
fff872988aba: Pull complete 
4d34e365ae68: Pull complete 
7886ee20621e: Pull complete 
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed     # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest      # 真实地址
 
# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
 
# 指定版本下载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists 
8254623a9871: Already exists 
938e3e06dac4: Already exists 
ea28ebf28884: Already exists 
f3cef38785c2: Already exists 
894f9792565a: Already exists 
1d8a57523420: Already exists 
5f09bf1d31c1: Pull complete 
1b6ff254abe7: Pull complete 
74310a0bf42d: Pull complete 
d398726627fd: Pull complete 
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
 
# 查看本地镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 718a6da099d8        6 days ago          448MB
mysql               latest              0d64f46acfd1        6 days ago          544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

docker rmi 删除镜像

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID                        # 删除指定镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3   # 删除多个镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]#  docker rmi -f $(docker images -aq)           # 删除所有镜像

容器命令

**新建容器并启动 **

推出的话直接 exit

docker run [可选参数] image
 
# 参数说明
--name=“Name”   容器名字    tomcat01    tomcat02    用来区分容器
-d      后台方式运行
-it     使用交互方式运行,进入容器查看内容
-p      指定容器的端口     -p 8080:8080
    -p  ip:主机端口:容器端口
    -p  主机端口:容器端口(常用)
    -p  容器端口
    容器端口
-p      随机指定端口
 
 
# 测试,启动并进入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls   # 查看容器内的centos,基础版本,很多命令是不完善的
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
 
# 从容器中退回主机
[root@77969f5dcbf9 /]# exit
exit
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
bin   dev  fanfan  lib    lost+found  mnt  proc  run   srv  tmp  var
boot  etc  home    lib64  media       opt  root  sbin  sys  usr

列出所有的运行的容器

# docker ps 命令列出当前正在运行的容器
-a      # 列出正在运行的容器包括历史容器
-n=?    # 显示最近创建的容器
-q      # 只显示当前容器的编号
 
[root@centos01 ~]#  docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
d698397d8c02   centos    "/bin/bash"   25 seconds ago       Up 24 seconds                 angry_tesla
0c36bf3210c0   centos    "/bin/bash"   About a minute ago   Up About a minute             zealous_bohr
11660c546d93   centos    "/bin/bash"   17 hours ago         Up 17 hours                   relaxed_mirzakhani
fa106b942c56   centos    "/bin/bash"   18 hours ago         Up 18 hours                   pensive_nobel

[root@centos01 ~]# docker ps -qa
d698397d8c02
0c36bf3210c0
01a6c96eafb1
11660c546d93
fa106b942c56
f5a7173e0c09
93ac52e6f2ca
528f3dc27cc0
d1fcb7d7cdc7
966d18cf3158

退出容器

exit            # 直接退出容器并关闭
Ctrl + P + Q    # 容器不关闭退出

删除容器

docker rm -f 容器id                       # 删除指定容器
docker rm -f $(docker ps -aq)       # 删除所有容器
docker ps -a -q|xargs docker rm -f  # 删除所有的容器

启动和停止容器的操作

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

常用其他命令

查看日志

docker logs -tf --tail number 容器id

# 显示日志
-tf                 # 显示日志
--tail number       # 显示日志条数
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff
2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit      # 日志输出
 
# 自己编写一段shell脚本
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos /bin/sh -c "while true;do echo xiaofan;sleep 1;done"
a0d580a21251da97bc050763cf2d5692a455c228fa2a711c3609872008e654c2
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a0d580a21251        centos              "/bin/sh -c 'while t…"   3 seconds ago       Up 1 second                             lucid_black
 

查看容器中进程信息ps

# 命令 docker top 容器id
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker top df358bc06b17
UID                 PID                 PPID                C                   STIME               TTY     
root                28498               28482               0                   19:38               ?      

查看镜像的元数据 inspect

# 命令
docker inspect 容器id

进入当前正在运行的容器

# 我们通常容器使用后台方式运行的, 需要进入容器,修改一些配置
 
# 命令
docker exec -it 容器id /bin/bash
 
# 测试
[root@centos01 ~]# docker exec -it d698397d8c02 /bin/bash
[root@d698397d8c02 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 01:20 pts/0    00:00:00 /bin/bash
root         15      0  0 01:27 pts/1    00:00:00 /bin/bash
root         29     15  0 01:27 pts/1    00:00:00 ps -ef
[root@d698397d8c02 /]# 

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

从容器中拷贝文件到主机

docker cp 容器id:容器内路径    目的地主机路径
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home

问题

  • 在 docker run -d centos 发现docker ps, 发现centos停止了

    • 原因是:docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止centos , 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
    • 解决方式 需要通过 -it 的启动
  • 在tomcat中 下载好镜像 是缩减版的 所以它的 webapps 里面是空的 在外部访问 会直接 404

    • 解决方式 : 通过 ls 命令 查询到 webapps.dist , 把 webapps.dist 文件夹里的内容复制到 webapp中 就可以启动
    • ​ *cp -r webapps.dist/ webapps ** (-r 的意思是:递归处理,将指定目录下的文件与子目录一并处理。)
  • 想要删除之前 --name 的名字 需要通过 需要通过 docker ps -a 的命令 才能查询到 --name 的字段, 查看到id后,docker rm -f id名

    • 在下面kibana 中由于run 好几个 而且每个 --name 都不一样 ,在 docker ps 没有查询到, 需要通过 docker ps -a 的命令 才能查询到 --name 的字段
  • es + kibana 启动时,先启动es 在启动kibana 在es启动时 --name 一定要牢记,后面kibana --link (链接是 需要es的 --name )

    • 解决方式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoWb8tUO-1659508930665)

Docker部署

Docker部署nginx

第一步先搜索 nignx (seacher)

[root@centos01 ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        17090     [OK]       
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   169                  
bitnami/nginx                                     Bitnami nginx Docker Image                      136                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   52                   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   19                   [OK]
rancher/nginx-ingress-controller                                                                  10                   
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4                    
bitnami/nginx-ldap-auth-daemon                                                                    3                    
rancher/nginx                                                                                     2                    
circleci/nginx                                    This image is for internal use                  2                    
bitnami/nginx-exporter                                                                            2                    
rancher/nginx-ingress-controller-defaultbackend                                                   2                    
vmware/nginx                                                                                      2                    
rapidfort/nginx                                   RapidFort optimized, hardened image for NGINX   2                    
vmware/nginx-photon                                                                               1                    
bitnami/nginx-intel                                                                               1                    
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   1                    
wallarm/nginx-ingress-controller                  Kubernetes Ingress Controller with Wallarm e…   1                    
rancher/nginx-ssl                                                                                 0                    
rancher/nginx-conf                                                                                0                    
continuumio/nginx-ingress-ws                                                                      0                    
rancher/nginx-ingress-controller-amd64                                                            0                    
ibmcom/nginx-ingress-controller-ppc64le           Docker Image for IBM Cloud Private-CE (Commu…   0                    
ibmcom/nginx-ppc64le                              Docker image for nginx-ppc64le                  0                    
rancher/nginx-proxy                                                                               0                    
[root@centos01 ~]# 

第二步:下载镜像 pull

[root@centos01 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

第三步:查询镜像 是否下载下来

docker images

第四步: 启动 (我这边想挂在后台 所以用 -d, 并命名 --name,在给端口好 -p 3344:80)

-p 宿主机端口(外部访问):容器内部端口

# docker run -d --name nginx01 -p 3344:80 nginx
d2f3d9b925fc076365a564b4bf2b1499ff318b9f8c18605f709dbec920a4853d
[root@centos01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
d2f3d9b925fc   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 6 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
d698397d8c02   centos    "/bin/bash"              2 hours ago     Up 2 hours                                             angry_tesla
0c36bf3210c0   centos    "/bin/bash"              2 hours ago     Up 2 hours                                             zealous_bohr
11660c546d93   centos    "/bin/bash"              19 hours ago    Up 19 hours                                            relaxed_mirzakhani
fa106b942c56   centos    "/bin/bash"              20 hours ago    Up 20 hours                                            pensive_nobel

第五步:测试 先在本机测试 (发送请求 curl (后面跟端口号 是上面3344) )

[root@centos01 ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html  color-scheme: light dark; 
body  width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; 
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>

第六步: 进入容器

[root@centos01 ~]# docker exec -it nginx01 /bin/bash
root@d2f3d9b925fc:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

root@d2f3d9b925fc:/# cd /etc/nginx

root@d2f3d9b925fc:/etc/nginx# ls           
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

root@d2f3d9b925fc:/etc/nginx# 

Docker部署Tomcat

第一步: 查询 是否有tomcat

第二步: 进行下载tomcat 镜像 docker pull tomcat 或者 直接 运行 (也可以下载) docker run -it tomcat /bin/bash

第三步: 启动tomcat 端口的设置 和 并给命名 **docker run -d -p 3355:8080 --name tomcat01 ** tomcat

第四步: 测试 测试访问没有问题 但外部访问有问题

第五步: 进入 容器 docker exec -it tomcat01 /bin/bash

​ 查看 ls -al 看目录权限

​ 发现问题 :1.linux命令少了,2、没有webapps 阿里云镜像的原因,默认是最小的镜像所有不必要的镜像都删除掉了 ,会导致我们在浏览器访问 出现404

第六步: 解决上述问题

​ 将webapps.dist 复制到 webapps cp -r webapps.dist/ webapps*

​ -r  递归处理,将指定目录下的文件与子目录一并处理。

Docker部署es + kibana

es:暴露端口特比多

es 十分耗内存

es 的数据一般需要放置到安全目录 ! 挂载

第一步下载 启动 es

docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

由于es非常耗内存 建议!!! 把没用的镜像关闭

**第二步: ** 测试 curl localhost:9200

第三步: 查看内存 由于es 耗内存 docker stats 在通过 -e 修改环境内存

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

Kibana

第一步: 下载镜像 启动

docker run -it --name="kibana02" -p 5602:5601 --link elasticsearch02:elasticsearch kibana:7.6.2

==注意事项: 在这启动kibana 首先启动ela 查看ela --name 是什么 ==,然后再启动 kibana 中 --link 第一个ela的(–name 要和 ela --name 名字要一致),才能启动,否则会报错

Portainer可视化面板安装

他是docker图形化界面

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

镜像

镜像是什么?

镜像是轻量级、独立运行软件包,用来打包软件的运行环境和运行环境开发的软件,它包含一个软件的:代码、库、环境变量和配置文件,直接打包docker镜像,这种打包叫做:其实镜像实际上是由一层一层的文件系统组成,这个文件系统就是**联合文件系统(UnionFS)**就可以直接运行起来

咋们在下载的镜像的时候都是一层

Docker镜像加载原理

UnionFS(联合文件系统)

​ docker的镜像实际上是由**一层一层的文件系统组成,好比盖房子一样 一层一层的变高,**这个层级的文件系统叫UnionFS

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

docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统就是上述的UnionFS。接着,在内部又分为2部分:

bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。

bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。这一层与典型的linux/Unix系统一样,包含bootloader和kernel。当boot加载完成后,整个内核就在内存中了**,此时内存的使用权已由bootfs转交给了内核**,此时系统也会卸载bootfs
这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。

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

特性:

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

这一层就是我们通常函数与董鄂容器曾,容器之下的都叫镜像曾

运行流程图下:

run 之后,所有的操作都在容器层进行,而镜像曾tomcat 是不会改变原始的数据,只会在容器层,增加数据

Commit镜像

提交自己的镜像

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

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

测试:由于tommat 不能直接访问 需要将webapps.dist 中的所有文件进行copy到webapps中 完成后,将新的tomcat进行 commit镜像 成为一个新的tomcat 副本

[root@centos01 ~]# docker commit -a="zhkj" -m="add webapps app" ba44baf4d118 tomcat02:1.0
sha256:d024ea4659b262a38bbbfdae474d2078473eaffadc50eef761372aac71136d94
[root@centos01 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS              PORTS                                       NAMES
ba44baf4d118   tomcat                "catalina.sh run"   14 minutes ago   Up 14 minutes       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   blissful_dubinsky
1c38bd303c3c   centos                "/bin/bash"         2 hours ago      Up 2 hours                                                      happy_haibt
f9e77915bccd   portainer/portainer   "/portainer"        43 hours ago     Up About a minute   0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   gracious_poitras

[root@centos01 ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat02              1.0       d024ea4659b2   2 minutes ago   684MB
nginx                 latest    605c77e624dd   6 months ago    141MB
tomcat                latest    fb5657adc892   6 months ago    680MB

[root@centos01 ~]# 

容器数据卷

什么是容器数据卷

Docker 是应用和环境打包成一个镜像,

如果数据都在容器中,那我们容器删除,就会丢失数据 (mysql ,容器删除 就等于删库跑路)

为了解决上述问题:
容器之间可以有一个数据共享技术,docker容器中生产的数据,同步到本地! —>这既是卷技术,目录的挂载,将我们内容的目录,挂载到linux什上面

特征:持久化和同步操作,容器间也是可以数据共享

使用数据卷

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

docker run -it -v

#查看挂载 位置
docker inspect 容器id

测试

好处: 以后修改文件内容,直接在本地修改,不需要在容器内修该

匿名和具名挂载

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
 
# 查看所有volume的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
 
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
 
# 具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx
 
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  
      "CreatedAt": "2020-08-12T18:15: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/xxxxx/_data

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

##如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro  readonly    # 只读
rw  readwrite   # 可读可写
 
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
 
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

Dockerfile

dockerfile就是用来构建docker镜像的构建文件,通过这个脚本可以生产镜像,镜像是一层一层的,每个命令也是一层一层的

# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
 
FROM centos
 
VOLUME ["volume01", "volume02"]
 
CMD echo "----end----"
CMD /bin/bash
 
# 这里的每一个命令都是镜像的一层!

#注意点 : 这里推出 先按esc  咋输入 :wq 

数据卷容器

可以同步多个容器中的数据

# 
--volumes from 要继承的数据卷


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

DockerFile

Dockerfile是面向开发的,我们以后发布项目,做镜像,就需要写dockerfile文件,同时dockerfile也逐渐成为企业 交付项目的标准

是用来构建docker镜像命名

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

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

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

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建一个镜像
  3. docker run运行镜像
  4. docker push 发布镜像(可以发布在DockerHub、阿里云镜像仓库)

查看官网是如何制作镜像

Docker构建过程

基础知识:

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

DockerFile的指令

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

DockerFile实战(自己构建镜像)

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

创建自己的centos镜像

首先mkdir 位置

在 vi docker

FROM centos
MAINTAINER wushentian<wushentian@unittec.com>

ENV MYPATH /user/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


  1. mkdir 创建 自己想要的位置
  2. vi 自己定义的脚本名字
  3. **在 vi 中编写 脚本 **
  4. cat 自己定义的脚本名称
  5. build
    • -f 路径名 要跟 vi 后面的名称一致
    • -t 是指命名当前镜像叫什么 后面也可以跟版本号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDTzEN3a-1659508930670)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images!在这里插入图片描述
)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6rfnITv-1659508930671)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images!在这里插入图片描述
)]

流程

为什么使用Rancher

它支持集中化认证、权限控制、监控和管理所有Kubernetes集群

同时给开发者提供了一个可视化的工具

他能解决什么问题?

针对多机房、跨区域的容器调度,部署多套集群

行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!






[外链图片转存中...(img-xBp0ugRj-1659508930670)]



### DockerFile实战(自己构建镜像)

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



**创建自己的centos镜像**

以上是关于Docker使用教程笔记的主要内容,如果未能解决你的问题,请参考以下文章

Docker使用教程笔记

docker安装教程(windows和linux[centos8])

[整理]菜鸟教程:docker使用笔记

Docker系列之学习笔记教程汇总

Docker系列之学习笔记教程汇总

Docker系列之学习笔记教程汇总