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