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 原生镜像(一个电脑!) 隔离, 需要开启多个虚拟机 几个 GDocker ,隔离 镜像(最核心 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 是内核级别的虚拟化,可以在一个物理机器上 运行很多的容器实例!服务器可以利用到极致;
只要学不是 ,就往死里学!
镜像(image)
docker 镜像就好比一个模板,可以通过这个模板来创建一个容器服务, tomcat 镜像===》 run ===> tomcat01 容器 ( 提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行在容器中)
容器(container)
Docker 利用容器技术,独立运行一个组应用,通过镜像来创建的。
启动,停止,删除, 基本命令!
目前可以把这个容器理解为一个简易的linux,项目就放在这个微型的linux里面
仓库(repository)
仓库就是存放在镜像的地方
仓库分为公有仓库和私有仓库!
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 \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启动dockersystemctl 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 /]##从容器退回主机 exitdocker 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:tag02pwZ 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 centosVOLUME ["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.7docker 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 $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD 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![](/assets/blank.gif)
我们可以列出本地镜像的变更历史
[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 centosMAINTAINER mengzi<1183935936@qq.com> COPY readme.txt /usr/local/readme.txtADD jdk-8ull-linux-x64.tar.gz /usr/locat/ADD apache-tomcat-9.0.22.tar.gzRUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_11ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22ENV PATH $PATH:JAVA_HOME/bin:$CLASSPATH_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /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-storeLogin 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/commandline/login/#credentials-store Login Succeeded
push 到阿里云
[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
阿里云镜像的步骤就参考阿里云文档
小结:
root@iZuf64mpsl7ffadbli02pwZ ~]# docker save --help Usage: docker save [OPTIONS] IMAGE [IMAGE...] Save one or more images to a tar archive (streamed to STDOUT by default) Options:-o, --output string Write to a file, instead of STDOUT
Docker网络(容器编排)
删除所有的容器镜像
dbli02pwZ ~]# docker rmi -f $(docker images -aq)
网卡有三个
# 问题,docker 是如何处理容器访问网络的? 1,启动一个容器 [root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -d -P --name tomcat01 tomcat# 查看容器内部网络地址 ip addr[root@iZuf64mpsl7ffadbli02pwZ ~]# docker exec -it tomcat01 ip addr# 思考 linux 能不能 ping 通#linux 可以ping通 docker 容器内部
原来
192.168.0.1 路由器的地址
192.168.0.3 在同一个网段 可以ping通
1,每启动一个docker 容器 docker就会给容器分配一个ip,我们只要安装了docker 就会有一个网卡 docker0 用的是桥接模式,使用技术是 evth-apir 技术;
# 我们发现这个容器带来网卡,都是一对的 #evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 #正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备
测试 tomcat01 和tomcat02 是否能ping通
结论: 容器和容器之间是可以ping通的
所有的容器不指定网络的情况下,都是docker0路由的,docker 会给我们的容器分配一个默认的可用的ip
255.255.0.1/16 域
16 代表两个 8位 可以配置255*255 个地址
00000000.00000000.00000000.00000000
255.255.255.255
小结
Docker 使用的是linux 的桥接技术
宿主机中是一个Docker 容器网桥 docker0
Docker 中的所有网络接口都是虚拟的。 虚拟的转发效率高!
只要容器删除,网桥就没有了
思考 一个场景,我们编写一个服务, datbase url =ip ,项目不重启,数据库ip换掉了,我们希望处理这个问题,我们用名字来进行访问?
--link
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat bd96bf9309dd39a2a91d6430515745a90b65a5afd43ca9dfc4864506156dbf35 [root@iZuf64mpsl7ffadbli02pwZ ~]# docker exec -it tomcat03 ping tomcat02
通过--link 就可以连通了
反向不可以连通 需要
进入容器
docker exec -it tomcat03 cat /etc/hosts
#--driver bridge 桥接网 #--subnet 192.168.0.0/16 子网掩码 最大255*255 #-gateway 192.168.0.0.1 相当于你家路由器的地址 [root@iZuf64mpsl7ffadbli02pwZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.0.1 mynet
查看自己的网络
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker network inspect mynet
启动容器走自己的网络
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
结论: 我们自定义的网络docker 都已经帮我们维护好了对应的关系! (推荐使用自定义网络)
好处:
redis- 集群 搭建一个网络
mysql - 不同的集群使用不同的网络,保证集群的安全和健康的
网络连通
连接一个网络到一个容器
#测试打通 toncat01 -mynet docker network connet mynet # 连通之后将tomcat01 放到 mynet 下了 比如说阿里云有公网ip 和私网ip 都可以访问 docker exec -it tomcat01 ping toncat-net-01
结论:假设需要跨网络去操作别人,就需要使用 docker network connet 连通网络
Docker Compose
Docker Swarm
实战部署redis集群
1,
[root@iZuf64mpsl7ffadbli02pwZ ~]# docker create redis --subnet 172.38.0.0/16
# 创建网卡 docker network create redis --subnet 172.38.0.0/16# 通过脚本创建六个redis配置 for port in $(seq 1 6); \ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >/mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done # 创建结点1 docker run -p 6371:6379 -p 16371:16379 --name redis-1 \ -v /mydata/redis/node-1/data:/data \ -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点2 docker run -p 6372:6379 -p 16372:16379 --name redis-2 \ -v /mydata/redis/node-2/data:/data \ -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf #创建结点3 docker run -p 6373:6379 -p 16373:16379 --name redis-3 \ -v /mydata/redis/node-3/data:/data \ -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf #创建结点4 docker run -p 6374:6379 -p 16374:16379 --name redis-4 \ -v /mydata/redis/node-4/data:/data \ -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf #创建结点5 docker run -p 6375:6379 -p 16375:16379 --name redis-5 \ -v /mydata/redis/node-5/data:/data \ -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf #创建结点6 docker run -p 6376:6379 -p 16376:16379 --name redis-6 \ -v /mydata/redis/node-6/data:/data \ -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 创建集群 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it redis-1 /bin/sh /data # ls appendonly.aof nodes.conf /data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.38.0.15:6379 to 172.38.0.11:6379 Adding replica 172.38.0.16:6379 to 172.38.0.12:6379 Adding replica 172.38.0.14:6379 to 172.38.0.13:6379 M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379slots:[0-5460] (5461 slots) master M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379slots:[5461-10922] (5462 slots) master M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379slots:[10923-16383] (5461 slots) master S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379replicates 259e804d6df74e67a72e4206d7db691a300c775e S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379replicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638 S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379replicates a89c1f1245b264e4a402a3cf99766bcb6138dbca Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ... >>> Performing Cluster Check (using node 172.38.0.11:6379) M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s) M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s) S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379slots: (0 slots) slavereplicates a89c1f1245b264e4a402a3cf99766bcb6138dbca S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379slots: (0 slots) slavereplicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638 M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s) S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379slots: (0 slots) slavereplicates 259e804d6df74e67a72e4206d7db691a300c775e [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
我们使用docker之后,所有的技术都会慢慢的变简单起来!
SpringBoot 微服务打包Docker 镜像
1,架构springboot项目
2,打包应用
3,编写dcokerfile
4,构建镜像
5,发布运行!
上传docker file 到/home/idea 目录里
#直接bulid 一个镜像 镜像名为kaungshen666 idea]# docker build -t kuangshen666 .
2,运行一下这个镜像
# docker run -d -P --name kuangshen-springboot-web kuangshen666
测试
以后我们使用docker 之后,给别人交付之后给一个镜像即可!
CI/CD jenkins流水线
Docker 容器学习完整笔记相关推荐
- Docker容器学习笔记一
Docker容器学习笔记一 狂神说B站视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=1 Docker容器学习笔记二:https://blog.csd ...
- Docker容器学习梳理--日常操作总结
使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands:attach Attach t ...
- Docker容器学习梳理--应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...
- 【Docker容器学习笔记一】
一.Docker概述 1.Docker为什么会出现? 一款产品: 开发–上线 两套环境!应用环境,应用配置! 开发 - 运维. 问题:我在我的电脑上可以允许!版本更新,导致服务不可用!对于运维来说考验 ...
- docker容器学习笔记
docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障. docker组成: docker client.docker server.docker组件(镜像(image).容器(contain ...
- Docker容器学习笔记(看了狂神视频)
狂神的笔记更加系统详细,推荐大家可以去看狂神的视频教程和笔记.我这里仅根据我自己的需求写的笔记,对于需要快速掌握docker的使用的朋友可以参考学习. Docker 背景需求 之前,开发一套环境,上线 ...
- Docker容器学习(一)
文章目录 前言: 一.Docker 概述: 1.Docker 简介: 2.对比传统虚拟机: 二.基本概念: 1.镜像(image): 2.容器(container): 3.仓库(repository) ...
- Docker容器学习
介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化. 容器是完全使用沙箱机制,相互之间不会有 ...
- 2.Docker容器学习之新生入门必备基础知识
文章目录 0x02 Docker 核心概念 1.镜像 [image] 2.容器 [Container] 3.仓库 [Repository] 0x03 Docker 数据管理 1.数据卷 2.数据卷容器 ...
- Docker容器学习梳理-容器时间跟宿主机时间同步
在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致.如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...
最新文章
- 学习 Message(10): WM_CancelMode 消息测试
- IBM也要开源机器学习平台
- vue-cli中的webpack配置
- centos7添加防火墙端口
- oracle M4,oracle高级部分 - osc_9gm4ypss的个人空间 - OSCHINA - 中文开源技术交流社区...
- Eclipse + Pydev开发Python时import报错解决方法
- HoloLens开发手记 - HoloLens shell概述 HoloLens shell overview
- MFC - PreTranslateMessage()响应自定义消息
- Comparable和Comparator区别是什么?差点吃屎
- 东莞理工c语言作业,东莞理工学院 c语言复习题
- python log函数_求你别再花大价钱学 Python 之爬虫实战
- vue----sourceMap
- 【经验之谈】Git使用之TortoiseGit配置VS详解
- Build DCM4chee2
- Linux基础-2文件及目录管理
- Calendar(显示日期)
- 基于MUI制作手机社交app通讯录列表页面源码
- layer弹出层自适应高度,垂直水平居中
- 数据结构队列顺序循环队列、加入、删除、取头元素
- Oracle 18C RAC安装利用iSCSI实现部署