赞
踩
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,即相互隔离。
官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
镜像库地址:https://hub.docker.com/
一个完整的Docker有以下四个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
在开发过程中,项目开发所依赖的环境完全是OK的,将项目的jar包或者war包交付给运维人员时,前提是另一台机器的环境配置也是ok的,如果每一台机器在运行程序之前都需要单独配置环境,工作量之大不言而喻。
传统的项目部署模式: 安装—配置—运行;
Docker的部署模式:复制 — 运行;
1、交付标准化
正如docker的logo一样,Docker是软件工程领域的“标准化”交付组件,像是运输货物的集装箱一样。众所周知,集装箱能够将大小不一,不易搬运的物品封装成一个整体,它提供了一种通用的封装货物的标准,卡车、火车、货轮等运输工具采用这一标准,使得以集装箱为中心的标准化设计大大提高了物流运输的效率。
传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。Docker的标准化交付物称为“镜像”,它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
2、一次构建,多次交付
Docker镜像可以做到“一次构建,多次交付”。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。
一次构建,到处运行,这也是docker的理念;
3、应用隔离
在运输的过程中,货物之间可以通过集装箱做到有效的隔离。同样的Docker可以隔离不同应用程序之间的相互影响。
虚拟机技术:
docker容器:
将软件运行所需要的资源打包到一个隔离的容器,直接运行在宿主机上,容器本身是没有自己的内核的,也没有虚拟硬件。
docker是内核级别的虚拟化,可以在一个物理机上运行很多容器的实例,每个容器之间相互隔离、有自己的文件系统、互不影响,使得服务器的性能发挥到极致。
镜像(Image)
镜像好比是一个模板,一个镜像可以创建出来很多个容器实例;
类似于Java语言中类和对象的概念,即一个类可以实例化出来多个对象。
容器(Container)
独立运行的一个或一组应用, 是由镜像实例化出来的;
它可以被启动、开始、停止、删除。每个容器都是相互隔离的
仓库(Repository)
前期环境准备:本人购买的是阿里云的1核2G的服务器,具体操作及介绍见博文:https://blog.csdn.net/weixin_43155804/article/details/122813771
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
# 系统内核版本为3.10.0
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# 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"
安装docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
# 设置国外的地址(下载速度太慢)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 设置阿里云的Docker镜像仓库(推荐使用,下载速度较快)
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
# docker-ce为社区版,docker-ee为企业版
# 该命令默认为安装最新版本
yum install docker-ce docker-ce-cli containerd.io
# 如果想要安装指定版本:
yum install docker-ce-<版本号> docker-ce-cli-<版本号>
# 安装成功会出现 completed提示
systemctl start docker
# 查看当前版本号,验证是否启动成功:
docker version
docker run hello-world
docker images
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
systemctl restart docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://h98xb7ko.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETbIgH8Z-1652287080144)(E:\02-学习笔记\笔记图片\docker\1-docker run的运行步骤.png)]
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,Docker Server(服务器)接收到Docker-Client (客户端) 的指令,就会执行这个指令。docker容器之间相互隔离,互不影响。
Docker比虚拟机更少的抽象层
docker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机则是需要加载Guest OS,虚拟机的这一操作便导致其启动为分钟级别的速度。
docker version # 显示docker的版本信息
docker info # 显示docker的信息 包括镜像和容器数量
docker --help # 帮助命令
可以通过docker的帮助文档查看:https://docs.docker.com/reference/
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 4 months ago 13.3kB centos latest 5d0da3dc9764 5 months ago 231MB # 字段解释: REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像创建的时间 SIZE 镜像的大小 # 通过docker images --help 可以查看该命令的详细使用 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images --help Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] List images Options: -a, --all # 显示所有镜像 -f, --filter filter # 通过条件进行过滤显示 -q, --quiet # 只显示镜像的ID
# docker search 镜像名
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter # 根据条件来筛选
--filter=STARS=500 # 按照STARS来筛选,筛选出数量在500之上的,这里并不是找出STARS等于500的
# docker pull 镜像名 --下载镜像 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull mysql # 下载mysql Using default tag: latest # 如果命令中不写tag值,默认下载最新版本latest latest: Pulling from library/mysql # docker images的核心:分层下载 72a69066d2fe: Pull complete 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 docker.io/library/mysql:latest #真实地址 # 下载指定版本:(前提是 指定的版本必须先存在于docker中) docker pull mysql:5.7 由于docker images有分层下载,上面已经下载过mysql的最新版本,此处下载5.7版本的时候,由于有和最新版本公用的地方,在这次下载中直接显示为Already exists。5.7所独有的东西会被下载。
docker rmi # rm 删除 i镜像(image)
docker rmi -f 条件 # 根据条件进行删除
# 批量删除
docker rmi -f 容器id # 删除指定id的镜像
docker rmi -f 容器id 容器id 容器id # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
# $(docker images -aq)表示显示所有的image的ID,并作为参数,传递给 -f
说明:有了镜像之后才能创建容器,下载一个centos镜像来进行学习
docker pull centos
# 启动: docker run [可选参数] 镜像名字 #参数说明 --name="Name" #容器名字 用来区分容器 -d # 后台方式运行 -it # 使用交互方式运行,进入容器查看内容 -p # 指定容器的端口 -p8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用) -p 容器端口 # 启动并进入容器内部 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it centos /bin/bash [root@208950ad49e7 /]# ls 查看容器内的centos,基础版本很多命令都是不完善的 bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr # 从容器中退回主机 [root@208950ad49e7 /]# exit 退出镜像服务器
#docker ps
docker ps # 当前正在运行的容器
-a # 列出在当前正在运行的容器,+历史运行过的容器
-n=2 #显示最近创建的2个容器(最近的)
-q #只显示容器的编号
exit # 容器停止并退出
ctrl+p+q # 容器不停止,退出
docker rm 容器id # 删除指定id的容器(正在运行的容器删除不了)
docker rm -f # 可以强制性删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除全部容器
docker ps -a -q|xrags docker rm #先查询出所有的容器id,用管道符传递给|后面的语句,进行全部删除
docker start 容器id #启动容器
docker restart 容器id # 重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
docker logs [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker logs --help Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a container Options: --details Show extra details provided to logs -f, --follow #显示日志 --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) -n, --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps # 显示时间戳 --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) # docker logs -tf #显示日志 --tail 10 #显示10条日志
# docker top 容器id
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker top 6289e8425a39
UID PID PPID C STIME TTY TIME CMD
root 29143 29125 0 22:37 pts/0 00:00:00 /bin/bash
# docker inspect 容器id
通常,容器是使用后台方式运行的,需要进入容器,修改一些配置
# 方式1
docker exet -it 容器id
# 方式2
docker attach 容器id
区别:
# docker exec 进入容器后没开启一个新的终端,可以在里面操作,是常用的进入命令
# docker attach 进入容器正在执行我的终端,不会启动新的进程
# 命令
docker cp 容器id:容器内文件路径 目的路径
# docker search nginx
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16754 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 165
bitnami/nginx Bitnami nginx Docker Image 125 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 48
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 18 [OK]
rancher/nginx-ingress-controller 10
# docker pull nginx 下载最新版本
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# docker images
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 4 months ago 141MB
centos latest 5d0da3dc9764 7 months ago 231MB
# docker run -d --name 别名 -p 主机端口:容器端口 镜像名字
# -d # 后台运行
# -- name # 起名字
# -p 主机端口:容器端口 # 端口映射
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
d1e7b7a311bb2f8cd2033b1329178882c453b1ab308afa577c50e21d99fce745
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDuPFkdt-1652287080146)(E:\02-学习笔记\笔记图片\docker\docker概念介绍\8.3 端口暴露.png)]
# docker ps
# docker ps -a # 所有运行的镜像,包括历史运行的
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1e7b7a311bb nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 0.0.0.0:3344->80/tcp nginx01
# curl localhost:3344 可以通过本地查看运行状态、 # 通过公网查看: 虚拟机ip:映射端口 # 当访问出现错误时,需要登录阿里服务器控制台,添加334的安全组 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# 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> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
配置阿里云安全组,通过公网访问的结果:
访问路径为:http://服务器的ip地址:暴露的端口,便能够成功访问到nginx。
# 进入容器,进行自定义配置文件
# docker exec -it 给容器起的别名 /bin/bash 进入容器后台
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it nginx01 /bin/bash
# 查看 nginx 所在的目录
root@d1e7b7a311bb:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 进入nginx所在的目录
root@d1e7b7a311bb:/# cd /etc/nginx
# 查看目录中文件列表
root@d1e7b7a311bb:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
至此,nginx部署完成 !
docker run 时会自动帮助下载 无需通过search进行搜索 再pull
docker run -it --rm tomcat:9.0
之前启动都是后台启动,停止之后,容器还是可以查到,--rm一般用来测试,用完就删除
使用docker ps -a查看记录 没有找到启动tomcat的记录
# 前期学习不建议这么做,还是老老实实的通过pull来进行下载吧
# 1、docker pull tomcat # 下载tomcat镜像 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 6494e4811622: Already exists 668f6fcc5fa5: Already exists dc120c3e0290: Already exists 8f7c0eebb7b1: Already exists 77b694f83996: Already exists 0f611256ec3a: Already exists 4f25def12f23: Already exists Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest # 2、docker images 查看本地所有镜像 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 4 months ago 141MB tomcat latest fb5657adc892 4 months ago 680MB hello-world latest feb5d9fea6a5 7 months ago 13.3kB centos latest 5d0da3dc9764 7 months ago 231MB # 3、docker run -d -p 3355:8080 --name tomcat01 tomcat 运行 [root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat 3e7fc95c278a15b8dbe8e0773089cbe6ede11da07ccb7b4d3718e73de7146a57 # 进入tomcat01中: docker exec -it tomcat01 /bin/bash/ # 进入之后发现,在外部访问:http://39.107.241.179:3355,显示404错误,表示没有加载到资源 # 进入tomcat01中,发现webapps目录为空,webapps.dist文件夹中包括访问所需内容, # 在tomcat01中,将webapps.dist中的内容拷贝到webapps中: cp -r webapps.dist/* webapps 随后刷新之后,便可通过外部访问tomcat界面
导航栏中已经显示出tomact的图标,但是界面出现404,证明目前通过公共外网是可以访问到tomcat的,只是没有加载到资源,进入镜像容器内查看tomcat配置文件
# docker exec -it tomcat01 /bin/bash
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it tomcat01 /bin/bash
root@3e7fc95c278a:/usr/local/tomcat# ls #查看容器中的文件
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@3e7fc95c278a:/usr/local/tomcat# cd webapps # 进入webapps目录,ls查看列表,发现目录中没有文件,是空的
root@3e7fc95c278a:/usr/local/tomcat/webapps# ls
root@3e7fc95c278a:/usr/local/tomcat/webapps# cd .. # 返回上一级
root@3e7fc95c278a:/usr/local/tomcat# cd webapps.dist # 查看webapps.dist发现该目录中存放着tomcat的相关文件
root@3e7fc95c278a:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
通过进入容器内部,发现容器中的文件少了,是因为:阿里云镜像默认下载的是最小的镜像,保证最小的运行环境。
将webapps.dist目录下的文件拷贝到webapps目录中
# 将webapps.dist目录下的所有内容,拷贝到webapps中
root@3e7fc95c278a:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@3e7fc95c278a:/usr/local/tomcat# cd webapps
root@3e7fc95c278a:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@3e7fc95c278a:/usr/local/tomcat/webapps#
刷新公网的访问路径,之后,显示可以成功访问:
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# curl localhost:3355 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Apache Tomcat/10.0.14</title> <link href="favicon.ico" rel="icon" type="image/x-icon" /> <link href="tomcat.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <div id="navigation" class="curved container"> <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span> <span id="nav-hosts"><a href="/docs/">Documentation</a></span> <span id="nav-config"><a href="/docs/config/">Configuration</a></span> <span id="nav-examples"><a href="/examples/">Examples</a></span> <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span> <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span> <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span> <br class="separator" /> </div> <div id="asf-box"> <h1>Apache Tomcat/10.0.14</h1> </div> <p class="copyright">Copyright ©1999-2022 Apache Software Foundation. All Rights Reserved</p> </div> </body> </html>
至此,tomcat 部署完成!
docker run -d --name elasticsearch02 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:8.2.0
ES所占用的内存很高,由于学习所用服务器为1核2G的,ES在启动之后内存占用率太高,会导致虚拟机很卡顿,可以stop之后,
在docker run时,添加 **-e ES_JAVA_OPTS=“-Xms64m -Xmx512m”**修改页面配置参数,类似于在IDEA的配置文件中修改,
Xms:最小占用64m,Xmx最大占512m
docker run -d --name elasticsearch02 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:8.2.0
docker stats
这一问题,通过后面学习docker容器数据卷技术,会得到一个很好的解决。
快速入门篇内容到此结束,多思考、多练习,掌握基本命令。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。