资讯详情

Docker 容器学习完整笔记

Docker

《三体》 一句话,很有感触: 虚弱和无知不是生存的障碍,傲慢是。

Docker 概述

Docker安装

Docker 命令

  • 镜像命令

  • 容器命令

  • 操作命令

Docker镜像

  • 容器数据卷

  • DockerFile

  • Docker网络原理

  • Idea整合Docker

  • Docker Compose 集群编排

  • Docker Swarm

  • CICD jenkins

Docker 概述

Docker 为什么会出现?

产品开发-上线 两套环境! 应用环境,应用配置!

开发 ---运维 。

环境配置很麻烦,每台机器都要部署环境(集群Redis,ES ,Hadoop)! 费时费力。

发布项目 (jar (Redis Mysql Jdk ES)),项目能不能够带上环境安装打包!

在服务器配置应用环境之前(Redis Mysql Jdk ES Hadoop) 配置超级麻烦,不能跨平台。

windos ,最后发布到Linux

传统: 开发jar ,运维来做

现在:开发包装部署在线,一套流程!

java --apk -- 发布(应用商店) ---张三使用apk ---安装即可!

java----jar(环境) --- 带环境(镜像)的包装项目。----(Docker)

Docker 提出上述问题的解决方案!

docker思想来自集装箱!

JRE -- 多个应用端口冲突) ---原来都是交叉

隔离:Docker 核心思想! 包装箱,每个箱子都是相互隔离的。

水果,生化武器;

把不同的东西放在同一台机器上 镜像隔离!

Docker 通过隔离机制, 服务器可以用到极致!

本质: 所有技术都有问题, 学习前需要解决。

Docker的历史

2010年 几个搞IT在美国成立公司的年轻人 ‘ docCloud

做一些 pass云计算服务! linux 有虚拟机

VM虚拟机:缺点 很笨重!

他们将自己的技术 (容器化技术) 命名 就是 Docker!

Docker 刚出生的时候,并没有引起业界的关注!docCloud,活不下去;

他们突然想到这个开源,内部代码

2013年,Docker 开源!

Docker 越来越多的人发现了docker火了,Docker 每月更新一个版本!

2014年9月,Docker 1.0 发布

Docker 为什么这么火? 十分轻巧!

在容器技术出来之前,我们都使用虚拟机技术!

虚拟机: 在windos 中装一个Vmware ,一台或多台电脑可以通过这个软件虚拟! 笨重!

虚拟机也是虚拟化技术,Docker 容器技术,也是虚拟化技术!

vm , linux centos 原生镜像(一台电脑! 隔离, 需要打开多个虚拟机 几个 G  Docker ,隔离 镜像(核心) 4m   jdk  mysql) 十分轻巧,运行镜像就可以了,小巧 几个M  kb 秒级启动!  

到目前为止,所有的开发人员都必须docker!

聊聊docker

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

官网:Home - Docker

官方文档:Docker Documentation | Docker Documentation

Docker 文档超级详细!

仓库地址:Docker Hub

Docker 能干嘛

比较Docker 不同于虚拟机技术:

  • 传统的虚拟机,虚拟一套硬件,操作一个完整的操作系统,然后安装部署在这个系统上

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

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

DevOps (开发、运维)

应用更快的交付和部署

传统: 安装程序

Docker: 包装镜像发布测试,一键操作

升级扩容更方便

使用了Docker之后,我们就像积木一样部署应用!

(SpringBoot 1.5 Redis 5 tomcat 8 升级)

项目包装成镜像,扩展,服务A 服务B

系统运维更简单

容器化后,我们的开发和测试高度一致

利用更高效的计算资源:

Docker 它是一种内核级虚拟化,可以在物理机器上使用 操作许多容器实例!服务器可以极端使用;

只要学不是 ,向死里学!

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

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

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

这个容器目前可以理解为一个简单的容器linux,这个微型项目放在这个微型项目上。linux里面

仓库是存放在镜像中的地方

仓库分为公仓和私仓!

Docker Hub(默认是国外的)

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

安装Docker

环境准备

1, 需要会linux的基础

2,centos7

3,使用xshell 连接远程服务器

环境查看 # 系统内核 [root@iZuf64mpsl7ffadbli02pwZ /]# uname -r 3.10.0-1160.59.1.el7.x86_64 [root@iZuf64mpsl7ffadbli02pwZ /]# # 系统版本  [root@iZuf64mpsl7ffadbli02pwZ /]# 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"  [root@iZuf64mpsl7ffadbli02pwZ /]#  
安装

帮助文档

#1,卸载旧版本  yum remove docker \           docker-client \           docker-client-latest \           docker-common \           docker-latest \           docker-latest-logrotate \      &nsp;        docker-logrotate \
                  docker-engine
                  
 #2 安装需要的安装包
 yum install -y yum-utils
 #3 设置镜像的仓库
 yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #默认是国外的 非常慢
    
    
    
 yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    
    
  #更新yum 索引
    yum makecache fast
    
  # 4安装Docker 相关的内容 docer-ce 社区版本 ee 去夜班
  yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  
  #5启动docker
  
  systemctl start docker
  
  #6 使用 是否安装成功
  docker version
[root@iZuf64mpsl7ffadbli02pwZ /]#
[root@iZuf64mpsl7ffadbli02pwZ /]#  yum-config-manager \
>     --add-repo \
>     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@iZuf64mpsl7ffadbli02pwZ /]#
​
​
​

 

#7, hello-world
docker run hello-world

没有找到镜像 然后去远程拉取镜像

 

# 8 查看下载的 hello-world 镜像
docker images
[root@iZuf64mpsl7ffadbli02pwZ /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   7 months ago   13.3kB
[root@iZuf64mpsl7ffadbli02pwZ /]#

了解卸载docker

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

 

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

3,配置使用

 

docker底层原理

docker是怎么工作的?

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

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

 

Docker 为什么比VM快?

1,docker 有比虚拟机更少的抽象成

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

 

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

 

学习完所有的命令再回过头来看这段理论就会很清晰!

Docker的常用命令

帮互命令

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

帮助文档地址:Reference documentation | Docker Documentation

镜像命令

docker images

​
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   7 months ago   13.3kB
[root@iZuf64mpsl7ffadbli02pwZ ~]#
#解释
REPOSITORY  镜像仓库源
TAG  镜像的标签
IMAGE ID    镜像的id
CREATED    镜像的创建时间
SIZE    镜像的大小
​
​
# 可选项
Options:
  -a, --all             # 列出所有的镜像
      --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           # 只显示ID
  
  
  [root@iZuf64mpsl7ffadbli02pwZ ~]# docker images -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   7 months ago   13.3kB
[root@iZuf64mpsl7ffadbli02pwZ ~]#
​
​
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker images -q
feb5d9fea6a5
​
​

Docker search 搜索镜像

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12475     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4804      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   923                  [OK]
percona                          Percona Server is a fork of the MySQL relati…   575       [OK]
phpmyadmin                       phpMyAdmin - A web interface for MySQL and M…   514       [OK]
mysql/mysql-cluster              Experimental MySQL Cluster Docker images. Cr…   93
centos/mysql-57-centos7          MySQL 5.7 SQL database server                   93
bitnami/mysql                    Bitnami MySQL Docker Image                      70                   [OK]


# 可选项  ,通过收藏来过滤
 --filter=starts =300  搜索出来的镜像就不小于3000的

​
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12475     [OK]
mariadb   MariaDB Server is a high performing open sou…   4804      [OK]
​
​
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker pull --help
​
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
​
Pull an image or a repository from a registry
​
Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output
​

安装mysql

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker pull mysql
Using default tag: latest  # 如果不写 tag 默认是latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete  # 分层下载, docker iamge 的核心, 联合文件系统
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
​
​
# 指定版本下载
​
[root@iZuf64mpsl7ffadbli02pwZ ~]# 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 删除镜像

# 通过id 删除镜像

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker rmi c20987f18b13  # 删除指定的容器id
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
# 查出所有的id 一个一个的删除 ,删除全部

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker rmi -f $(docker images -aq)  # 删除全部的容器
Untagged: mysql:latest
Untagged: mysql@sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Deleted: sha256:3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b
Deleted: sha256:aa81ca46575069829fe1b3c654d9e8feb43b4373932159fe2cad1ac13524a2f5
Deleted: sha256:0558823b9fbe967ea6d7174999be3cc9250b3423036370dc1a6888168cbd224d
Deleted: sha256:a46013db1d31231a0e1bac7eeda5ad4786dea0b1773927b45f92ea352a6d7ff9
Deleted: sha256:af161a47bb22852e9e3caf39f1dcd590b64bb8fae54315f9c2e7dc35b025e4e3
Deleted: sha256:feff1495e6982a7e91edc59b96ea74fd80e03674d92c7ec8a502b417268822ff
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2
Untagged: hello-world:latest
Untagged: hello-world@sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a97

容器命令

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

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name ="name"   容器名字  tomat01  tomcat02 ,来区分容器
-d   后台运行
-it  使用交互方式运行 ,进入容器查看内容
-p    指定指定容器的端口  -p 8080:8080
   -p ip:主机端口: 容器端口
   -p 主机端口:容器端口(常用)
    -p 容器端口
    

-P

# 测试,启动并进入容器

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -it centos /bin/bash
[root@28458e9d2ecb /]#


[root@28458e9d2ecb /]# ls // 查看内部的内容
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@28458e9d2ecb /]#

#从容器退回主机
exit

docker ps  查看容器
# docker ps 命令  
 -a   列出当前运行的容器+带出历史运行过的容器
 -n =?显示最近的
 -q  只显示容器的编号
 
 
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps -aq  显示当前容器的所有编号
28458e9d2ecb
ebfb86befc39

退出容器

exit #  停止容器并退出
Ctrl +P +Q  # 容器不停止退出
[root@aa2b7aab1a90 /]# [root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
aa2b7aab1a90   centos    "/bin/bash"   2 minutes ago   Up 2 minutes             intelligent_ishizaka
[root@iZuf64mpsl7ffadbli02pwZ ~]# 可以看到centos 没有退出
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -it centos /bin/bash
# 交互方式进入容器

docker rm  容器id  # 删除指定的容器 , 不能删除正在运行的容器
docker rm -f $(docker ps -aq)  # 查出所有容器id 并递归删除
​
​
​
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker rm -f $(docker ps -aq)
aa2b7aab1a90
28458e9d2ecb
​

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

常用其他命令

# 后台启动容器
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -d centos
4dea91048046ceb0bda4adceb6d253c5294ddb9ca8fc2c1b294a1396d2ecc4e9
#问题 docker ps 发现 centos 停止了
# 常见的坑: docker 容器时候后台运行后,就必须要有一个前台进程,docker 发现没有前台的应用了就会自动停止
# nginx , 容器启动后,发现自己没有提供服务,就会停止,就没有程序了

docker logs  -ft --tail 容器,没有日志
# 自己编写一个shll 脚本

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -d centos /bin/sh -c "while true ; do echo kaungshen; sleep 1; done"
82121f2afefb775f5f899eb1d9709063dd8411eee7945f127e5d8998658aea6c
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
82121f2afefb   centos    "/bin/sh -c 'while t…"   15 seconds ago   Up 14 seconds             elegant_varahamihira
e2d282970bc8   centos    "/bin/bash"              5 minutes ago    Up 5 minutes              determined_gates
f0f6fd3efb82   centos    "/bin/bash"              6 minutes ago    Up 6 minutes              hopeful_almeida
[root@iZuf64mpsl7ffadbli02pwZ ~]#

# 测试
显示指定行数的日诶之
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker logs -tf --tail 10 82121f2afefb
2022-04-27T10:37:25.189043705Z kaungshen
2022-04-27T10:37:26.192704567Z kaungshen
2022-04-27T10:37:27.196325343Z kaungshen
2022-04-27T10:37:28.200121486Z kaungshen
2022-04-27T10:37:29.203882449Z kaungshen

查看容器中的进程信息

# 命令 docker top 容器id
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker top e2d282970bc8
UID                 PID                 PPID                C                   STIME     
root                15788               15769               0                   18:30     

查看镜像的源数据

#命令
docker inspect 容器id
#显示容器的所有信息
root@iZuf64mpsl7ffadbli02pwZ ~]# docker inspect f0f6fd3efb82

进入当前正在运行的容器

#我们通常容器都是使用后台运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashShell


[root@iZuf64mpsl7ffadbli02pwZ ~]# docker exec -it 82121f2afefb /bin/bash
[root@82121f2afefb /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@82121f2afefb /]#


-it # 交互的方式

# 方式二
docker attch 容器id

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

docker cp 容器id:容器内路径 目的的主机路径
# 查看容器
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
edd99b123912   centos    "/bin/bash"   43 seconds ago   Up 42 seconds             friendly_raman
05770b868403   centos    "/bin/bash"   58 seconds ago   Up 57 seconds             optimistic_einstein
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker attach 05770b868403  # 进入容器
[root@05770b868403 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@05770b868403 /]# touch test.java  # 新建一个文件
[root@05770b868403 /]# exit
exit
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
edd99b123912   centos    "/bin/bash"   2 minutes ago   Up 2 minutes             friendly_raman
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
edd99b123912   centos    "/bin/bash"   2 minutes ago   Up 2 minutes                          friendly_raman
05770b868403   centos    "/bin/bash"   3 minutes ago   Exited (0) 16 seconds ago             optimistic_einstein
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker cp 05770b868403:/test.java /home   # 拷贝文件
[root@iZuf64mpsl7ffadbli02pwZ ~]#

[root@iZuf64mpsl7ffadbli02pwZ ~]# cd /home
[root@iZuf64mpsl7ffadbli02pwZ home]# ls
test.java  #// 查看外面已经拷贝出来
[root@iZuf64mpsl7ffadbli02pwZ home]#


# 拷贝现在是手动的  后面使用卷 挂载  容器内和容器外打通, 做一个映射关系

小结:

 

这个图包含了所有的命令

docker 的命令是十分多的,上面都是一些常用的命令,之后还会有很多的命令!

练习一 安装nginx

1,搜索镜像

​
[root@iZuf64mpsl7ffadbli02pwZ home]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16693     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      123                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   44   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [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    
vmware/nginx                         

2,下载nginx

[root@iZuf64mpsl7ffadbli02pwZ home]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete

3 ,查看是否下载成功

[root@iZuf64mpsl7ffadbli02pwZ home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   3 months ago   141MB
centos       latest    5d0da3dc9764   7 months ago   231MB
[root@iZuf64mpsl7ffadbli02pwZ home]#

4 ,启动nginx

[root@iZuf64mpsl7ffadbli02pwZ home]# docker run -d --name nginx01 -p:3344:80 nginx
eb364086fb305b96ea6a33e52819687559cabcd9038ea3a6b80bf20eb178acd0
[root@iZuf64mpsl7ffadbli02pwZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                                     NAMES
eb364086fb30   nginx     "/docker-entrypoint.…"   9 seconds ago    Up 7 seconds    0.0.0.0:3344->80/tcp                                                                                                                                  , :::3344->80/tcp   nginx01
edd99b123912   centos    "/bin/bash"              25 minutes ago   Up 25 minutes                                                                                                                                                                             friendly_raman
[root@iZuf64mpsl7ffadbli02pwZ home]#
# -d  后台运行
# --name  给容器命名
#-p:3344 (外部的端口):80 (docker内部的端口)

5,测试连通nginx

#命令
curl localhost:3344
[root@iZuf64mpsl7ffadbli02pwZ home]# 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>
​

端口暴露的概念

 

[root@iZuf64mpsl7ffadbli02pwZ home]# docker exec -it nginx01 /bin/bash
root@eb364086fb30:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@eb364086fb30:/# cd /etc/nginx
root@eb364086fb30:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@eb364086fb30:/etc/nginx#

思考问题:我们每次改动nginx配置文件,都需要进入容器?十分的麻烦,如果我们可以在外部修改里面也修改那就很方便;

作业二 Tomcat

# 官方的使用
docker run -it --rm tomcat:9.0
#我们之前启动都是后台,容器可以查到,docker run -it --rm ,一般用来测试,用完就删除
[root@iZuf64mpsl7ffadbli02pwZ home]# docker run -it --rm tomcat:9.0
Unable to find image 'tomcat:9.0' locally
9.0: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
7662046c36cb: Pull complete
#下载
docker pull tomcat:9.0
​
​
[root@iZuf64mpsl7ffadbli02pwZ home]# docker pull tomcat:9.0
9.0: Pulling from library/tomcat
Digest: sha256:cd96d4f7d3f5fc4d3bc1622ec678207087b8215d55021a607ecaefba80b403ea
Status: Image is up to date for tomcat:9.0
​
#启动运行
​
[root@iZuf64mpsl7ffadbli02pwZ home]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
0a8597eb7fceae73707e9dc8316ddd5d27fcf7546d9159e6e6d4f90ca17b029f
​
​
 # 测试访问没有问题
 
 # 进入容器发现问题
[root@iZuf64mpsl7ffadbli02pwZ home]# docker exec -it tomcat01 /bin/bash
# 问题1  是linux 少了,2 阿里云镜像的原因,默认是最小的镜像,所以不必要的命令都没有了
root@0a8597eb7fce:/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@0a8597eb7fce:/usr/local/tomcat#
​

思考问题:我们以后要部署项目每次都要进入容器非常的麻烦,容器外部提供一个映射路径,我们在外部放项目,就自动同步到内部就好了!

作业三 部署ES +kibana

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

# 下载启动
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
 
 #--net somenetwork  网络配置
 
 docker stats  # 查看cpu 的内存状态
 
 
 # 测试es 是否成功了
 
 # 增加内存的限制
 
 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xm512m" elasticsearch:7.6.2
 
 
 # 再次查看内存占用就很小了
 
[root@iZuf64mpsl7ffadbli02pwZ home]# docker stats 0a8597eb7fce
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O     PIDS


作业: 使用kibana 连接es? 思考网络如何连接过去?

 

可视化

  • partainer (先用这个)

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

Rancher (CI/CD 再用)

什么是portalner?

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

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

访问测试:http://106.15.176.2:8080/#/init/admin

 

 

Docker 镜像讲解

镜像是什么

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

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

如何得到镜像:

  • 从远程仓库下载

  • 朋友拷贝给你

  • 自己制作一个镜像DockerFile

Docker镜像加载原理

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

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

查看详细信息

 

[root@iZuf64mpsl7ffadbli02pwZ home]# docker image inspect redis:latest
[
    {
        "Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
        "RepoTags": [
            "redis:latest"
        ],

所有的Docker 镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。举例子,假如基于Ubuntu Linux 16.04 创建一个镜像,这就是新镜像的第一层,;如果在该层中添加Python 包,就会在基础镜像层之上创建第二个镜像层; 如果继续添加一个安全补丁,就会穿件第三个镜像层。

改镜像像当前已经包含3个镜像层,如下图

 

Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层, 容器之下的都被叫做镜像层

如何提交一个自己的镜像

Commit 镜像

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

实战测试

#启动一个默认的tomcat

# 发现默认的tomcat 缺少很多东西

#以后就用这个版本

# 将我们修改过的容器通过commit 提交一个镜像,以后我们就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
[root@iZuf64mpsl7ffadbli02pwZ home]# docker commit -a="kusnagshen" -m="add webapps app" 65c8ed3a28f0 tomcat03:1.0
sha256:613933e8e0457d60b1a9acf2bb0f8e8df1e9b4ed313f5d2049559a7c30e7ce1e
[root@iZuf64mpsl7ffadbli02pwZ home]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat03              1.0       613933e8e045   14 seconds ago   680MB
nginx                 latest    605c77e624dd   3 months ago     141MB
tomcat                9.0       b8e65a4d736d   4 months ago     680MB

 

学习方式说明: 理解概念,但是一定要实践,最后实践和李路怒结合一次搞定这个知识;

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

到了这里才算是入门docker!

容器数据卷

什么是容器数据卷

docker的理念回顾

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

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

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

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

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

 

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

使用数据卷

 方式一: 直接使用命令挂载! -v
docker run -it -v 主机目录:容器内目录
[root@iZuf64mpsl7ffadbli02pwZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

# 启动起来之后我们可以通过 docker inspect 容器id

 

测试文件的同步

 

 

1,停止容器

2,在宿主机修改文件

3,启动容器

4,容器内的文件依然是同步的

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

实战:安装Mysql

#获取镜像
docker pull mysql:5.7
# 运行容器,需要数据挂载 安装mysql 需要配置密码
# 官方的测试 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

02pwZ home]# docker run -d -p 3310: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


# 启动我们的mysql 
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 名字

# 启动成功只有,我们在本地使用sqlyog 来测试一下
# 连接到服务器的3310 --- 容器内3306 映射
# 在本地创建一个数据库测试文件是否同步

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

具名挂载和匿名挂载

#匿名挂载
-v容器路径!
​
docker run -d -P --name nginx01 -v /etc/nginx nginx
​
# 查看所有的卷的情况
​
 data]# docker volume ls
​
# 这里发现数据都是很长的字符串
local     084c4bd1e04ec1c4d05bf0ad643d875a2c02c2bb034cabf3f724ec323513cd7
​
#具名挂载
​
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
cb396ae8250945d9d41633d72d4719af63a432d2c13b50daa5b8ff61432829ca
​
​
​

 

查看具体位置

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker volume inspect juming-nginx

 

所有的docker容器内的卷,没有指定目录的情况下都是在 / var/lib/docker/volumes/xxx/_data

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

#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径  #匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:: 容器内路径 # 指定路径挂载!

扩展:

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

# 一旦设定了容器权限 容器对挂载出来的内容就有限定了;
#ro 只要看到这个  就说明这个路径只能通过外部宿主机来操作,容器内部是无法操作的

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

初识DockerFile

dickerfile 就是用来构建docker 镜像的文件! 就是一个命令脚本!

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

方式二:
FROM centos

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


[root@iZuf64mpsl7ffadbli02pwZ docker-test-volume]# docker build -f dockerfile -t kuangshen/centos .
Sending build context to Docker daemon  14.85kB

#启动自己生成的容器

 

volume01 volume02 这个卷是我们自己挂载的

 

查看卷挂在的路径

 

测试文件是否同步过去

[root@iZuf64mpsl7ffadbli02pwZ ~]# cd /var/lib/docker/volumes/e61f1640ddb803a03bff3f68e20949afaa55516f931570dff2a05e2c341d4678/_data
[root@iZuf64mpsl7ffadbli02pwZ _data]# ls
container.txt
[root@iZuf64mpsl7ffadbli02pwZ _data]#
​

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

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

数据卷容器

两个mysql同步 ,多个mysql数据同步

 

#启动3个容器

# 启动第一个容器
a]# docker run -it --name docker01 kuangshen/centos:1.0
[root@36777634c33e /]# ls -l
total 56
lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x  5 root root  360 Apr 28 11:51 dev
drwxr-xr-x  1 root root 4096 Apr 28 11:51 etc
drwxr-xr-x  2 root root 4096 Nov  3  2020 home
lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------  2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x  2 root root 4096 Nov  3  2020 media
drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 99 root root    0 Apr 28 11:51 proc
dr-xr-x---  2 root root 4096 Sep 15  2021 root
drwxr-xr-x 11 root root 4096 Sep 15  2021 run
lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x 13 root root    0 Apr 28 11:04 sys
drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
drwxr-xr-x 20 root root 4096 Sep 15  2021 var
drwxr-xr-x  2 root root 4096 Apr 28 11:51 volume01
drwxr-xr-x  2 root root 4096 Apr 28 11:51 volume02
[root@36777634c33e /]#
​
# 启动第二个容器
​
​
[root@iZuf64mpsl7ffadbli02pwZ _data]# docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0
[root@0354270d0a72 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Apr 28 11:53 dev
drwxr-xr-x   1 root root 4096 Apr 28 11:53 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 101 root root    0 Apr 28 11:53 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr 28 11:04 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Apr 28 11:51 volume01
drwxr-xr-x   2 root root 4096 Apr 28 11:51 volume02
​

 

 

启动第三个容器

[root@iZuf64mpsl7ffadbli02pwZ docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 kuangshen/centos:1.0
[root@bb7cb2e23338 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Apr 28 12:03 dev
drwxr-xr-x   1 root root 4096 Apr 28 12:03 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 104 root root    0 Apr 28 12:03 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr 28 11:04 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Apr 28 11:56 volume01
drwxr-xr-x   2 root root 4096 Apr 28 11:51 volume02
[root@bb7cb2e23338 /]# touch docker03
[root@bb7cb2e23338 /]# cd volume01
[root@bb7cb2e23338 volume01]# touch docker03
[root@bb7cb2e23338 volume01]# ls
docker01  docker03
[root@bb7cb2e

 

过个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql02 --volume-from mysql01 mysql:5.7

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

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止,但是一旦你持久化到了本地,这个时候本地的数据是不会删除的;

DockerFile

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

构建步骤:

1, 编写一个dockerfile 文件

2, docker build 构建一个镜像

3, docker run 运行镜像

4, docker push 发布镜像 (dockerHub 阿里云镜像仓库!)

 

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
​
LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
​
CMD ["/bin/bash"]

DockerFile构建过程

基础知识:

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

2,执行从上到下顺序执行

3,#表示注释

4,每一个指令都会穿件一个新的镜像层,并提交!

 

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

Docker 镜像逐渐称为企业交付的标准,必须掌握!

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

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

Dockerimages : 通过Docker 构建生成镜像,最终发布和运行产品,

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

 

Docker的指令

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

实战测试

Docker Hub 中99% 镜像都是从 FROM scartch ,然后配置需要的软件和配置来进行构建

创建一个自己的centos
#1编写dockerfile 的文件
[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAIENR kuangsheng<1183935936@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 bulid -f dockerfile 文件路径 -t 镜像名: 版本号

[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .                  


#3 测试运行


Doc

 

我们可以列出本地镜像的变更历史

​
[root@iZuf64mpsl7ffadbli02pwZ dockerfile]#  docker history 11e8a47e3476
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
11e8a47e3476   3 hours ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
dd0c03acc589   3 hours ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
eb262e338054   3 hours ago    /bin/sh -c #(nop)  VOLUME [volume01 volume02]   0B
5d0da3dc9764   7 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      7 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      7 months ago   /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0…   231MB
​

查看官方的mysql是怎么做的

​
[root@iZuf64mpsl7ffadbli02pwZ dockerfile]#  docker history c20987f18b13
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
c20987f18b13   4 months ago   /bin/sh -c #(nop)  CMD ["mysqld"]               0B
<missing>      4 months ago   /bin/sh -c #(nop)  EXPOSE 3306 33060            0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>      4 months ago   /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B
<missing>      4 months ago   /bin/sh -c #(nop) COPY file:345a22fe55d3e678…   14.5kB
<missing>      4 months ago   /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B
<missing>      4 months ago   /bin/sh -c {   echo mysql-community-server m…   313MB
<missing>      4 months ago   /bin/sh -c echo 'deb http://repo.mysql.com/a…   55B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.36-…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0B
<missing>      4 months ago   /bin/sh -c set -ex;  key='A4A9406876FCBD3C45…   1.84kB
<missing>      4 months ago   /bin/sh -c apt-get update && apt-get install…   52.2MB
<missing>      4 months ago   /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B
<missing>      4 months ago   /bin/sh -c set -eux;  savedAptMark="$(apt-ma…   4.17MB
<missing>      4 months ago   /bin/sh -c #(nop)  ENV GOSU_VERSION=1.12        0B
<missing>      4 months ago   /bin/sh -c apt-get update && apt-get install…   9.34MB
<missing>      4 months ago   /bin/sh -c groupadd -r mysql && useradd -r -…   329kB
<missing>      4 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      4 months ago   /bin/sh -c #(nop) ADD file:bd5c9e0e0145fe33b…   69.3MB
[root@iZuf64mpsl7ffadbli02pwZ dockerfile]#
# 查看官方的tomcat怎么做的
​
[root@iZuf64mpsl7ffadbli02pwZ _data]# docker history b8e65a4d736d
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
b8e65a4d736d   4 months ago   /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B
<missing>      4 months ago   /bin/sh -c #(nop)  EXPOSE 8080                  0B
<missing>      4 months ago   /bin/sh -c set -eux;  nativeLines="$(catalin…   0B
<missing>      4 months ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   20.2MB
<missing>      4 months ago   /bin/sh -c #(nop)  ENV TOMCAT_SHA512=b4c2c85…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV TOMCAT_VERSION=9.0.56    0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV TOMCAT_MAJOR=9           0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV GPG_KEYS=48F8E69F6390…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV LD_LIBRARY_PATH=/usr/…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV TOMCAT_NATIVE_LIBDIR=…   0B
<missing>      4 months ago   /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0B
<missing>      4 months ago   /bin/sh -c mkdir -p "$CATALINA_HOME"            0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/tomca…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV CATALINA_HOME=/usr/lo…   0B
<missing>      4 months ago   /bin/sh -c #(nop)  CMD ["jshell"]               0B
<missing>      4 months ago   /bin/sh -c set -eux;   arch="$(dpkg --print-…   343MB
<missing>      4 months ago   /bin/sh -c #(nop)  ENV JAVA_VERSION=11.0.13     0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B
<missing>      4 months ago   /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B
<missing>      4 months ago   /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B
<missing>      4 months ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   11.3MB
<missing>      4 months ago   /bin/sh -c apt-get update && apt-get install…   152MB
<missing>      4 months ago   /bin/sh -c set -ex;  if ! command -v gpg > /…   18.9MB
<missing>      4 months ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   10.7MB
<missing>      4 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      4 months ago   /bin/sh -c #(nop) ADD file:c03517c5ddbed4053…   124MB
​

CMD 和ENTRYPOINT 区别
CMD			#指定这个容器启动的时候运行的命令, 只有最后一个生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候运行的命令,可以追加 命令
[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]



[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# docker build -f dockerfile-cmd-test cmdtest .

 

测试 ENTRYPOINT

[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]



[root@iZuf64mpsl7ffadbli02pwZ dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test
"docker build" requires exactly 1 argument.

dockerfile 中很多命令都十分的相似,我们要做的是对比他们然后测试就可以了

实战: Tomcat 镜像

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

 

2,编写dockerfile 文件 ,官方命名 DockerFile ,build 会自动找这个文件

 FROM centos
 MAINTAINER  mengzi<1183935936@qq.com>
​
 COPY readme.txt /usr/local/readme.txt
 ADD jdk-8ull-linux-x64.tar.gz /usr/locat/
 ADD apache-tomcat-9.0.22.tar.gz
 RUN yum -y install vim
 ENV MYPATH /usr/local
 WORKDIR $MYPATH
 ENV JAVA_HOME /usr/local/jdk1.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 CATALINA_BASH /usr/local/apache-tomcat-9.0.22
 ENV PATH $PATH:JAVA_HOME/bin:$CLASSPATH_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
 
#构建自己的镜像
docker build -t diytomcat .
docker run -d -p 9090:8080 --name kuangshentomcat -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v/home/kuangshen/build/tomcat/tomcatlogs/:/use/local/apache-tomcat-9.0.22/logs diytomcat

开发步骤: 掌握Dockerfile的编写! 我们之后的一切都是使用docker镜像来发布运行!

4 ,启动镜像

5,访问测试

6,本地发布目录项目

发布自己的镜像

dockerHub

1,地址 Docker Hub 注册自己的账号

2,确定这个账号可以登录

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

[root@iZuf64mpsl7ffadbli02pwZ ~]# 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
[root@iZuf64mpsl7ffadbli02pwZ ~]#
​

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker login -u mengzhenxin
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@iZuf64mpsl7ffadbli02pwZ ~]#

4,登录完毕后就可以提交镜像了,就一步 docker push

#push 自己的镜像到服务器上
docker push diytomcat
#push 问题?

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker push kuangshen/centos
Using default tag: latest
The push refers to repository [docker.io/kuangshen/centos]

#解决 加tag 修改名字和版本号
# 自己发布的镜像尽量带上版本号

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker tag 613933e8e045 kuangshen/tomcat:2.0
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker push kuangshen/tomcat:2.0
The push refers to repository [docker.io/kuangshen/tomcat]
f3dea89e428b: Preparing
3e2ed6847c7a: Preparing
bd2befca2f7e: Preparing
59c516e5b6fa: Preparing

 

发布镜像到阿里云上

1,登录阿里云

2,找到容器镜像服务

3,创建命名空

 

4,创建容器镜像

 

5,浏览阿里云的信息

 

登录阿里云

[root@iZuf64mpsl7ffadbli02pwZ ~]# docker login --username=mengzhenxin01 registry.cn-shanghai.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/comman

标签: 连接器df1ec

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台