linux cpu占用率如何看
333
2022-10-22
Docker容器化技术实战操作汇总(附开发环境搭建)
Docker 概述
docker是什么:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
官网:服务器 A!服务器 B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker是内核级别的虚拟化,可以再一个物理机上运行很多个容器实例!服务器的性能可以被压榨到极致。
Docker的基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像—>run—>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub(默认是国外的)阿里云…都有容器服务器(配置镜像加速!)
♥ 注意:红色目录为一级目录 !
Docker 文章目录
Docker 概述
容器化技术Docker的优点Docker的基本组成
下载安装 Docker
环境检查下载安装
卸载 Docker配置阿里云镜像加速底层原理
回顾我们安装好执行的 helloWordDocker 是怎么工作的?Docker 为什么比VM快?
Docker的常用命令
帮助命令
Dcoker 版本信息查看Dcoker 系统信息查看
镜像命令
镜像查看镜像搜索下载镜像删除镜像
容器命令
新建容器并启动从容器退回主机列出所有运行中的容器删除容器启动容器停止容器
其他命令
查看日志查看容器中进程信息查看镜像的元数据进入当前正在运行的容器从容器内拷贝文件到主机上
容器数据卷
什么是数据容器卷?使用容器数据卷具名挂载匿名挂载
初识Dockerfile
数据卷容器DockerFileDockerFile构建过程DockerFile指令DockerFile实战测试列出本地进行的变更历史
发布自已的镜像
发布到Dcoker Hub发布到阿里云
开发必备(重要)
一.安装MySQL二.安装Redis三.安装Nginx四.安装Tomcat
下载安装 Docker
注意,这里博主使用的是阿里云服务器,大家如果不想购买的话可以自已搭建,
本文中的所有命令都是 root 用户来操作的,若是其他用户记得加上 sudo
环境检查
环境查看命令
uname -r
我们这里选用的系统内核应该是 3.10 以上的
系统版本命令
cat /etc/os-release
下载安装
官网下载地址:remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-enginerm -rf /etc/systemd/system/docker.service.drm -rf /var/lib/dockerrm -rf /var/run/docker
下载docker安装包
yum install -y yum-utils
设置镜像仓库,docker默认是国外的仓库
#阿里云镜像地址yum-config-manager \ --add-repo \ makecache fast
安装docker (docker-ce社区版 dcoker-ee企业版)
yum install docker-ce docker-ce-cli containerd.io
查看已安装的docker信息
docker version
启动docker服务
systemctl start docker
hello world!
docker run hello-world
查看一下下载的这个 hello-world 镜像
docker images
卸载 Docker
#1.卸载依赖yum remove docker-ce docker-ce-cli containerd.io#2.删除资源 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd #/var/lib/docker 的默认工作路径
卸载还是很容易的大家了解就可以了,在这就不进行演示了。
配置阿里云镜像加速
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["systemctl daemon-reloadsudo systemctl restart docker
没有报错就说明配置完成喽~
底层原理
回顾我们安装好执行的 helloWord
Docker 是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!DockerServer接收到Docker-Client的指令就会执行这个命令!
Docker 为什么比VM快?
所以说,新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用 宿主机的操作系统,省略了这个复杂的过程,秒级!
Docker的常用命令
帮助命令
万能的帮助命令
docker 命令 --help
Dcoker 版本信息查看
显示docker的版本信息,最好是启动 docker 服务后查看
docker version
Dcoker 系统信息查看
显示docker的系统信息,包括镜像和容器的数量
docker info
镜像命令
镜像查看
查看所有本地的主机上的镜像
docker images
这些列都是什么意思呢?不急下面我们逐一说明。
REPOSITORY镜像的仓库源TAG镜像的标签IMAGE ID镜像的idCREATED镜像的创建时间SIZE镜像的大小
这个命令还有两个常用可选项
镜像搜索
这个命令用于从Docker Hub查找镜像。
docker search 镜像名称
可选项,通过搜索来过滤
下载镜像
从Docker Hub下载镜像到本地。
docker pull 镜像名[:tag]
注意:tag是指定的版本,如果不写tag默认就是 latest(最新版)
Digest签名docker.io/library/mysql:latest真实地址
指定版本下载
删除镜像
删除指定镜像
docker rmi -f 镜像id
删除多个镜像
docker rmi -r 镜像id1 镜像id2 镜像id3
删除全部镜像(这里就涉及到 shell命令了感兴趣的可以查看文章:学妹面前装 “X” 必备,一篇文章教你学会Shell编程~)
docker rmi -r $(docker images -aq)
删除时最好通过id来删除保证唯一。这里演示一个就可以了,大家下去自行尝试吧 ~
容器命令
注意,我们要先有了镜像才可以创建容器。
新建容器并启动
docker run [可选参数] 镜像名
参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器-d 后台方式运行-it 使用交互方式运行,进入容器内查看内容-p 指定容器的端口 -p 8080:8080
从容器退回主机
直接容器停止并退出
exit
容器不停止退出
ctrl + p + q
列出所有运行中的容器
列出当前正在运行的容器
docker ps
可选参数
-a 列出当前正在运行的容器+历史运行过的容器-n=1 显示最近创建的一个容器-q 只显示容器的编号
可以看到现在没有在运行的容器,下面我们加上-a参数查看一下历史运行过的容器。
删除容器
删除指定的容器,不能删除正在运行的容器
docker rm 容器id
强制删除指定的容器,加上-f 参数即可
docker rm -f 容器id
删除所有的容器
docker rm -f $(docker ps -aq)
这里只演示了,根据id号删除指定(hello world)容器!
启动容器
后台启动容器,没有则创建
docker run -d 容器名|容器id
注意:docekr ps 发现容器停止了
说明:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
启动运行过的容器,需要先查看容器的id在根据id启动一个容器。
docker start 容器id
重启容器,和启动容器方法基本一致。
docker restart 容器id
停止容器
停止当前正在运行中的容器
docker stop 容器id
强制停止当前容器
docker kill 容器id
其他命令
查看日志
docker logs -tf --tail 10 容器id
可选参数
-tf 显示日志--tail number 显示日志条数
查看容器中进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前正在运行的容器
我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
第一种
docker exec -it 容器id /bin/bash
第二种
docker attach 容器id
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目标的主机路径
容器数据卷
什么是数据容器卷?
docker的理念回顾。将应用和环境打包成一个镜像!数据都在容器中,如果我们删除容器,数据就会丢失!需求:数据可以持久化,mysql数据可以存储在本地。容器之间可以有一个数据共享技术,docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面。
总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的!
使用容器数据卷
使用命令来进行挂载
docker run -dit -v 主机目录:容器内目录
启动成功后可以使用docker inspect 容器id 命令查看详细信息
测试文件的同步,我们现在宿主机上创建test.java文件
然后我们进入容器内查看文件是否存在
再次测试,停止容器,在宿主机上修改文件,启动容器,容器内的数据依旧是同步的
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
具名挂载匿名挂载
匿名挂载
docker run -d -P --name nginx01 -v /ect/nginx nginx
查看所有的volume的情况
docker volume ls
这个就是匿名挂载,我们在 -v 后只写了容器内的路径,没有写容器外的路径!
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
查看所有的volume的情况
具名挂载,通过 -v 卷名:容器内路径
查看卷
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 具名挂载
如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径 匿名挂载-v 卷名:容器内路径 具名挂载-v /宿主机路径:容器内路径 指定路径挂载
拓展
通过 -v 容器内路径:ro rw 改变读写权限
ro(readonly) 只读,只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。rw(readwrite) 可读可写。
一旦设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
初识Dockerfile
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!先体验一下!通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
数据卷容器
多个mysql同步数据
DockerFile
DcokerFile介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:编写一个dockerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像(DockerHub,阿里云镜像仓库)
我们来看一下官方是怎么做的
DockerFile构建过程
基础知识
每个保留关键字(指令)都必须是大写字母执行从上到下顺序执行#表示注释每一个指令都会创建一个新的镜像层,并提交。
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准,必须要掌握!步骤:开发,部署,运维。。。缺一不可DockerFile:构建文件,定义了一切的步骤,源代码DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品Docker容器:容器就是镜像运行起来提供服务的
DockerFile指令
以前的话我们都是使用别人的,现在我们知道了这些指令后,我们来练习自已写一个镜像!
指令 | 说明 |
FROM | 基础镜像,一切从这里开始构建 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 添加内容 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令。触发指令。 |
COPY | 类似ADD,将我们文件拷贝到镜像中 |
ENV | 构建的时候设置环境变量! |
CMD 和 ENTRYPOINT 区别
CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
# 编写dockerfile 文件[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim centostestFROM centosCMD ["ls","-a"]# 构建镜像[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f centostest -t cmdtest .# run运行,发现我们的ls -a命令生效[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar# 想追加一个命令 -l ls -al[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18 -ldocker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.ERRO[0000] error waiting for container: context canceled # cmd的情况下 -l 替换了CMD["ls","-a"]命令,-l 不是命令所以报错!
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
# 编写dockerfile 文件[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim dockerfile-cmd-entoryFROM centosENTRYPOINT ["ls","-a"]# 构建镜像[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f dockerfile-cmd-entory -t dockeren .# 我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面![root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ffdaffe72ed2 -ltotal 56drwxr-xr-x 1 root root 4096 Mar 31 01:06 .drwxr-xr-x 1 root root 4096 Mar 31 01:06 ..-rwxr-xr-x 1 root root 0 Mar 31 01:06 .dockerenvlrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bindrwxr-xr-x 5 root root 340 Mar 31 01:06 devdrwxr-xr-x 1 root root 4096 Mar 31 01:06 etcdrwxr-xr-x 2 root root 4096 Nov 3 15:22 homelrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/liblrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64drwx------ 2 root root 4096 Dec 4 17:37 lost+founddrwxr-xr-x 2 root root 4096 Nov 3 15:22 mediadrwxr-xr-x 2 root root 4096 Nov 3 15:22 mntdrwxr-xr-x 2 root root 4096 Nov 3 15:22 optdr-xr-xr-x 96 root root 0 Mar 31 01:06 procdr-xr-x--- 2 root root 4096 Dec 4 17:37 rootdrwxr-xr-x 11 root root 4096 Dec 4 17:37 runlrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Nov 3 15:22 srvdr-xr-xr-x 13 root root 0 Mar 29 05:51 sysdrwxrwxrwt 7 root root 4096 Dec 4 17:37 tmpdrwxr-xr-x 12 root root 4096 Dec 4 17:37 usrdrwxr-xr-x 20 root root 4096 Dec 4 17:37 var
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后进行测试效果!
DockerFile实战测试
Docker Hub 中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自已的centos
编写Dockerfile的文件
FROM centos # 基础镜像MAINTAINER yl<1903838739@qq.com> # 作者和邮箱ENV MYPATH /usr/local # 设置环境变量WORKDIR $MYPATH # 设置工作目录#下载相关依赖,默认下载的centos镜像是不支持vim和ifconfig指令的,下载了这两个依赖就可以运行vim和ifconfig指令RUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 # 暴露端口CMD echo $MYPATHCMD echo "---end---"CMD /bin/bash # 容器启动时进入/bin/bash目录
通过这个文件构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag]
docker build -f mycentos -t mzccentos:0.1 .
mycentos 是文件名,如果不在文件所在文件夹路径下就要写全路径,mzccentos是自己的镜像名,0.1是版本号,注意后面还有个.不能省略。
测试运行
docker run -it mzccentos:0.1
到这我们自已手写的dockerfile就运行起来了。
列出本地进行的变更历史
docker history 容器id
发布自已的镜像
发布到Dcoker Hub
前往Docker Hub官网注册账号确保可以登录
官网:login -u用户名 回车后输入密码
修改镜像名称(命名规则 DockerHub用户名/镜像名:版本号)
注意:如果不修改后续push时可能会出现异常
在我们服务器上提交自已的镜像
docker push 镜像名
前往Docker Hub 查看
发布到阿里云
登录阿里云并搜索容器镜像服务
创建命名空间
创建容器镜像
浏览阿里云
5. 推送
#登录阿里云docker login --username=周周class registry.cn-zhangjiakou.aliyuncs.com#修改镜像名docker tag [ImageId] registry.cn-zhangjiakou.aliyuncs.com/mzcck/mzc-java:[镜像版本号]#推送镜像到阿里云docker push registry.cn-zhangjiakou.aliyuncs.co
docker rm -f $(docker ps -aq)
一.安装MySQL
这里我们演示Docker安装MySQL 5.7并挂载数据及配置文件
获取镜像
docker pull mysql:5.7
数据挂载,配置密码,并运行容器
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
参数解释:-d 后台运行 -p 端口映射 -v 挂载卷 -e 环境配置 --name 容器名称
通过本地Navicat工具连接MySQL
新建数据库测试挂载是否有问题
新建后发现,我们挂载到本地的data目录下已经有了最新创建的数据库信息,即使删除镜像我们挂载到本地的数据库卷依旧不会丢失,这就实现了容器数据持久化功能!
二.安装Redis
Docker安装redis,挂载外部配置和数据
从dockerHub拉取镜像到本地
docker pull redis
创建目录(宿主机)
配置文件目录(在该目录下放置 redis.conf配置文件,目录可以自定义)
mkdir -p /home/redis/conf
数据目录
mkdir -p /home/redis/data
启动容器,加载配置文件并持久化数据
docker run -d --privileged=true -p 6379:6379 --restart always -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data --name myredis redis redis-server /etc/redis/redis.conf --appendonly yes
参数解释:
-d 以守护进程的方式启动容器--privileged=true 提升容器内权限-p 6379:6379 绑定宿主机端口--restart always 开机启动-v /home/redis/conf/redis.conf 映射配置文件-v /home/redis/data 映射数据目录--name myredis 指定容器名称--appendonly yes 开启数据持久化
使用redis客户端连接测试(redis没有设置用户名和密码,直接通过ip与端口即可连接)
添加数据测试挂载是否生效
到此,我们的redis安装挂载也没问题了
三.安装Nginx
Docker安装 nginx并挂载宿主机目录到容器中
下载 nginx 镜像(这里直接拉最新版,大家可以根据需要下载对应的版本)
docker pull nginx
在宿主机创建挂载目录
日志目录
mkdir /home/nginx/log
配置文件目录
mkdir /home/nginx/conf
项目位置
mkdir /home/nginx/html
启动镜像并完成对应的挂载与配置
docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/html:/usr/share/nginx/html nginx
注意:这里虽然启动成功了但是少挂载了 nginx.conf 配置文件,因为直接挂载会报错所以我们按照下方操作来
上面容器启动成功后我们先进入容器docker exec -it 容器id /bin/bash进入容器后找到 nginx.conf文件的位置。cd /etc/nginx,注意查看文件是否存在。退出容器 exit
docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/usr/share/nginx/html nginx
参数解释:
-d 以守护进程的方式启动容器--name myredis 指定容器名称-p 80:80 绑定宿主机端口
到此我们 nginx挂载并运行已经完成了
四.安装Tomcat
下载tomcat镜像,这里依旧采用最新版
docker pull tomcat
启动镜像
docker run --name tomcat -itd --privileged=true --rm -v /home/tomcat/webapp:/usr/local/tomcat/webapps/webapp -p 8080:8080 tomcat
参数说明:
--name tomcat 创建容器名称为tomcat--privileged=true允许镜像挂载映射本地目录-p 8081:8080 端口映射-v 数据卷挂载-itd 以后台守护进程启动容器tomcat tomcat镜像名
我们访问测试发现报404
让我们进入容器中一探究竟
docker exec -it 容器id /bin/bash
进来后我们发现webapp下没有东西。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉,保证最小可运行的环境。
解决方案:
cp -r webapps.dist/* webapps
再次测试:
大功告成。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~