Docker的学习(上)

Docker的学习(上)

此教程基于【编程不良人】2021年最新Docker容器技术&Docker-Compose实战教程,哔哩哔哩链接:https://www.bilibili.com/video/BV1ZT4y1K75K?p=1

官方文档地址:https://docs.docker.com/get-started/

中文文档地址:https://vuepress.mirror.docker-practice.com/

1.Docker简介

Docker的学习(上)_第1张图片

Docker的学习(上)_第2张图片

docker起源

Docker的学习(上)_第3张图片

2.Docker与虚拟机的对比

Docker的学习(上)_第4张图片

3.Docker的安装

Docker的学习(上)_第5张图片

3.1 Docker桌面安装

目前docker开发了mac和windows版本的桌面管理工具(Linux还未开发,只能使用命令的方式进行安装docker),我们直接下载安装即可

windows安装

1.前往官网下载,https://docs.docker.com/get-docker/ ,选择对应你版本的docker

Docker的学习(上)_第6张图片

2.在弹出的界面点击 docker desktop for windows

Docker的学习(上)_第7张图片

3.下载完成后双击运行安装即可。注意,安装完成后会进行重启的操作。

注意:安装桌面版的windows必须启用 Hyper-V,详情可以查看官网:https://docs.docker.com/desktop/windows/install/

3.2 Docker引擎安装

linux安装

1.前往官网,https://docs.docker.com/get-docker/ ,选择对应你需要安装的docker版本,

Docker的学习(上)_第8张图片

2.选择对应你的linux平台

Docker的学习(上)_第9张图片

3.之后会弹出一个界面叫你如何详细的进行安装,也可以参考下面的方法进行安装,或者直接通过bash进行安装(详情请看下方)

注意:docker只能安装在centos7或centos8的版本,没有安装Linux虚拟机的可以先去看我的其他博客,点击前往

Docker的学习(上)_第10张图片

image-20220119154754415

bash安装(通用所有平台)

Docker的学习(上)_第11张图片

1.我们首先输入(在linux命令终端中粘贴的快捷键为 shift + insert)

curl -fsSL https://get.docker.com -o get-docker.sh

2.接着输入

sudo sh get-docker.sh --mirror Aliyun

3.之后等待安装成功即可,安装成功界面如下:

Docker的学习(上)_第12张图片

注意:此处使用的虚拟机软件是VMware,安装的linux版本为centos 7.9(没有虚拟机基础的可以先去了解相关知识,推荐韩顺平的lunux教程)

4.之后就是启动docker的操作了,我们先输入 systemctl status docker 查看docker状态,发现是dead(停止)状态

5.之后启动docker,我们输入systemctl start docker

6.再次查看状态,我们输入 systemctl status docker ,发现docker已经处于运行状态

Docker的学习(上)_第13张图片

7.我们输入 docker info 可以查看docker引擎版本,我们发现,docker引擎是分为客户端和服务端的,是一个C/S架构,客户端就是用来书写我们的命令,服务端用来运行我们的命令

Docker的学习(上)_第14张图片

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

Docker的学习(上)_第15张图片

4.Docker的核心概念、架构

Docker的学习(上)_第16张图片

1.我们可以前往docker的远程仓库下载我们所需要的镜像,https://registry.hub.docker.com/ ,如我们想要下载mysql的镜像,我们直接搜索即可

Docker的学习(上)_第17张图片

2.之后会显示对应的镜像信息,

Docker的学习(上)_第18张图片

3.我们点击进入mysql镜像详情页,查看相关信息

Docker的学习(上)_第19张图片

4.如我们需要下载mysql8.0.23版本镜像,我们输入 docker pull mysql:8.0.23 即可进行下载(需要docker远程仓库拥有这个镜像)

5.Docker下载镜像加速

Docker的学习(上)_第20张图片

1.我们首先登录阿里云,找到“容器镜像服务”

Docker的学习(上)_第21张图片

2.之后选择对应你的操作系统,

Docker的学习(上)_第22张图片

3.执行代码,

Docker的学习(上)_第23张图片

4.之后输入 docker info 查看dcoker信息,我们发现docker中已经有了我们的阿里云镜像加速地址

Docker的学习(上)_第24张图片

6.Docker的helloworld应用

当我们本地没有hello-world镜像时,输入 docker run hello-world 命令会发生什么?

Docker的学习(上)_第25张图片

Docker的学习(上)_第26张图片

Docker的学习(上)_第27张图片

7.Docker镜像的相关操作

Docker的学习(上)_第28张图片

Docker的学习(上)_第29张图片

1.查看docker引擎以及docker帮助命令

docker info 用来展示docker信息、版本等

docker versiobn 主要用来查看docker客户端和服务端的版本号,

Docker的学习(上)_第30张图片

docker --helpdocker 查看docker所有帮助命令

Docker的学习(上)_第31张图片

2.操作镜像images的相关命令

docker images 查看本地仓库中存在哪些镜像,其中镜像id只显示了一部分

docker images -a 表示列出本地所有镜像,等同于 docker images

docker images -q 表示只显示镜像id

如果我们要查看某个镜像的所有版本,如mysql,可以输入 docker images mysql

Docker的学习(上)_第32张图片

3.拉取镜像

docker pull 镜像名称:版本号 拉取镜像,如docker pull mysql:8.0.23

或者

docker pull 镜像名:DIGEST@摘要 拉取镜像,如

docker pull mysql:DIGEST@sha256:355617769102e9d2ebb7d5879263a12d230badb7271c91748b2c7b0ac6971083

摘要的查看方式:

1.找到你要下载的镜像版本

Docker的学习(上)_第33张图片

2.查看该镜像的摘要

Docker的学习(上)_第34张图片

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 强制删除镜像,即使当前镜像正在容器中运行,注意:此操作会把镜像和容器都删除掉

Docker的学习(上)_第35张图片

删除本地所有镜像

如果需要删除与mycentos7相关的镜像,可以输入 docker rmi -f $(docker images mycentos7 -aq)

Docker的学习(上)_第36张图片

如果我们忘记后面的具体命令可以输入 docker image --help 查看帮助文档

Docker的学习(上)_第37张图片

8.容器的基本操作(一)

Docker的学习(上)_第38张图片

Docker的学习(上)_第39张图片

Docker的学习(上)_第40张图片

1.导入镜像

docker load -i 导入的tar镜像文件名 将tar镜像文件导入到本地仓库

Docker的学习(上)_第41张图片

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

运行tomcat镜像

1.我们输入docker pull tomcat:8.0-jre8 进行拉取镜像,之后输入 docker run tomcat:8.0-jre8 进行运行tomcat容器,

2.之后我们查看本地ip地址,linux查看本机ip可以输入 ifconfig 进行查看

Docker的学习(上)_第42张图片

3.我们发现并不能访问容器中监听的8080端口

Docker的学习(上)_第43张图片

4.我们重新运行,输入 docker run -p 8080:8080 tomcat:8.0-jre8 ,发现已经可以访问容器内监听的端口

Docker的学习(上)_第44张图片

5.同时,我们可以根据此镜像运行多个容器,由于docker中容器与容器之间是进程级隔离的,他们不会互相影响。如我们输入 docker run -p 8081:8080 tomcat:8.0-jre8 再启动一个容器,用外部的8081端口映射容器中的8080端口

Docker的学习(上)_第45张图片

注意:开启端口映射了宿主机器还是无法访问容器内的端口

防火墙

可能防火墙隔离了,查看防火墙状态,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的学习(上)_第46张图片

docker ps -a 查看所有的容器(运行和未运行的)

docker ps -qa 返回所有的容器id(运行和未运行的)

Docker的学习(上)_第47张图片

4.启动容器

docker run -p 宿主机端口:容器内端口 -d(后台启动)镜像名:tag 或 镜像名:镜像id 启动容器,映射端口,后台启动,会返回一个运行的容器id(完整的)

docker run -p 宿主机端口:容器内端口 -d(后台启动) --name 容器名称 镜像名:tag 或 镜像名:镜像id 启动容器,指定容器名字,映射端口,后台启动,会返回一个运行的容器id(完整的)

Docker的学习(上)_第48张图片

docker start | restart | stop | kill 容器名字或容器id 启动|重启|正常停止|立即停止 容器

9.容器的基本操作(二)

Docker的学习(上)_第49张图片

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的学习(上)_第50张图片

docker top 容器名称|容器id 查看容器内进程

Docker的学习(上)_第51张图片

4.与容器内部进行交互

docker exec -it 容器名称|容器id bash 进入容器,与容器内的命令终端进行交互(每个容器都是操作系统层面的进程隔离,都有其自己的终端,进入一个容器相当于进入一个新的操作系统,只不过这个操作系统非常精简,bash表示进入容器内的命令行模式)

exit 退出容器

Docker的学习(上)_第52张图片

5.操作系统与容器的传输文件

docker cp 容器名称|容器id:容器内资源路径 操作系统中路径 从容器复制文件到操作系统(目录也可以进行拷贝)

如我们要复制tomcat容器内的webapps到宿主机上,首先进入容器,之后复制容器id

Docker的学习(上)_第53张图片

之后另开一个连接,输入 docker cp 容器名称|容器id:容器内资源路径 操作系统中路径

Docker的学习(上)_第54张图片

docker cp 文件 或目录 容器名称|容器id:容器内资源路径 从操作系统复制文件到容器

如将宿主机的aa.txt复制到tomcat容器的usr/local/tomcat路径下

Docker的学习(上)_第55张图片

部署javaweb项目到tomcat

我们可以将本地的javaweb项目部署到docker的tomcat容器下进行运行(springboot项目要先排除内置的tomcat)

1.首先我们进入ideal创建一个maven项目,

Docker的学习(上)_第56张图片

2.之后输入项目的基本信息后点击next

Docker的学习(上)_第57张图片

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对应的目录下

Docker的学习(上)_第58张图片

7.之后进入tomcat容器,复制webapps的目录

Docker的学习(上)_第59张图片

8.将上传的war包复制到对应的tomcat容器内

Docker的学习(上)_第60张图片

9.查看tomcat实时日志,发现tomcat也已经发现及部署了我们上传的项目,查看实时日志:docker log -f 容器名字或容器id

10.我们在浏览器中进行访问,

Docker的学习(上)_第61张图片

补充:将宿主机的文件上传到linux

1.此处我们使用 Xshell 6 软件进行演示,首先在linux终端中输入 ifconfig 查看你的ip地址,之后使用Xshell进行连接你的linux虚拟机,之后输入你的linux的用户名、密码进行连接

Docker的学习(上)_第62张图片

2.连接后直接拖动

Docker的学习(上)_第63张图片

3.连接到linxu系统后我们也可以使用Xshell 6 操作linux系统

10.容器的基本操作(三)

Docker的学习(上)_第64张图片

1.查看容器内部细节,如数据卷、容器id等信息

docker inspect 容器名称|容器id

Docker的学习(上)_第65张图片

Docker的学习(上)_第66张图片

2.数据卷 Volume

​ 实现宿主机与容器之间的文件共享,与docker cp 不同的是,docker cp 是直接复制的形式,而数据卷是我们在宿主机对映射文件的更改可以直接影响到容器内部,如我们可以指定宿主机的某个目录与tomcat容器的webapps进行映射,日后我们对宿主机这个目录的更改可以直接影响到tomcat容器。

2.1 自定义数据卷目录

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/目录为空的,

注意:会把宿主机目录下的所有文件复制到容器内的目录中,如果宿主机的目录下为空,则容器内对应的目录也为空

Docker的学习(上)_第67张图片

之后我们在宿主机的/root/apps添加内容,拷贝test.war(javaweb项目)到/root/apps,我们输入 cp /root/test.war . (表示拷贝test.war到当前目录),发现容器内的webapps也已经有了test.war

Docker的学习(上)_第68张图片

2.2 自动创建数据卷目录

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

Docker的学习(上)_第69张图片

上面图片中拷贝代码书写错误,应该为 cp /root/test.war ./

之后发现容器中的webapps也已经有了test.war,我们删除容器(会把webapps下的test.war删除),之后再启动tomcat容器,由于此处数据卷aa是有文件存在的,所以会把数据卷aa中的文件test.war复制到启动的tomcat容器下的webapps目录

Docker的学习(上)_第70张图片

我们访问浏览器,发现aa数据卷下的test.war也已经复制到了tomcat容器的webapps下

Docker的学习(上)_第71张图片

2.3 二者区别

1.当我们想要对宿主机上进行更改可以直接影响到容器的时候,可以使用自定义数据卷目录

2.当我们想要备份容器中的数据时,可以使用自动数据数据卷目录,因为我们使用自动数据卷目录可以将容器中的数据复制到宿主机上,且将容器删除之后,我们宿主机上对应的数据还是存在的,并不会随着容器的删除而消失

3.将容器打包成一个新的镜像

docker commit -m "描述信息" -a "作者信息" 容器名称 或 容器id 打包的镜像名称:标签(版本)

如我们打包tomcat镜像,

Docker的学习(上)_第72张图片

之后我们访问打包的镜像,

Docker的学习(上)_第73张图片

4.镜像备份

docker save 镜像名称:tag -o 备份文件名

如我们备份刚刚的tomcat镜像,

Docker的学习(上)_第74张图片

之后停止容器并删除本地镜像

Docker的学习(上)_第75张图片

之后载入镜像并运行

Docker的学习(上)_第76张图片

发现运行成功

Docker的学习(上)_第77张图片

喜欢请关注我

至此,我们的Docker的学习(上)就讲解完毕了,中篇我们将讲解Docker的镜像原理、网络通信机制、常用镜像的运行以及Dockerfile。喜欢我的话可以关注我的微信公众号 我爱学习呀嘻嘻 ,不定期分享各类资源哦。

Docker的学习(中):镜像原理、网络通信机制、常用镜像的运行以及Dockerfile

Docker的学习(下):Docker Compose以及Docker可视化工具Portainer

在这里插入图片描述

你可能感兴趣的:(docker,容器,linux,docker-compose,centos)