学Docker跟着这篇文章做一遍就能精通(docker好学吗)

  本篇文章为你整理了学Docker跟着这篇文章做一遍就能精通(docker好学吗)的详细内容,包含有学好docker能干嘛 docker好学吗 docker入门到精通 docker 入门教程 学Docker跟着这篇文章做一遍就能精通,希望能帮助你了解 学Docker跟着这篇文章做一遍就能精通。

  一个产品会有两套环境,开发、上线。
 

  经常会出现的问题:我在我的电脑上可以运行! 版本更新导致服务不可用!这样就对开发的考验很大。

  解决办法:开发学运维 或 运维学开发。所以现在的开发除了后台,还要会前端,还要会运维,当然了,这样的话工资也会高一点哦,为了更好的生活努力吧骚年

  但是环境配置很麻烦,每个机器都要部署,费时费力。比如发布一个项目,项目打成jar包,然后需要redis,mysql,jdk。。。等等。但是如果把jar包和这些环境搞成一整套的呢?就是说项目带上环境一起安装打包,那么Docker就是很好的选择。

  传统:开发给运维一个jar,运维来做。
 

  现在:开发打包部署上线,一套流程做完!

  Docker的历史

  2010年Docker 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立,Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。
 

  底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的!

  Docker刚诞生时候,没有引起行业注意,刚开始的小公司活不下去,面临倒闭,于是2013年把开源,越来越多的人发现Docker的优点,于是就火了。2014年4月,Docker发布!

  为啥Docker这么火?因为十分轻巧。最开始我们都是使用虚拟机,这玩意非常占用内存,安装过虚拟机的哥们应该都知道。虚拟机和Docker都是虚拟化技术,并且Docker是容器技术。

  什么是虚拟化

  在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

  在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用

  虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

  Docker能干嘛

  虚拟化技术

  
 

  虚拟化技术缺点:

  资源占用多

  冗余步骤多

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

  
 

  Docker和虚拟机的区别:

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

  容器的应用直接运行在宿主机的内核中,容器自己没有内核,也没有虚拟硬件,所以轻便

  容器间相互间隔,每个容器都有自己的文件系统,互不影响

  Docker安装

  Docker组成

  
 

  镜像(image):
 

  docker镜像就等于是一个模板,可以通过这个模板创建一个或者多个容器(镜像运行起来就是容器),容器提供服务,最终的服务运行在容器里的。

  容器(container):
 

  docker利用容器技术,独立运行一个或者一组应用,可以理解为一个简易的Linux系统。

  仓库(repository):
 

  存放镜像的地方。仓库分公有仓库和私有仓库。
 

  Docker Hub(默认是国外的),所以很慢,我们要配置国内的阿里云容器服务来镜像加速。

  Docker安装

  准备环境

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

  卸载旧的版本

  

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://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  

 

  安装docker
 

  更新yum软件包索引

  

yum makecache fast

 

  

 

  安装docker

  

yum install docker-ce docker-ce-cli containerd.io

 

  

 

  启动docker

  

systemctl start docker

 

  

 

  启动后查看docker信息

  

docker version

 

  

 

  hello-world

  

docker run hello-world

 

  

 

  
 

  执行完命令后,它说没有找到镜像,去pull远程拉取,然后下载成功
 

  8. 查看这个hello-world 镜像

  

docker images

 

  

 

  如果不想玩docker,需要卸载的话,依次执行以下命令

  

yum remove docker-ce docker-ce-cli containerd.io

 

  rm -rf /var/lib/docker

  rm -rf /var/lib/containerd

  

 

  腾讯云镜像加速

  配置这个以后,以后会非常快

  执行以下命令,打开/etc/docker/daemon.json配置:

  

vim /etc/docker/daemon.json

 

  

 

  添加以下内容,并保存。

  

{"registry-mirrors": [ "https://mirror.ccs.tencentyun.com"]

 

  

 

  重启 Docker 即可

  

sudo systemctl restart docker

 

  

 

  HelloWorld流程

  流程分析:
 

  docker怎么工作的

  docker是client-server结构的系统,docker守护进程在主机上运行,通过socket从客户端连接。
 

  docker-server接收docker-client指令,就会执行这个命令
 

  docker为啥比虚拟机快

  
docker有比虚拟机更少的抽象层
 

  
 

  2.docker利用宿主机的内核,VM需要Guest OS,docker启动时候不需要像虚拟机那样加载一个操作系统内核,避免引导性操作。docker利用宿主机的操作系统,省略了复杂的过程。

  Docker常用命令

  

docker version # 显示版本信息

 

  docker info # 显示系统信息

  systemctl start docker # 启动docker

  systemctl stop docker # 停止docker

  systemctl restart docker # 重启docker

  systemctl status docker # 查看docker状态

  systemctl enable docker # 开机启动

  docker 命令 --help 帮助命令

  

 

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

  查看镜像:docker images

  

[root@VM-0-17-centos abiu]# docker images

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  hello-world latest d1165f221234 2 months ago 13.3kB

  [root@VM-0-17-centos abiu]#

  

 

  解释:
 

  REPOSITORY:镜像仓库
 

  TAG:镜像标签
 

  IMAGE ID:镜像id
 

  CREATED:镜像创建时间
 

  SIZE:镜像的大小

  可选项:docker images --help

  

[root@VM-0-17-centos abiu]# docker images --help

 

  Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

  List images

  Options:

   -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 Dont truncate output

   -q, --quiet Only show image IDs

  [root@VM-0-17-centos abiu]#

  

 

  解释:
 

  -a, --all 列出所有镜像
 

  -q, --quiet 只显示镜像id

  搜索镜像:docker search

  

[root@VM-0-17-centos abiu]# docker search mysql

 

  NAME DESCRIPTION STARS OFFICIAL AUTOMATED

  mysql MySQL is a widely used, open-source relation… 10903 [OK]

  mariadb MariaDB Server is a high performing open sou… 4115 [OK]

  mysql/mysql-server Optimized MySQL Server Docker images. Create… 809 [OK]

  

 

  可选项,通过搜索来过滤
 

  --filter=STARS=9000搜索出来的就一定是大于9000的

  

[root@VM-0-17-centos abiu]# docker search mysql --filter=STARS=9000

 

  NAME DESCRIPTION STARS OFFICIAL AUTOMATED

  mysql MySQL is a widely used, open-source relation… 10903 [OK]

  [root@VM-0-17-centos abiu]#

  

 

  拉取下载镜像:docker pull

  使用时候后面带上要下载的镜像,比如:

  

[root@VM-0-17-centos abiu]# docker pull mysql

 

  Using default tag: latest # 如果mysql后面不带上版本号,默认下载就是最新版本

  latest: Pulling from library/mysql

  69692152171a: Pull complete # 分层下载

  1651b0be3df3: Pull complete

  951da7386bc8: Pull complete

  0f86c95aa242: Pull complete

  37ba2d8bd4fe: Pull complete

  6d278bb05e94: Pull complete

  497efbd93a3e: Pull complete

  f7fddf10c2c2: Pull complete

  16415d159dfb: Pull complete

  0e530ffc6b73: Pull complete

  b0a4a1a77178: Pull complete

  cd90f92aa9ef: Pull complete

  Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969 # 签名

  Status: Downloaded newer image for mysql:latest

  docker.io/library/mysql:latest # 真实地址

  [root@VM-0-17-centos abiu]#

  

 

  指定版本下载:

  

[root@VM-0-17-centos abiu]# docker pull mysql:5.7

 

  5.7: Pulling from library/mysql

  69692152171a: Already exists # 因为刚刚下载过mysql了,所以重复的内容不会下载,显示存在了

  1651b0be3df3: Already exists

  951da7386bc8: Already exists

  0f86c95aa242: Already exists

  37ba2d8bd4fe: Already exists

  6d278bb05e94: Already exists

  497efbd93a3e: Already exists

  a023ae82eef5: Pull complete # 正式下载需要下载的东西

  e76c35f20ee7: Pull complete

  e887524d2ef9: Pull complete

  ccb65627e1c3: Pull complete

  Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa

  Status: Downloaded newer image for mysql:5.7

  docker.io/library/mysql:5.7

  [root@VM-0-17-centos abiu]#

  

 

  所以现在有两个mysql的镜像:

  

[abiu@VM-0-17-centos root]$ docker images

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  mysql 5.7 2c9028880e58 10 days ago 447MB

  mysql latest c0cdc95609f1 10 days ago 556MB

  hello-world latest d1165f221234 2 months ago 13.3kB

  [abiu@VM-0-17-centos root]$

  

 

  删除镜像:docker rmi

  docker rmi 后面带上镜像id

  

[abiu@VM-0-17-centos root]$ docker images

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  mysql 5.7 2c9028880e58 10 days ago 447MB

  mysql latest c0cdc95609f1 10 days ago 556MB

  hello-world latest d1165f221234 2 months ago 13.3kB

  [abiu@VM-0-17-centos root]$ docker rmi -f 2c9028880e58

  Untagged: mysql:5.7

  Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa

  Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68

  Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e

  Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee

  Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b

  Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562

  [abiu@VM-0-17-centos root]$ docker images

  REPOSITORY TAG IMAGE ID CREATED SIZE

  mysql latest c0cdc95609f1 10 days ago 556MB

  hello-world latest d1165f221234 2 months ago 13.3kB

  [abiu@VM-0-17-centos root]$

  

 

  删除多个镜像:docker rmi -f 镜像id,镜像id,镜像id。。。

  删除所有镜像:docker rmi -f $(docker images -aq)

  同理,docker run --help 查看启动容器的所有命令提示文档

  创建启动容器常用参数:

  

docker run [可选参数] image名称

 

  #常用参数说明

  --name="tomcat01" # 给要启动的容器起个名字,tomcat01,tomcat02,来区分容器

  -d # 后台方式启动

  -it # 使用交互方式运行,进入容器查看内容

  -p # 指定容器端口,-p 8080:8080

   # 多个写法:-p ip:主机端口:容器端口

   # -p 主机端口:容器端口

   # -p 容器端口

   # 容器端口

  -P # 随机给容器一个端口

  docker container update --restart=always 【容器名字】 # 设置容器开机启动

  

 

  启动容器示例:刚刚玩镜像时候,把所有镜像都删了,所以现在下载一个CentOS镜像启动吧docker pull centos

  

[abiu@VM-0-17-centos root]$ docker images

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  centos latest 300e315adb2f 5 months ago 209MB

  [abiu@VM-0-17-centos root]$ docker run -it centos /bin/bash # 启动容器,-it参数表示并进入容器

  [root@64c6000ba2d9 /]# ls # 可以看到路径明显不一样,所以查看一下,这些都是容器里的centos目录

  bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

  [root@64c6000ba2d9 /]# exit # 退出容器,exit命令

  [abiu@VM-0-17-centos root]$ ls # 很明显路径又回来了

  spark-2.4.3-bin-hadoop2.7.tgz ZooInspector.zip

  [abiu@VM-0-17-centos root]$

  

 

  

docker ps [可选参数]

 

  # 常用参数:

   # 不加可选参数的话,只显示正在运行的容器

  # -a # a就是all的意思,列出正在运行 和 历史记录运行的容器

  # -n=? # 显示最近创建的容器,比如:docker pa -n=1 表示最近创建的一个容器

  # -q # 只显示出容器的编号

  # -f status=exited # 查看停止的容器

  [abiu@VM-0-17-centos root]$ docker ps # 可以看到,之前启动过的centos容器和hello-world容器都显示出来了

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  [abiu@VM-0-17-centos root]$ docker ps -a

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  64c6000ba2d9 centos "/bin/bash" 9 minutes ago Exited (0) 9 minutes ago boring_shannon

  4e997389bd3c d1165f221234 "/hello" 5 hours ago Exited (0) 5 hours ago adoring_boyd

  [abiu@VM-0-17-centos root]$

  

 

  

exit # 容器直接停止并退出容器

 

  Ctrl + P + Q # 3个快捷键按下,容器不停止,然后退出容器

  

 

  

docker rm 容器id # 删除指定容器, 注意:正在运行的容器不能删除!

 

  docker rm -f $(docker ps -aq) # 删除所有容器

  docker ps -a -qxargs docker rm # 也可以通过管道方式删除所有容器

  

 

  启动和停止容器

  

docker start 容器id # 启动容器

 

  docker restart 容器id # 重启容器

  docker stop 容器id # 停止正在运行的容器

  docker kill 容器id # 强制停止运行的容器,直接杀掉

  

 

  其他常用命令

  后台启动容器

  docker run -d images名称
 

  会有一个坑,-d 后台运行容器时候,发现立刻停止了,因为它是后台运行的,不是前台运行的(比如-it),所以容器启动后发现没有提供的服务,就立马停止了

  查看日志

  

docker logs -tf 5ce451541782 # 显示所有日志信息

 

  docker logs -tf --tail 10 5ce451541782 # 显示10条日志信息

  # 参数说明:

  # # -tf # 显示日志

  # # --taill number # 显示日志条数

  

 

  查看容器进程信息

  命令:docker top 容器id

  

[abiu@VM-0-17-centos root]$ docker top 82e74af26382

 

  UID PID PPID C STIME TTY TIME CMD

  root 4733 4714 0 22:40 pts/0 00:00:00 /bin/bash

  [abiu@VM-0-17-centos root]$

  

 

  查看容器元数据

  命令:docker inspect 容器id

  

[abiu@VM-0-17-centos root]$ docker inspect 82e74af26382

 

   "Id": "82e74af263823a6edb9d12ad5bc2fbd5bd5afaa02c863f947d023c3394417df8",

   "Created": "2021-05-22T14:40:49.788085672Z",

   "Path": "/bin/bash",

   "Args": [],

   "State": {

   "Status": "running",

   "Running": true,

   "Paused": false,

   "Restarting": false,

   # 信息量太大......

  

 

  进入正在运行的容器

  我们通常都是后台方式运行容器,如果需要修改配置,是要进入容器里面的

  第一种方法
 

  命令:docker exec -it 容器id /bin/bash

  

[abiu@VM-0-17-centos root]$ docker exec -it 82e74af26382 /bin/bash

 

  [root@82e74af26382 /]# ls

  bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

  [root@82e74af26382 /]# ps -ef

  UID PID PPID C STIME TTY TIME CMD

  root 1 0 0 14:40 pts/0 00:00:00 /bin/bash

  root 19 0 0 14:54 pts/1 00:00:00 /bin/bash

  root 35 19 0 14:55 pts/1 00:00:00 ps -ef

  [root@82e74af26382 /]#

  

 

  第二种方法
 

  命令:docker attach 容器id
 

  这种方式是直接进入到容器里面,容器正在执行中!

  

[abiu@VM-0-17-centos root]$ docker attach 82e74af26382

 

  

 

  容器内文件拷贝到主机上

  命令:docker cp 容器id:容器内路径 目的主机路径
 

  先用命令进入到容器内部:docker attach 容器id
 

  然后执行命令拷贝到主机上就行了,退出容器,在主机上查看

  拷贝是一个手动过程,可以使用-v挂载卷的技术,实现文件同步

  docker的命令是十分多的,上面的都是常用的基本命令,如果只会上面这些命令,连docker的入门都不算。

  简单测试使用

  安装Nginx

  搜索镜像 docker search nginx 建议去网站搜索 https://registry.hub.docker.com/search?q=nginx type=image

  拉取镜像 docker pull nginx

  启动容器 docker run -d --name nginx01 -p 3344:80 nginx
 

  启动完以后,我们本机查看是否启动成功

  

[abiu@VM-0-17-centos ~]$ docker images # 先查看镜像

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  centos latest 300e315adb2f 5 months ago 209MB

  [abiu@VM-0-17-centos ~]$ docker pull nginx # 拉取镜像

  Using default tag: latest

  latest: Pulling from library/nginx

  69692152171a: Pull complete

  49f7d34d62c1: Pull complete

  5f97dc5d71ab: Pull complete

  cfcd0711b93a: Pull complete

  be6172d7651b: Pull complete

  de9813870342: Pull complete

  Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2

  Status: Downloaded newer image for nginx:latest

  docker.io/library/nginx:latest

  [abiu@VM-0-17-centos ~]$ docker images # 再次查看,确定nginx镜像拉取成功

  REPOSITORY TAG IMAGE ID CREATED SIZE

  nginx latest f0b8a9a54136 10 days ago 133MB

  centos latest 300e315adb2f 5 months ago 209MB

  [abiu@VM-0-17-centos ~]$ docker run -d --name nginx01 -p 3344:80 nginx # 启动容器

  b51505e55b49726cfdc80ccc5f3dd20530657a9d8811304689b5fe823205bdcd

  [abiu@VM-0-17-centos ~]$ docker ps # 查看容器,启动成功了

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  b51505e55b49 nginx "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:3344- 80/tcp, :::3344- 80/tcp nginx01

  [abiu@VM-0-17-centos ~]$ curl localhost:3344 # 本机访问nginx

   !DOCTYPE html

   html

   head

   title Welcome to nginx! /title

   style

   body {

   width: 35em;

   margin: 0 auto;

   font-family: Tahoma, Verdana, Arial, sans-serif;

   /style

   /head

   body

   h1 Welcome to nginx! /h1

   p If you see this page, the nginx web server is successfully installed and

  working. Further configuration is required. /p

   p For online documentation and support please refer to

   a href="http://nginx.org/" nginx.org /a . br/

  Commercial support is available at

   a href="http://nginx.com/" nginx.com /a . /p

   p em Thank you for using nginx. /em /p

   /body

   /html

  [abiu@VM-0-17-centos ~]$

  

 

  curl 命令是访问本地容器

  端口暴露的概念

  然后浏览器访问我的3344端口测试一下
 

  118.195.176.3 是我的服务器ip,可以看到测试成功
 

  进入容器

  

[abiu@VM-0-17-centos ~]$ docker ps

 

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  b51505e55b49 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:3344- 80/tcp, :::3344- 80/tcp nginx01

  [abiu@VM-0-17-centos ~]$ docker exec -it nginx01 /bin/bash # 进入容器

  root@b51505e55b49:/# whereis nginx # 看是否有nginx

  nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

  root@b51505e55b49:/# cd /etc/nginx/ # 切换指定目录

  root@b51505e55b49:/etc/nginx# ls

  conf.d koi-utf mime.types nginx.conf uwsgi_params

  fastcgi_params koi-win modules scgi_params win-utf

  root@b51505e55b49:/etc/nginx#

  

 

  测试停止容器

  

[abiu@VM-0-17-centos ~]$ docker ps

 

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  b51505e55b49 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:3344- 80/tcp, :::3344- 80/tcp nginx01

  [abiu@VM-0-17-centos ~]$ docker stop b51505e55b49

  b51505e55b49

  [abiu@VM-0-17-centos ~]$

  

 

  停止以后,肯定是无法访问了
 

  安装Tomcat

  官方的使用docker run -it --rm tomcat:9.0
 

  说明:之前启动都是后台,停止容器以后,容器还在,--rm 加上以后,一般用来测试时候用的,容器用完就会被删除。刚开始学习阶段不建议这样,测试的时候可以试试。

  那就按照正常程序来吧

  下载镜像docker pull tomcat

  启动tomcat docker run -d -p 3355:8080 --name tomcat01 tomcat

  

[abiu@VM-0-17-centos ~]$ docker pull tomcat

 

  Using default tag: latest

  latest: Pulling from library/tomcat

  Digest: sha256:10842dab06b5e52233ad977d4689522d4fbaa9c21e6df387d7a530e02316fb45

  Status: Downloaded newer image for tomcat:latest

  docker.io/library/tomcat:latest

  [abiu@VM-0-17-centos ~]$ docker images

  REPOSITORY TAG IMAGE ID CREATED SIZE

  tomcat 9.0 c43a65faae57 9 days ago 667MB

  tomcat latest c43a65faae57 9 days ago 667MB

  nginx latest f0b8a9a54136 10 days ago 133MB

  centos latest 300e315adb2f 5 months ago 209MB

  [abiu@VM-0-17-centos ~]$ docker run -d -p 3355:8080 --name tomcat01 tomcat

  b3e61706439c0b7d10a461ed75b10eab36817451d141ad0e5493cc9ef74533c4

  [abiu@VM-0-17-centos ~]$

  

 

  启动成功后,我们浏览器访问一下映射的3355端口
 

  
 

  发现抱错404,其他证明已经访问成功了,但为啥报错404,自己可以验证一下

  

[abiu@VM-0-17-centos ~]$ docker exec -it tomcat01 /bin/bash # 进入到容器内部

 

  root@b3e61706439c:/usr/local/tomcat# ls -al # 查看一下,找到webapps目录

  total 172

  drwxr-xr-x 1 root root 4096 May 13 18:38 .

  drwxr-xr-x 1 root root 4096 May 13 05:25 ..

  -rw-r--r-- 1 root root 18949 May 8 17:35 BUILDING.txt

  -rw-r--r-- 1 root root 5644 May 8 17:35 CONTRIBUTING.md

  -rw-r--r-- 1 root root 57092 May 8 17:35 LICENSE

  -rw-r--r-- 1 root root 2333 May 8 17:35 NOTICE

  -rw-r--r-- 1 root root 3372 May 8 17:35 README.md

  -rw-r--r-- 1 root root 6898 May 8 17:35 RELEASE-NOTES

  -rw-r--r-- 1 root root 16507 May 8 17:35 RUNNING.txt

  drwxr-xr-x 2 root root 4096 May 13 18:39 bin

  drwxr-xr-x 1 root root 4096 May 23 07:09 conf

  drwxr-xr-x 2 root root 4096 May 13 18:38 lib

  drwxrwxrwx 1 root root 4096 May 23 07:09 logs

  drwxr-xr-x 2 root root 4096 May 13 18:38 native-jni-lib

  drwxrwxrwx 2 root root 4096 May 13 18:38 temp

  drwxr-xr-x 2 root root 4096 May 13 18:38 webapps

  drwxr-xr-x 7 root root 4096 May 8 17:35 webapps.dist

  drwxrwxrwx 2 root root 4096 May 8 17:35 work

  root@b3e61706439c:/usr/local/tomcat# cd webapps # 进入到webapps目录

  root@b3e61706439c:/usr/local/tomcat/webapps# ls # 查看发现webapps目录里面啥也没有

  root@b3e61706439c:/usr/local/tomcat/webapps#

  

 

  这下就知道为啥了,因为镜像下载时候是最小资源,所以有一些是被阉割了。因为webapps目录时空的,所以访问不到资源

  可以发现有一个webapps.dist

  

root@b3e61706439c:/usr/local/tomcat/webapps# cd ..

 

  root@b3e61706439c:/usr/local/tomcat# ls # 可以看到webapps.dist 目录

  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@b3e61706439c:/usr/local/tomcat# cd webapps.dist/ # 进入这个目录

  root@b3e61706439c:/usr/local/tomcat/webapps.dist# ls # 发现有东西的

  ROOT docs examples host-manager manager

  root@b3e61706439c:/usr/local/tomcat/webapps.dist# cd ..

  root@b3e61706439c:/usr/local/tomcat# cp -r webapps.dist/* webapps # 把webapps.dist目录的资源拷贝到webapps

  root@b3e61706439c:/usr/local/tomcat# cd webapps # 切换到webapps

  root@b3e61706439c:/usr/local/tomcat/webapps# ls # 看到拷贝成功

  ROOT docs examples host-manager manager

  root@b3e61706439c:/usr/local/tomcat/webapps#

  

 

  现在我们可以再次访问tomcat容器试试

  安装ES + Kibana

  es 暴露的端口很多,十分耗内存,es 的数据一般需要放置到安全目录(挂载)
 

  启动命令:docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discoverey.type=single-node" elasticsearch:7.6.2
 

  启动以后,非常耗内存,非常的卡!因为我的服务器是1核2g的

  为了想玩es,还是想试试。。。
 

  等了好长时间,终于好了,建议你们安装es时候,把其他容器全都停了

  

[abiu@VM-0-17-centos ~]$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discoverey.type=single-node" elasticsearch:7.6.2

 

  Unable to find image elasticsearch:7.6.2 locally

  7.6.2: Pulling from library/elasticsearch

  ab5ef0e58194: Pull complete # 开始下载镜像

  c4d1ca5c8a25: Pull complete

  941a3cc8e7b8: Pull complete

  43ec483d9618: Pull complete

  c486fd200684: Pull complete

  1b960df074b2: Pull complete

  1719d48d6823: Pull complete

  Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711fa

  Status: Downloaded newer image for elasticsearch:7.6.2

  28da00bd7864ffc8e22bd38d9429b5b7962a4e239755bea7d254f9f857f3635f # 启动成功

  [abiu@VM-0-17-centos ~]$ docker ps

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  28da00bd7864 elasticsearch:7.6.2 "/usr/local/bin/dock…" 14 seconds ago Up 13 seconds 0.0.0.0:9200- 9200/tcp, :::9200- 9200/tcp, 0.0.0.0:9300- 9300/tcp, :::9300- 9300/tcp elasticsearch

  [abiu@VM-0-17-centos ~]$

  

 

  可以通过命令docker stats查看一下当前docker状态
 

  通过修改配置让es变得小一些-e命令加上

  

[abiu@VM-0-17-centos ~]$ docker run -d --name elasticsearch03 -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

 

  9a711d194ec891dc1674d5dace82e7d3de9aa56e8bbe420dd294f0ec53fb580b

  [abiu@VM-0-17-centos ~]$ docker ps

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  9a711d194ec8 elasticsearch:7.6.2 "/usr/local/bin/dock…" 3 seconds ago Up 2 seconds 0.0.0.0:9200- 9200/tcp, :::9200- 9200/tcp, 0.0.0.0:9300- 9300/tcp, :::9300- 9300/tcp elasticsearch03

  [abiu@VM-0-17-centos ~]$

  

 

  Portainer 可视化面板

  什么是portainer?

  Docker图形化界面管理工具。提供一个后台面板供我们操作。
 

  执行命令:

  

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

 

  

 

  示例:

  

[abiu@VM-0-17-centos ~]$ docker run -d -p 8088:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

 

  Unable to find image portainer/portainer:latest locally

  latest: Pulling from portainer/portainer

  94cfa856b2b1: Pull complete

  49d59ee0881a: Pull complete

  a2300fd28637: Pull complete

  Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f

  Status: Downloaded newer image for portainer/portainer:latest

  e16f81d106c4802dfe66d541e071c33fbde4cf8183623d1594c53d792dadf8d0

  [abiu@VM-0-17-centos ~]$

  

 

  访问测试

  浏览器访问:http://118.195.176.3:8088/ 即可
 

  我们设置密码,然后选择Local 本地的就可以了

  进入面板

  
 

  正常我们很少用这个,了解即可。

  Docker镜像详解

  镜像是什么

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

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

  如何得到一个镜像:

  从远程仓库下载

  朋友拷贝给你

  自己制作镜像 Dockerfile

  镜像加载原理

  UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。

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

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

  
 

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

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

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

  所有镜像都起始于一个基础镜像,当进行修改或增加新的内容时,就会在当前镜像,创建新的镜像层。就好比windows 里的安全补丁。
 

  
 

  下载镜像时候加上可选参数inspect 可以完整的看到分层步骤

  commit镜像

  命令:docker commit -m="提交的描述信息" -a="作者" 镜像名:TAG版本标签

  测试:
 

  和上面安装tomcat一样,启动tomcat容器以后,

  

[abiu@VM-0-17-centos ~]$ docker run -it -p 8080:8080 tomcat

 

  Using CATALINA_BASE: /usr/local/tomcat

  Using CATALINA_HOME: /usr/local/tomcat

  Using CATALINA_TMPDIR: /usr/local/tomcat/temp

  Using JRE_HOME: /usr/local/openjdk-11

  Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

  Using CATALINA_OPTS:

  NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

  23-May-2021 15:01:12.566 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.46

  // ......

  

 

  为了方便学习,再重新打开一个命令窗口,进入到容器里,
 

  查看webapps目录是空的
 

  把webapps.dist 目录里的拷贝到webapps 目录下
 

  再次查看webapps目录
 

  然后退出容器
 

  提交这个修改过的镜像容器
 

  查看镜像

  

root@2c41fe33cedf:/usr/local/tomcat# cp -r webapps.dist/* webapps # 把webapps.dist 目录里的拷贝到webapps 目录下

 

  root@2c41fe33cedf:/usr/local/tomcat# cd webapps

  root@2c41fe33cedf:/usr/local/tomcat/webapps# ls 再次查看webapps目录

  ROOT docs examples host-manager manager

  root@2c41fe33cedf:/usr/local/tomcat/webapps# cd ..

  root@2c41fe33cedf:/usr/local/tomcat# exit # 然后退出容器

  [abiu@VM-0-17-centos ~]$ docker commit -a="abiu" -m="add webapps app" b3e61706439c tomcat02:1.0 # 提交这个修改过的镜像容器

  sha256:beb6fd53ed52c8e767e88052abe3df7214ca3998c08850ecd8c1477b5bbf0add

  [abiu@VM-0-17-centos ~]$ docker images # 查看镜像

  REPOSITORY TAG IMAGE ID CREATED SIZE

  tomcat02 1.0 beb6fd53ed52 24 seconds ago 672MB

  tomcat 9.0 c43a65faae57 9 days ago 667MB

  tomcat latest c43a65faae57 9 days ago 667MB

  nginx latest f0b8a9a54136 11 days ago 133MB

  portainer/portainer latest 580c0e4e98b0 2 months ago 79.1MB

  centos latest 300e315adb2f 5 months ago 209MB

  elasticsearch 7.6.2 f29a1ee41030 14 months ago 791MB

  [abiu@VM-0-17-centos ~]$

  

 

  查看镜像发现tomcat02 比 tomcat 稍微大了一点,因为我往里面加了一些内容嘛,这个tomcat02 就是刚刚提交的镜像。
 

  到此为止,只能算了解了一点docker,根本达不到精通,屁都不是,还要坚持继续学其他的。
 

  《三体》中的一句话:弱小和无知不是生存的障碍,傲慢才是。

  容器数据卷

  什么是容器数据卷

  docker的理念:把应用和环境打包成一个镜像。
 

  那数据呢?如果数据都在容器中,容器删除,数据就会丢失。现在问题来了:数据怎么持久化

  比如有一个mysql容器被删了,那就是删库跑路。现在最大的需求是:mysql数据可以存在本地

  所以容器之间要有一个数据共享技术,那就是容器数据卷,docker中产生的数据,可以同步到本地。

  说白了,就是容器挂载。
 

  
 

  总结:卷技术就是容器持久化和同步操作。容器间也可以数据共享了。

  使用数据卷

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

  docker run -it -v 主机目录:容器内目录

  测试:
 

  执行命令

  

[abiu@VM-0-17-centos ~]$ docker run -it -v /home/ceshicentos:/home centos /bin/bash

 

  [root@3504b975b51b /]#

  

 

  再打开一个窗口,查看本地的/home目录

  

[abiu@VM-0-17-centos ~]$ cd /

 

  [abiu@VM-0-17-centos /]$ cd home/

  [abiu@VM-0-17-centos home]$ ls

  abiu ceshicentos

  [abiu@VM-0-17-centos home]$ docker ps

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  3504b975b51b centos "/bin/bash" About a minute ago Up About a minute bold_euclid

  [abiu@VM-0-17-centos home]$ docker inspect 3504b975b51b

   "Id": "3504b975b51bf26299226c8d1acd5d11a88f605d4a0a88f663447dac1181dfd7",

   "Created": "2021-05-24T11:20:39.062030099Z",

  

 

  然后用inspect查看容器信息
 

  
 

  对比刚执行的命令,这就是挂载信息

  现在测试:
 

  在容器内部的窗口输入命令,新加一个文件
 

  然后在新开窗口切换到目录查看
 

  发现了本地目标目录也有一个test.java文件

  测试数据同步

  先把容器给停了
 

  在主机连接窗口修改test.java文件
 

  然后再到容器窗口把容器启动起来
 

  发现test.java文件数据发生改变
 

  说明它是双向的一个过程,不管在哪边操。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: