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可以隔离不同应用程序之间的相互影响。
1.3、docker 和 VM ware的差异虚拟机技术:
- 在一个操作系统之上,安装运行另外一种操作系统。
- 需要虚拟出硬件、运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 占用资源比较多、步骤冗余繁杂、启动很慢
docker容器:
-
将软件运行所需要的资源打包到一个隔离的容器,直接运行在宿主机上,容器本身是没有自己的内核的,也没有虚拟硬件。
-
docker是内核级别的虚拟化,可以在一个物理机上运行很多容器的实例,每个容器之间相互隔离、有自己的文件系统、互不影响,使得服务器的性能发挥到极致。
-
镜像(Image)
-
镜像好比是一个模板,一个镜像可以创建出来很多个容器实例;
-
类似于Java语言中类和对象的概念,即一个类可以实例化出来多个对象。
-
-
容器(Container)
-
独立运行的一个或一组应用, 是由镜像实例化出来的;
-
它可以被启动、开始、停止、删除。每个容器都是相互隔离的
-
-
仓库(Repository)
- 一个集中存放镜像文件的地方,每个仓库包含多个镜像,每个镜像有不同的标签(‘tag’: 类似于版本号)
- 仓库种类有私有仓库和公有仓库之分,Docker Hub:(https://hub.docker.com/)是最大的公有仓库
前期环境准备:本人购买的是阿里云的1核2G的服务器,具体操作及介绍见博文:https://blog.csdn.net/weixin_43155804/article/details/122813771
- 查看Linux系统版本命令: uname -r
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# uname -r 3.10.0-1062.18.1.el7.x86_64 # 系统内核版本为3.10.0
- 查看系统配置: cat /etc/os-release
[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软件包索引
yum makecache fast
- 安装docker
# docker-ce为社区版,docker-ee为企业版 # 该命令默认为安装最新版本 yum install docker-ce docker-ce-cli containerd.io # 如果想要安装指定版本: yum install docker-ce-<版本号> docker-ce-cli-<版本号> # 安装成功会出现 completed提示
- 启动docker
systemctl start docker # 查看当前版本号,验证是否启动成功: docker version
- 下载hello-world镜像进行测试
docker run hello-world
- 查看所下载的镜像
docker images
- docker卸载
# 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 2. 删除资源 /var/lib/docker是docker的默认工作路径 rm -rf /var/lib/docker
- docker重启
systemctl restart docker3、配置阿里云镜像加速
- 登录阿里云官网,找到镜像加速服务栏: https://cr.console.aliyun.com/cn-beijing/instances/mirrors
- 在控制台依次执行一下四条命令,完成配置
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
4、docker run 的运行流程:
4.1、hello-world 运行整体流程
- 首先会在本机中寻找:hello-world的镜像:
- 没有在本机找到:Unable to find image hello-world locally
- 从远程进行下载:pulling from library…
- 下载完毕:pull compelte
- 运行成功:hello from docker!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETbIgH8Z-1652287080144)(E: 2-学习笔记笔记图片docker1-docker run的运行步骤.png)]
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,Docker Server(服务器)接收到Docker-Client (客户端) 的指令,就会执行这个指令。docker容器之间相互隔离,互不影响。
4.4、Docker VS VM Ware-
Docker比虚拟机更少的抽象层
-
docker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机则是需要加载Guest OS,虚拟机的这一操作便导致其启动为分钟级别的速度。
5、docker的常用命令 5.1 帮助命令docker version # 显示docker的版本信息 docker info # 显示docker的信息 包括镜像和容器数量 docker --help # 帮助命令
可以通过docker的帮助文档查看:https://docs.docker.com/reference/
5.2 常用镜像命令- docker images 查看本地主机上的所有镜像
[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 镜像名 搜索镜像
# 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 镜像名 下载镜像
# 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 镜像删除
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,并作为参数,传递给 -f5.3 常用容器命令
说明:有了镜像之后才能创建容器,下载一个centos镜像来进行学习
- 下载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 # 强制停止当前容器5.4 常用的其他命令:
- 查看日志命令
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:容器内文件路径 目的路径6、练习 6.1 nginx 部署
- 搜素镜像
# 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: 2-学习笔记笔记图片dockerdocker概念介绍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:3344Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
[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部署完成 !
6.2 tomcat部署- 使用docker run命令下载
docker run 时会自动帮助下载 无需通过search进行搜索 再pull
- 官方使用:
docker run -it --rm tomcat:9.0 之前启动都是后台启动,停止之后,容器还是可以查到,--rm一般用来测试,用完就删除 使用docker ps -a查看记录 没有找到启动tomcat的记录 # 前期学习不建议这么做,还是老老实实的通过pull来进行下载吧
- 下载并运行tomcat镜像
# 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界面
- 阿里云设置安全组 3355,通过外部公网访问,发现404错误 :
导航栏中已经显示出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#
刷新公网的访问路径,之后,显示可以成功访问:
- 内部通过curl访问:
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# curl localhost:3355
Apache Tomcat/10.0.14
Apache Tomcat/10.0.14
Copyright ©1999-2022 Apache Software Foundation. All Rights Reserved
至此,tomcat 部署完成!
6.3、ElasticSearch部署- 安装运行命令
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 stats6.4、问题思考
- 在进行nginx配置时,每次改动nginx的配置文件,都需要通过虚拟机进入到容器内部进行操作,这无疑十分麻烦。
- 同样的,在部署tomcat时,还需要去webapps.dist目录拷贝内容到webapps,每次进入容器也比较繁琐。
- 上述两个问题,如果能在容器外部提供一个映射路径供我们直接访问,修改岂不美哉!
这一问题,通过后面学习docker容器数据卷技术,会得到一个很好的解决。
快速入门篇内容到此结束,多思考、多练习,掌握基本命令。



