此教程基于【编程不良人】2021年最新Docker容器技术&Docker-Compose实战教程,哔哩哔哩链接:https://www.bilibili.com/video/BV1ZT4y1K75K?p=1
官方文档地址:https://docs.docker.com/get-started/
中文文档地址:https://vuepress.mirror.docker-practice.com/
目前docker开发了mac和windows版本的桌面管理工具(Linux还未开发,只能使用命令的方式进行安装docker),我们直接下载安装即可
1.前往官网下载,https://docs.docker.com/get-docker/ ,选择对应你版本的docker
2.在弹出的界面点击 docker desktop for windows
3.下载完成后双击运行安装即可。注意,安装完成后会进行重启的操作。
注意:安装桌面版的windows必须启用 Hyper-V
,详情可以查看官网:https://docs.docker.com/desktop/windows/install/
1.前往官网,https://docs.docker.com/get-docker/ ,选择对应你需要安装的docker版本,
2.选择对应你的linux平台
3.之后会弹出一个界面叫你如何详细的进行安装,也可以参考下面的方法进行安装,或者直接通过bash进行安装(详情请看下方)
注意:docker只能安装在centos7或centos8的版本,没有安装Linux虚拟机的可以先去看我的其他博客,
点击前往
1.我们首先输入(在linux命令终端中粘贴的快捷键为 shift + insert)
curl -fsSL https://get.docker.com -o get-docker.sh
2.接着输入
sudo sh get-docker.sh --mirror Aliyun
3.之后等待安装成功即可,安装成功界面如下:
注意:此处使用的虚拟机软件是VMware,安装的linux版本为centos 7.9(没有虚拟机基础的可以先去了解相关知识,推荐韩顺平的lunux教程)
4.之后就是启动docker的操作了,我们先输入 systemctl status docker
查看docker状态,发现是dead
(停止)状态
5.之后启动docker,我们输入systemctl start docker
,
6.再次查看状态,我们输入 systemctl status docker
,发现docker已经处于运行状态
7.我们输入 docker info
可以查看docker引擎版本,我们发现,docker引擎是分为客户端和服务端的,是一个C/S架构,客户端就是用来书写我们的命令,服务端用来运行我们的命令
8.配置docker开机自启动,我们输入 systemctl enable docker
9.同时docker还建议我们将docker放入docker组里,我们输入 sudo groupadd docker
创建一个docker组,sudo表示以管理员身份执行命令
10.之后我们输入 sudo usermod -aG docker $USER
,表示将当前用户放入docker组,
11.之后重启docker即可,我们输入 systemctl restart docker
,
1.我们可以前往docker的远程仓库下载我们所需要的镜像,https://registry.hub.docker.com/ ,如我们想要下载mysql的镜像,我们直接搜索即可
2.之后会显示对应的镜像信息,
3.我们点击进入mysql镜像详情页,查看相关信息
4.如我们需要下载mysql8.0.23版本镜像,我们输入 docker pull mysql:8.0.23
即可进行下载(需要docker远程仓库拥有这个镜像)
1.我们首先登录阿里云,找到“容器镜像服务”
2.之后选择对应你的操作系统,
3.执行代码,
4.之后输入 docker info
查看dcoker信息,我们发现docker中已经有了我们的阿里云镜像加速地址
当我们本地没有hello-world镜像时,输入 docker run hello-world
命令会发生什么?
1.查看docker引擎以及docker帮助命令
docker info
用来展示docker信息、版本等
docker versiobn
主要用来查看docker客户端和服务端的版本号,
docker --help
或 docker
查看docker所有帮助命令
2.操作镜像images的相关命令
docker images
查看本地仓库中存在哪些镜像,其中镜像id只显示了一部分
docker images -a
表示列出本地所有镜像,等同于 docker images
docker images -q
表示只显示镜像id
如果我们要查看某个镜像的所有版本,如mysql,可以输入 docker images mysql
3.拉取镜像
docker pull 镜像名称:版本号
拉取镜像,如docker pull mysql:8.0.23
或者
docker pull 镜像名:DIGEST@摘要
拉取镜像,如
docker pull mysql:DIGEST@sha256:355617769102e9d2ebb7d5879263a12d230badb7271c91748b2c7b0ac6971083
摘要的查看方式:
1.找到你要下载的镜像版本
2.查看该镜像的摘要
4.通过命令行搜索镜像
docker search mysql
不通过dockerhub,而是通过命令行搜索需要镜像
5.删除镜像
docker image rm 镜像名:tag 或 镜像名:镜像id
删除镜像,如果tag不写或镜像id不写,则默认就是最新的,即latest
docker image rm -f 镜像名:tag 或 镜像名:镜像id
强制删除镜像,即使当前镜像正在容器中运行,注意:此操作会把镜像和容器都删除掉
同时我们也可以简写:
docker rmi 镜像名:tag 或 镜像名:镜像id
删除镜像,如果tag不写或镜像id不写,则默认就是最新的,即latest
docker rmi -f 镜像名:tag 或 镜像名:镜像id
强制删除镜像,即使当前镜像正在容器中运行,注意:此操作会把镜像和容器都删除掉
删除本地所有镜像
如果需要删除与mycentos7相关的镜像,可以输入 docker rmi -f $(docker images mycentos7 -aq)
如果我们忘记后面的具体命令可以输入 docker image --help
查看帮助文档
1.导入镜像
docker load -i 导入的tar镜像文件名
将tar镜像文件导入到本地仓库
2.运行镜像
docker run 镜像名:tag 或 镜像名:镜像id
通过镜像运行一个容器
如我们运行tomcat, 输入 docker run tomcat:8.0-jre8
,但我们一般不这么运行,因为docker中容器是进程级别的隔离,我们外部不能访问到容器内,所以,我们要指定端口的映射
docker run -p 宿主机端口:容器内端口 镜像名:tag 或 镜像名:镜像id
通过镜像运行一个容器,宿主机端口与容器中端口镜像映射
如docker run -p 8080:8080 tomcat:8.0-jre8
,表示将宿主机中的8080与容器中的8080端口镜像映射,这样我们就可以通过8080端口访问到容器内的8080端口.
如果一个容器内部监听了多个端口,则可以指定多个端口映射,如 docker run -p 8080:8080 -p 8081:8888 tomcat:8.0-jre8
1.我们输入docker pull tomcat:8.0-jre8
进行拉取镜像,之后输入 docker run tomcat:8.0-jre8
进行运行tomcat容器,
2.之后我们查看本地ip地址,linux查看本机ip可以输入 ifconfig
进行查看
3.我们发现并不能访问容器中监听的8080端口
4.我们重新运行,输入 docker run -p 8080:8080 tomcat:8.0-jre8
,发现已经可以访问容器内监听的端口
5.同时,我们可以根据此镜像运行多个容器,由于docker中容器与容器之间是进程级隔离的,他们不会互相影响。如我们输入 docker run -p 8081:8080 tomcat:8.0-jre8
再启动一个容器,用外部的8081端口映射容器中的8080端口
注意:开启端口映射了宿主机器还是无法访问容器内的端口
可能防火墙隔离了,查看防火墙状态,firewall-cmd --state
之后关闭防火墙,systemctl stop firewalld.service
禁止防火墙开机启动,systemctl disable firewalld.service
防火墙开机启动,systemctl start firewalld
防火墙开放端口号,firewall-cmd --add-service=http –permanent,如我们要开启8001端口:firewall-cmd --add-port=8001/tcp --permanent
重启防火墙,firewall-cmd --reload
查看开放的端口号,firewall-cmd --list-all
注意开启某个端口后要重启防火墙才能生效
3.查看运行的镜像
docker ps
查看当前运行的容器
docker ps -q
返回当前运行的容器id
docker ps -a
查看所有的容器(运行和未运行的)
docker ps -qa
返回所有的容器id(运行和未运行的)
4.启动容器
docker run -p 宿主机端口:容器内端口 -d(后台启动)镜像名:tag 或 镜像名:镜像id
启动容器,映射端口,后台启动,会返回一个运行的容器id(完整的)
docker run -p 宿主机端口:容器内端口 -d(后台启动) --name 容器名称 镜像名:tag 或 镜像名:镜像id
启动容器,指定容器名字,映射端口,后台启动,会返回一个运行的容器id(完整的)
docker start | restart | stop | kill 容器名字或容器id
启动|重启|正常停止|立即停止 容器
1.删除容器
docker rm 容器名称或容器id
删除已经停止的容器
docker rm -f 容器名称或容器id
删除容器(不管容器是否运行)
docker rm -f $(docker ps -aq)
删除所有的容器
2.查看容器内服务运行日志
docker logs 容器名称|容器id
查看日志
docker logs -f 容器名称|容器id
日志实时展示
docker logs -t 容器名称|容器id
日志加入时间戳
docker logs -tf 容器名称|容器id
日志加入时间戳,实时展示
docker logs --tail 5 容器名称|容器id
显示日志尾部的5行
3.查看容器内的进程
top
查看操作系统的进程
docker top 容器名称|容器id
查看容器内进程
4.与容器内部进行交互
docker exec -it 容器名称|容器id bash
进入容器,与容器内的命令终端进行交互(每个容器都是操作系统层面的进程隔离,都有其自己的终端,进入一个容器相当于进入一个新的操作系统,只不过这个操作系统非常精简,bash表示进入容器内的命令行模式)
exit
退出容器
5.操作系统与容器的传输文件
docker cp 容器名称|容器id:容器内资源路径 操作系统中路径
从容器复制文件到操作系统(目录也可以进行拷贝)
如我们要复制tomcat容器内的webapps到宿主机上,首先进入容器,之后复制容器id
之后另开一个连接,输入 docker cp 容器名称|容器id:容器内资源路径 操作系统中路径
docker cp 文件 或目录 容器名称|容器id:容器内资源路径
从操作系统复制文件到容器
如将宿主机的aa.txt复制到tomcat容器的usr/local/tomcat路径下
我们可以将本地的javaweb项目部署到docker的tomcat容器下进行运行(springboot项目要先排除内置的tomcat)
1.首先我们进入ideal创建一个maven项目,
2.之后输入项目的基本信息后点击next
3.创建好项目后引入在pom.xml中引入servlet-api依赖
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
4.之后新建一个TestServlet,并继承HttpServlet,重写service方法,
package com.demo.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("当前项目已经被访问。。。。。");
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}
5.之后在web.xml配置中书写映射,
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
<servlet>
<servlet-name>testservlet-name>
<servlet-class>com.demo.servlet.TestServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>testservlet-name>
<url-pattern>/testurl-pattern>
servlet-mapping>
web-app>
6.之后打包,并上传到linux对应的目录下
7.之后进入tomcat容器,复制webapps的目录
8.将上传的war包复制到对应的tomcat容器内
9.查看tomcat实时日志,发现tomcat也已经发现及部署了我们上传的项目,查看实时日志:docker log -f 容器名字或容器id
10.我们在浏览器中进行访问,
1.此处我们使用 Xshell 6 软件进行演示,首先在linux终端中输入 ifconfig
查看你的ip地址,之后使用Xshell进行连接你的linux虚拟机,之后输入你的linux的用户名、密码进行连接
2.连接后直接拖动
3.连接到linxu系统后我们也可以使用Xshell 6 操作linux系统
1.查看容器内部细节,如数据卷、容器id等信息
docker inspect 容器名称|容器id
实现宿主机与容器之间的文件共享,与docker cp 不同的是,docker cp 是直接复制的形式,而数据卷是我们在宿主机对映射文件的更改可以直接影响到容器内部,如我们可以指定宿主机的某个目录与tomcat容器的webapps进行映射,日后我们对宿主机这个目录的更改可以直接影响到tomcat容器。
docker run -d -p 8080:8080 --name tomcat1 -v 宿主机目录(绝对路径):容器内目录 tomcat:8.0-jre
可以添加多个数据卷,加 -v 即可
如我们输入 docker run -d -p 8080:8080 --name tomcat1 -v /root/apps/:/usr/local/tomcat/webapps tomcat:8.0-jre
,其中宿主机的/root/apps/目录为空的,
注意:会把宿主机目录下的所有文件复制到容器内的目录中,如果宿主机的目录下为空,则容器内对应的目录也为空
之后我们在宿主机的/root/apps添加内容,拷贝test.war(javaweb项目)到/root/apps,我们输入 cp /root/test.war .
(表示拷贝test.war到当前目录),发现容器内的webapps也已经有了test.war
docker run -d -p 8080:8080 --name tomcat1 -v **数据卷名字:容器内目录** tomcat:8.0-jre
可以添加多个数据卷,加 -v 即可
其中数据卷名字可以自定义,如aa,则docker会把aa当成一个数据卷的别名,当docker发现自己机器上没有aa这个数据卷的时候,会在docker的Volume(数据卷)中自动创建一个数据卷aa并自动映射到宿主机的某个目录,同时在容器启动时会将aa对应容器目录中的全部内容复制到aa映射目录(宿主机目录)中。
如我们输入 docker run -d -p 8080:8080 --name tomcat1 -v aa:/usr/local/tomcat/webapps tomcat:8.0-jre
上面图片中拷贝代码书写错误,应该为 cp /root/test.war ./
之后发现容器中的webapps也已经有了test.war,我们删除容器(会把webapps下的test.war删除),之后再启动tomcat容器,由于此处数据卷aa是有文件存在的,所以会把数据卷aa中的文件test.war复制到启动的tomcat容器下的webapps目录
我们访问浏览器,发现aa数据卷下的test.war也已经复制到了tomcat容器的webapps下
1.当我们想要对宿主机上进行更改可以直接影响到容器的时候,可以使用自定义数据卷目录
2.当我们想要备份容器中的数据时,可以使用自动数据数据卷目录,因为我们使用自动数据卷目录可以将容器中的数据复制到宿主机上,且将容器删除之后,我们宿主机上对应的数据还是存在的,并不会随着容器的删除而消失
3.将容器打包成一个新的镜像
docker commit -m "描述信息" -a "作者信息" 容器名称 或 容器id 打包的镜像名称:标签(版本)
如我们打包tomcat镜像,
之后我们访问打包的镜像,
4.镜像备份
docker save 镜像名称:tag -o 备份文件名
如我们备份刚刚的tomcat镜像,
之后停止容器并删除本地镜像
之后载入镜像并运行
发现运行成功
至此,我们的Docker的学习(上)
就讲解完毕了,中篇我们将讲解Docker的镜像原理、网络通信机制、常用镜像的运行以及Dockerfile
。喜欢我的话可以关注我的微信公众号 我爱学习呀嘻嘻 ,不定期分享各类资源哦。
Docker的学习(中):镜像原理、网络通信机制、常用镜像的运行以及Dockerfile
Docker的学习(下):Docker Compose以及Docker可视化工具Portainer