Docker安装到入门
Docker安装到入门
一、概述
1、 简介
一款产品:开发 -- 上线 两套环境!应用环境,应用配置
开发····运维。那么:环境的配置是非常麻烦的,每一个机器都要部署环境(Redis、ES、Hadoop···)费时费力。
发布一个项目(jar + (Redis、MySQL、jdk···)),项目能不能都带上环境打包
之前在服务器配置一个应用环境Redis、MySQL,配置麻烦,不能够跨平台
传统:开发jar,运维部署
现在:开发打包上线,一套流程做完
Java -- jar (环境) -- 打包项目带上环境(镜像) -- (Docker仓库:商店) -- 下载我们发布的镜像 -- 直接运行
Docker思想来源于集装箱
隔离:Docker核心思想 | 打包装箱 | 每个箱子都是互相隔离的
2、 优点
- 应用更快速的交付和部署
- 传统:一堆帮助文档,安装程序
- Docker:打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容
- 使用了Docker之后,我们部署应用就和搭积木一样!项目打包为一个镜像,拓展
- 更简单的系统运维
- 在容器化之后,我们的开发,测试环境都是高度一致的
- 更加高效的计算机的资源利用
- Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例
3、 基本组成

-
镜像(image)
docker镜像好比就是一个模板,可以通过这个模板来创建容器服务,通过这个镜像还可以创建多个容器
-
容器(container)
docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。。
目前可以简单把这个容器理解为一个简易的linux系统。
-
仓库(repository)
仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库

二、 Docker安装
1、 环境准备
- 需要会一点点的Linux基础:https://blog.csdn.net/qq_62789540/article/details/125588246
- 使用CentOS7系统
- 使用远程连接工具连接我们的虚拟机
系统环境:
(base) [root@MyCentOS ~]# uname -r 3.10.0-1160.76.1.el7.x86_64
2 、安装
2.1 使用官方脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun curl -sSL https://get.daocloud.io/docker | sh # 使用国内 daocloud 一键安装命令
2.2 手动安装
2.2.1 卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2.2.2 需要的安装包
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
2.2.3 设置仓库
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 使用官方源安装 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 使用阿里云安装 sudo yum-config-manager \ --add-repo \ https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo # 使用清华大学源安装
2.2.4 安装docker依赖
yum makecache fast # 更新yum软件包索引 yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 安装docker-ce社区版 ee企业版
2.2.5 安装特定版本的引擎
如果不想使用最新版本的docker,可以安装指定版本的引擎
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
yum list docker-ce --showduplicates | sort -r # docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable # docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。
例如:安装20.10.9
的引擎:docker-ce-20.10.9。
sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
2.2.6 测试docker
systemctl status docker # 查看docker的状态 ststemctl start docker # 启动docker systemctl enable docker # 是docker可以自启动 docker version # 如果安装成功,则会返回docker的版本信息 docker run hello-world # 运行hello-world镜像 docker images # 查看安装好的镜像
3、 卸载
3.1 删除依赖
yum remove docker-ce docker-ce-cli containerd.io
3.2 删除资源
rm -rf /var/lib/docker # docker 的默认工作路径
4、 阿里云镜像加速
链接地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在里面获取到加速链接
运行脚本:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://asdjksd.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
三、 Docker原理
1、 运行流程
run流程图
2、 底层原理
Docker是怎么工作的?
-
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
Docker为什么比虚拟机快?
-
Docker有着更少的抽象层
-
Docker利用的是宿主机的内核,vm需要Guest OS
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的!
四、 Docker常用命令
1、 帮助命令
docker version # 显示docker的版本信息 docker info # 显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help # 帮助命令
Docker全部命令帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/
2、 镜像命令
2.1 docker images
(base) [root@MyCentOS ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 11 months ago 13.3kB
解释:
REPOSITORY
:镜像的仓库源TAG
:镜像的标签IMAGE ID
:镜像的idCREATED
:镜像创建的时间SIZE
:镜像的大小
可选项:
名字 | 默认值 | 描述 |
---|---|---|
--all , -a |
显示所有镜像(默认隐藏中间镜像) | |
--quiet , -q |
只显示镜像的ID |
2.2 docker search
搜索镜像
(base) [root@MyCentOS ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 13234 [OK] mariadb MariaDB Server is a high performing open sou… 5062 [OK]
解释:
NAME
:镜像名称DESCRIPTION
:镜像描述STARS
:镜像的星数(可以使用docker search -f STARS=10000 mysql
来筛选比较热门的镜像)OFFICIAL
:是否是官方镜像AUTOMATED
:是否自动构建
可选项:
名字 | 默认值 | 描述 |
---|---|---|
--filter , -f |
根据提供的条件筛选输出 | |
--limit |
25 |
限制最大的输出结果 |
2.3 docker pull
镜像的拉取
docker pull 镜像名[:tag]
- 如果不写版本,默认下载最新版的
docker pull mysql:5.7 # 指定5.7下载
2.4 docker rmi
docker rmi -f [IMAGE ID | NAME:TAG]
:使用名字加版本号删除,或者使用镜像ID删除,-f
参数强制删除
docker rmi -f hello-world:latest # 删除hello-world镜像 docker rmi -f $(docker images -aq) # 删除全部的镜像,传入容器ID docker images -aq | xargs docker rmi -f # 使用管道符进行递归删除
3、 容器命令
说明,我们有了镜像才可以创建容器,linux,下载一个CentOS来测试学习
docker pull centos # 下载最新版本的centos
3.1 创建容器并启动
docker run [options] image
参数说明:
--name="name"
:容器名字,用来区分这个容器-d
:后台方式运行-it
:使用交互方式运行,进入容器查看内容-p
:指定容器的端口 主机端口:容器端口 |-p 80800:8080
# 比如:启动并进入容器,基础版本,很多命令都是不完善的 docker run -it centos /bin/bash
查看容器:
docker ps # 列出当前正在运行的容器
参数:
-a
: 显示所有容器(默认显示正在运行)-n=?
:显示最近创建的容器-q
:只显示容器的编号
退出容器:
exit # 直接退出并停止容器 ctrl + p + q # 容器不停止退出
删除容器:
docker rm 容器id # 根据容器id删除容器 docker rm -f ${docker ps -aq} # 删除所有的容器 docker ps -aq | xargs docker rm -f # 使用管道符进行递归删除
启动和停止容器的操作:
docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前正在运行的容器
3.2 常用其他命令
后台启动容器
# docker run -d 镜像名 docker run -d centos # 问题docker:发现centos停止了 # 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止 # nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了!
查看日志
docker logs --help # 获取帮助信息 docker logs -tf --tail n 容器id # 显示后n行的日志,会一直监听 docker logs -tf 容器id # 显示全部日志
查看容器中进程信息
docker top 容器id # 查看容器中进程信息,没有其余的参数
查看镜像原数据
docker inspect --help # 查看镜像的信息,查看容器的信息 dcoker inspect 容器id # 查看对应容器的原数据
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置 # 命令1 docker exec -it 容器id /bin/bash # 进入一个新的终端中 # 命令2 docker attach 容器id # 进入正在运行的终端中
从容器内拷贝文件到主机上
docker cp 容器id:容器路径 主机路径 # 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现
注意,上面的容器id也可以是我们设置的容器名称,其都可以标识一个容器
4、 docker全部命令
[root@192 ~]# docker --help Usage: docker [OPTIONS] COMMAND // docker [选项] 命令 A self-sufficient runtime for containers //翻译:容器的自给自足运行时 Options:【选项】 --config string //客户端配置文件的位置 (default "/root/.docker") -c, --context string //用于连接到守护进程的上下文的名称(覆盖DOCKER_HOST env变量和默认上下文设置 "docker context use") -D, --debug //启用调试模式 -H, --host list //守护进程 socket(s) 连接 -l, --log-level string //设置日志级别 ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls //使用 TLS; 隐含 --tlsverify --tlscacert string //仅由此CA签名的信任证书(default "/root/.docker/ca.pem") --tlscert string //TLS证书文件路径 (default "/root/.docker/cert.pem") --tlskey string //TLS密钥文件的路径 (default "/root/.docker/key.pem") --tlsverify //使用TLS并验证远端 -v, --version //打印版本信息并退出 Management Commands:【管理命令】 app* Docker App (Docker Inc., v0.9.1-beta3) builder Manage(管理) builds buildx* Docker Buildx (Docker Inc., v0.7.1-docker) config Manage Docker configs container Manage containers //containers:容器 context Manage contexts image Manage images manifest Manage Docker image manifests and manifest lists //管理Docker镜像清单和清单列表 network Manage networks node Manage Swarm nodes //群节点 plugin Manage plugins //插件 scan* Docker Scan (Docker Inc., v0.12.0) //Scan:扫描 secret Manage Docker secrets //密码 service Manage services stack Manage Docker stacks swarm Manage Swarm //群 system Manage Docker trust Manage trust on Docker images // trust:信任 volume Manage volumes //卷 Commands:【命令】 attach //将本地标准输入、输出和错误流附加到运行的容器 attach:附加 build //从Dockerfile构建一个映像 commit //根据容器的更改创建一个新镜像 cp //在容器和本地文件系统之间复制文件/文件夹 create //创建一个新容器 diff //检查容器文件系统中文件或目录的更改 events //从服务器获取实时事件 events:事件 exec //在运行的容器中运行命令 exec:执行 export //将容器的文件系统导出为tar存档文件 export:导出 history //显示一个镜像的历史 images //镜像的列表 import //从tarball文件中导入内容以创建文件系统映像 info //显示整个系统的信息 inspect //返回Docker对象的底层信息 inspect:检查 kill //杀死一个或多个正在运行的容器 load //从tar存档文件或STDIN加载镜像 login //登录到Docker注册表 logout //从Docker注册表注销 logs //获取容器的日志 pause //暂停一个或多个容器中的所有进程 pause:暂停 port //列出容器的端口映射或特定映射 ps //容器的列表 pull //从仓库(registry)中拉取镜像或存储库 push //将镜像或存储库推送到仓库(registry) rename //重命名一个容器 restart //重新启动一个或多个容器 rm //移除一个或多个容器 rmi //移除一个或多个镜像 run //在新容器中运行命令 save //将一个或多个镜像保存到tar存档文件(默认情况下流到STDOUT) search //在Docker Hub搜索镜像 start //启动一个或多个停止的容器 stats //显示容器资源使用统计的实时流 stop //停止一个或多个正在运行的容器 tag //创建引用SOURCE_IMAGE的标记TARGET_IMAGE top //显示容器的运行进程 unpause //取消暂停一个或多个容器中的所有进程 unpause:不暂停 update //更新一个或多个容器的配置 version //查看Docker版本信息 wait //阻塞直到一个或多个容器停止,然后打印它们的退出代码 Run 'docker COMMAND --help' for more information on a command.
五、 Docker练习
1、 部署Nginx
docker search nginx # 搜索镜像,建议去官网搜索https://hub.docker.com/ docker pull nginx # 下载镜像 docker run -d --name "nginx1" -p 3344:80 nginx # 运行镜像,将容器的80端口映射到3344端口,同时将容器命名为nginx1 curl localhost:3344 # 本机自测,获取返回的内容 docker exec -it nginx1 /bin/bash # 进入容器 whereis nginx # 查看Nginx的配置文件位置 cd /etc/nginx/ # 进入配置文件,后面可以修改Nginx的配置文件 exit # 退出容器 docker stop nginx1 # 停止容器
思考问题:我们每次改动Nginx配置文件,都需要进入容器内部,十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内就可以自动修改?
- 使用容器卷技术
2、 部署Tomcat
官方启动Tomcat的方式
docker run -it --rm tomcat:9.0 # --rm 参数的意思是用完就删除这个镜像,一般用来测试,用完就删,注意删除的是容器
我们自己启动的方式:
docker search tomcat # 搜索镜像,建议去官网搜索https://hub.docker.com/ docker pull tomcat # 拉取镜像 docker run -d --name tomcat1 -p 8801:8080 tomcat # 后台启动Tomcat docker exec -it tomcat1 /bin/bash # 进入到容器里面 # 发现问题,linux命令少了,没有webapps。阿里云镜像的原因,默认是最小的镜像,所有不必要的全部删掉,保留最小可运行环境 cp -r webapps.dist/* webapps # 我们将其输出路径下的内容拷贝到webapps中,然后我们的网站就可以正常显示了
3、 部署 es + kibana
问题:
- es 需要暴露比较多的端口
- es 十分耗内存
- es 的数据一般需要放置到安全目录挂载
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2 # 启动了,使用命令 `docker stats 容器id`查看CPU状态 docker stats # 测试一下es是否成功了! curl localhost:9200
4、 镜像可视化
Portaniner是Docker的图形化管理工具,类似的工具还有Rancher(CI/CD再用)
(Portaniner平时比较少用)
1、下载运行Portaniner镜像并运行,设置本机映射端口为8088
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、 访问测试
创建用户后,使用管理面板
可视化面板平时不会使用
六、 Docker镜像详解
1、 什么是镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
所以应用直接打包镜像,就可以用于运行
获得镜像的途径:
- 自己制作镜像DockerFile - 远程仓库下载 - 别人copy给你
2、 联合文件系统
Docker的镜像实际上由一层一层的文件系统组成(下载镜像时分层下载可印证),这种层级的文件系统是UnionFS联合文件系统。
UnionFS (联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文研系统的修改。作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
-
特性:一次同时加载多个文件系统,但从外面看起来,只能看到外文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
-
作用:比如tomcat下载了centos,则mysql就不用下载了。相同层可复用
-
思考:为什么Docke也像要采用这种分层的结构呢?
- 最大的好处,莫过于是资源共享了 !比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只高要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享.
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层.
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,
就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子).
查看镜像分层的方式可以通过docker image inspect
命令!
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常所说的容器层,容器之下都叫做镜像层!
3、 提交镜像
commit镜像:
docker commit # 提交容器成为一个新的副本 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:TAG]
实战测试:
官方默认的webapps中是没有文件的,我们制需要作一个Tomcat镜像,使得webapps里面有内容
docker pull tomcat # 拉取一个全新的Tomcat镜像 docker run -d --name tomcat1 -p 8801:8080 tomcat # 后台启动Tomcat docker exec -it tomcat1 /bin/bash # 进入到镜像中 cp -r webapps.dist/* webapps # 将我们的内容拷贝到当前的webapps中,使得Tomcat会显示内容 exit # 退出容器 docker ps -aq # 获取我们的容器id docker commit -a="kun" -m="add webapps app" 72eac48d9a8d tomcat01:1.0 # 提交一个我们的容器
然后,我们就看到了一个新的生成好的docker images
如果你想保存当前容器的状态,就可以通过commit来提交,获得一个镜像。就好比我们以前学习虚拟机的时候的快照。
七、 容器数据卷
1、 什么是数据卷
docker理论回顾
将应用和环境打包成一个镜像
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
- 容器之间可以有一个数据共享技术!Docker容器中产生的数据同步到本地!
- 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
2、 使用数据卷
-
直接使用命令来挂载:
-v
docker run -it -v 主机目录:容器目录 主机目录和容器目录进行映射
docker run -it -v /root/a:/home --name myCentos centos /bin/bash # 进行目录的映射 mkdir /home/test # 在容器的home目录下创建一个test目录 exit # 退出容器 ls /root/a # 查看a目录下是否有test文件夹 # 启动之后,我们可以通过`docker inspect 容器id`查看容器挂载信息,如果没有挂载,则说明挂载失败 docker inspect myCentos 好处:我们以后修改只需要在本地修改,容器内会自动同步
3、 安装MYSQL
docker pull mysql:5.7 # 获取镜像 # 运行容器,进行mysql的数据挂载 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 mysql1 mysql:5.7
-e
:mysql运行时的环境配置
-p
:端口映射
-v
:卷映射
/var/lib/mysql
数据库存放所有的mysql表数据的路径/etc/mysql/conf.d
:数据库的配置文件路径
-d
:后台运行
然后,我们使用本地的Navicat来测试连接,显示连接成功:
4、 具名挂载和匿名挂载
4.1 具名挂载
具名挂载就是指定了主机目录进行挂载(有给卷(主机目录)起名就是具名(有具体的名))
docker run -d -P --name nginx01 -v jumin:/etc/nginx nginx
查看所有的volume(卷)的情况
docker volume ls DRIVER VOLUME NAME local 72582b6850fefbc4d29bea559fddc970b09d269584cc7c8c96d7fbb0add45c7d local 85546f7af3394bd26f5cc66f53eaa56014cfced5db744676dd382c6558543444 local f9c60d7eb8150c82dc591c86d49ac4d2c69bcad0a96840ff3d23838777b87a2c local jumin # 这个是具名挂载的卷
4.2 匿名挂载
匿名挂载就是不指定主机目录进行挂载(没有给卷(主机目录)起名就是匿名)
docker run -d -P --name nginx01 -v /etc/nginx nginx
随机端口映射启动,同时匿名挂载目录
/etc/nginx
查看挂载的卷的情况:
docker volume ls # DRIVER VOLUME NAME # local 72582b6850fefbc4d29bea559fddc970b09d269584cc7c8c96d7fbb0add45c7d # local 85546f7af3394bd26f5cc66f53eaa56014cfced5db744676dd382c6558543444 # local f9c60d7eb8150c82dc591c86d49ac4d2c69bcad0a96840ff3d23838777b87a2c # 这些字符串就代表匿名卷(目录),是匿名挂载
4.3 查看卷路径
指定卷来查看挂载
docker volume inspect VOLUME NAME
通过VOLUME NAME来查看挂载的目录
所有的docker容器内的卷,没有指定绝对路径的目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
下的,如果指定了目录,docker volume ls
是查看不到的。
4.4 小结
# 三种挂载: 匿名挂载、具名挂载、指定路径挂载 -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
我们通过具名挂载可以很方便的找到我们的一个卷,大多数情况都使用具名挂载
拓展
ro #readonly 只读 rw #readwrite 可读可写 # 一旦设置了这个权限,容器对我们挂载出来的内容就有限定了! docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
ro
:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!默认是使用
rw
来挂载的
八、 DockerFile
官方文档地址:https://docs.docker.com/engine/reference/builder/
1、 第一个dockerfile
我们先来自己写一个简单的DockerFIle来实操一下,先体验一下
-
创建工作目录
mkdir test cd test vim centos-dockerfile # 编辑我们的docker-file文件 -
编辑dockerfile文件
FROM centos # 拉取一个官方的centos镜像 MAINTAINER root<350051500050@qq.com> ENV MYPATH /usr/local # 设置环境变量 WORKDIR $MYPATH # 镜像的工作目录,进入镜像的初始目录 # volume 挂载卷,在创建容器时会自动挂载这些卷,匿名挂载 VOLUME ["volume01", "volume02"] # RUN: 镜像构建的时候需要运行的命令 RUN yum -y install vim # 新增 vim 工具 RUN yum -y install net-tools # 新增 网络 工具 有ifconfig命令 EXPOSE 80 # 开放的端口 CMD echo $MYPATH # CMD:容器启动的时候要运行的命令 CMD echo "-----end----" CMD /bin/bash 注意,在dockerfile中不能有注释,这里只是为了更好理解
-
编译
语法:
docker build -f "/root/test/centos-dockerfile" -t mycentos:1.0 . 注意,命令后面还有一个点,说明是当前目录下,其为上下文路径, 是指
docker
在构建镜像,有时候想要使用到本机的文件(比如复制),docker build
命令得知这个路径后,会将路径下的所有内容打包。发现出现了一个问题,这个问题是centos版本不匹配,可以拉取centos7,就可以运行成功了
-
启动容器
docker run -it mycentos /bin/bash 这两个卷是生成容器的时候自动挂载的
docker inspect 19104cb135e2 # 查看我们的容器的信息 这种方式未来使用的十分多,因为我们通常会构建自己的镜像!假设构建镜像的时候,没有挂载卷,需要手动挂载!
2、 多容器共享卷
docker run -it --name docker_share --volumes-from 19104cb135e2 mycentos:1.0
--volumes-from
:其为从指定容器装入卷 ,或者说指定一个容器,共享卷
我们使用:
docker inspect docker_share # 查看挂载卷的位置
发现两个挂载卷的主机挂载路径是一样的
其原理就是,多个容器,共享宿主机文件夹,可以使得多容器间数据的同步
多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7 # 第一个mysql docker run -d -p 3311:3306 --volumes-from mysql1 -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 mysql:5.7 # 第二个mysql
可以不使用
--volumes-from
这个参数,也可以直接挂载同一个主机目录下,但是这样效率较低
结论:容器之间配置信息的传递,数据卷的生命周期,一直持续到没有容器为止
但是,一旦持久化到了本地,这个时候,本地的数据是不会删除的!
3、 dockerfile构建过程
dockerfile编写步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub,阿里云镜像仓库)
我们先来查看一下官方镜像是如何构建的:
很多官方镜像都是基础包,很多功能没有,我们通常会自己构建自己的镜像,实现相应的功能!
4、 dockerfile构建命令
基础知识:
- 每个保留关键字都必须是大写字母
- 执行顺序从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,我们以后需要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单
开发部署的步骤:
- DockerFile:构建文件,定义了一切步骤,源代码
- DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
- DockerContainer:容器就是镜像运行起来提供服务的
构建常用指令
比较通俗的讲解
常用命令:
5、 命令详解
DockerHub中99%的镜像都是从这个基础镜像过来的FROM scratch
,然后配置需要的软件和配置进行构建
5.1 ENTRYPOINT
类似于 CMD
指令,但其不会被 docker run
的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT
指令指定的程序。
但是, 如果运行 docker run
时使用了 --entrypoint
选项,将覆盖 ENTRYPOINT
指令指定的程序。
优点:在执行 docker run
的时候可以指定 ENTRYPOINT
运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT
指令,仅最后一个生效。
格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
其可以配合CMD
命令使用
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到
docker run nginx:test -> nginx -c /etc/nginx/nginx.conf docker run nginx:test -c /etc/nginx/new.conf -> nginx -c /etc/nginx/new.conf 当不传入参数时,会以默认参数启动
5.2 ENV
置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
5.3 LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ... # 比如添加作者 LABEL org.opencontainers.image.authors="kun"
6、 实战:Tomcat镜像
-
准备镜像文件,Tomcat压缩包,jdk压缩包
cd test wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz -
编写dockerfile文件
可以先创建一个
readme.md
文件touch readme.md 创建
Dockerfile
其为官方命名,build会自动寻找这个文件,就不需要-f
指定了vim Dockerfile 编写文件
FROM centos:7 # 安装基础centos MAINTAINER kun<3500515050@qq.com> # 可以使用label标明 COPY readme.md /usr/local/readme.md # 复制帮助文档 ADD jdk-19_linux-x64_bin.tar.gz /usr/local/ # 添加压缩包,其会自动解压 ADD apache-tomcat-9.0.67.tar.gz /usr/local/ RUN yum -y install vim # 安装vim ENV MYPATH /usr/local # 配置工作目录 WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk-19 # 配置java环境 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.67 # 配置Tomcat环境 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 # 暴露8080端口 CMD /usr/local/apache-tomcat-9.0.67/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.67/bin/logs/catalina.out # 启动Tomcat的命令 -
构建镜像
docketr build -t diytomacat:test . # 创建镜像,dockerfile名字为官方规定的名字,不需要使用`-f`参数 docker images # 查看我们创建的镜像 -
启动镜像
docker run -d -p 8888:8080 --name mytomcat -v /root/build/tomcat/test:/usr/local/apache-tomcat-9.0.6/webapps/test -v /root/build/logs:/usr/local/apache-tomcat-9.0.6/logs diytomcat:test 使用数据卷进行日志文件和代码文件的同步
项目部署成功,可以直接访问就OK!
我们以后的开发步骤:
- 需要掌握Dockerfile的编写
- 我们之后都是使用docker镜像来发布运行的
7、 发布镜像
7.1 DockerHub
发布到DockerHub上面
-
首先我们需要去官网注册我们自己的DockerHub账号
-
确定这个账号可以登录
-
在我们的服务器上提交我们的镜像
-
登录账号
docker login -u user -p pwd # Login Succeeded -
提交我们的镜像
# docker tag 镜像id 你的账户名/镜像仓库名:tag名 docker tag 3a12f3d5b2a5 kun/diycomcat:0.1 # 打开标签 # docker push 作者/镜像:TAG(版本) docker push kun/diycomcat:0.1 自己发布的镜像,尽量带有版本号
-
7.2 阿里云
发布到阿里云仓库里面
-
首先,我们需要登录阿里云进入容器镜像服务
-
然后创建个人实例空间
-
然后创建个人仓库
-
创建完成后,提交我们的镜像
在我们注册好仓库后,会出现一个帮助文档,根据帮助文档操作就可以了
7.3 保存传输
还有一种docker发布的方式,就是打包发到通过文件进行传输
打包的方式:
# docker save 镜像 -o 文件名 docker save redis -o backup.tar
加载镜像的方式:
# docker load -i 文件名 docker load -i backup.tar
docker打包发布的全流程,其运行流程
本文来自博客园,作者:Kenny_LZK,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/16755364.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库