docker入门及实际应用

b站看视频整理的笔记..看到docker网络就没继续往下学了,后续会跟上.. 学完之后刚好在工作中用到,遇到了一系列的问题...问题和解决办法也一块整理成了笔记 ,记录下来,免得忘记

Docker的安装

以centos7为例

#1、删除旧文档
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2、需要的安装包
yum install -y yum-utils

#3、设置镜像的仓库
yum-config-manager \
    --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo  #默认是从国外的
  yum-config-manager 
  --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云
 
 #更新yum软件包索引
 yum makecache faster
 
 #4、安装docker相关的依赖  docker-ce社区版  ee企业版
 yum install docker-ce docker-ce-cli containerd.io
 
 #5、启动docker
 systemctl start docker
 #6、验证是否安装成功
 docker version  
 #7、测试helloworld程序
 docker run hello-world
 #8、查看镜像
 docker images
 
 ##卸载docker
 #1、卸载依赖
 yum remove docker-ce docker-ce-cli containerd.io
 #2、删除资源
 rm -rf /var/lib/docker  # rm -rf /var/lib/docker  #dcker的默认工作目录

阿里云镜像加速

1、登陆阿里云 找到容器服务(容器镜像服务)

2、找到镜像加速地址

CentOS的配置方式略微复杂,需要先将默认的配置文件(/lib/systemd/system/docker.service)复制到/etc/systemd/system/docker.service。然后再将加速器地址添加到配置文件的启动命令中,之后重启Docker即可。

sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service

sudo sed -i "s|ExecStart=/usr/bin/docker 

daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=|g" /etc/systemd/system/docker.service
sudo sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd --registry-mirror=|g" /etc/systemd/system/docker.service

sudo systemctl daemon-reload

sudo service docker restart  

3、配置使用

##运行流程图:

docker入门及实际应用_第1张图片

Docker的工作原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。DockerServer接收到DockerClient的指令就会执行这个命令。

docker入门及实际应用_第2张图片

Docker为什么比VM快?

1、Docker有着比虚拟机更少的抽象层

2、Docker利用的是宿主机的内核,VM需要的是Guest OS

docker入门及实际应用_第3张图片

So:新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的,而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!

Docker的常用命令

帮助命令:

docker version #显示版本信息
docker info    #显示系统信息
docker  --help #帮助命令

帮助文档的地址:https://docs.docker.com/reference/

镜像命令:

docker images ##查看所有本地主机上的镜像


#可选项
--all , -a		#列出所有镜像
--quiet , -q	#只显示镜像的id

docker search 搜索镜像

docker search mysql

#可选项 
#例:通过收藏来过滤
--filter=STARS=3000
--filter , -f		Filter output based on conditions provided
--format		Pretty-print search using a Go template
--limit	25	Max number of search results
--no-trunc		Don't truncate output

docker pull 下载镜像

#docker pull 镜像名[:tag]
docker pull mysql  #如果不写tag默认下载最新版本
#指定版本下载
docker pull mysql:5.7

docker入门及实际应用_第4张图片

docker入门及实际应用_第5张图片

docker入门及实际应用_第6张图片

容器命令:

有了镜像才可以创建容器,以centos为例,先下载centos镜像

docker pull centos

docker入门及实际应用_第7张图片

#新建容器并启动
docker run [可选参数] image
#参数说明
--name="name" #容器名字,区分容器
-d            #后台方式运行
-it           #使用交互方式运行,进入容器查看内容
-p            #指定容器的端口 -P 8080:8080
   -p ip: 主机端口:容器端口
   -p 主机端口:容器端口
   -p 容器端口
   容器端口
-P            #随机指定端口

docker入门及实际应用_第8张图片

退出容器

docker rm 容器id  #删除指定的容器  不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器 linux命令

启动和停止容器的操作

docker start 容器id  #启动指定的容器
docker restart 容器id #重新启动指定的容器
docker stop 容器id #停止当前容器
docker kill 容器id #强制停止当前容器

常用的其他命令

后台启动容器

docker run -d 镜像名
docker run -d centos
##问题 docker ps 发现centos停止了
#常见的坑 docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志信息

docker logs -f -t --tail 容器id 

docker入门及实际应用_第9张图片

查看容器中进程信息

docker top 容器id 

在这里插入图片描述

查看容器的元数据

docker inspect 容器id

docker入门及实际应用_第10张图片

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改配置
方式1、docker exec -it 容器id /bin/bash
方式2、docker attach 容器id


#docker exec 进入容器后开启一个新的终端,可以在里面操作
#docker attach 进入容器当前正在执行的终端 不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的的主机路径

docker入门及实际应用_第11张图片

小结

docker入门及实际应用_第12张图片

docker入门及实际应用_第13张图片

docker入门及实际应用_第14张图片

练习 docker安装nginx


docker search nginx
docker pull nginx

docker入门及实际应用_第15张图片

端口暴露的概念:

docker入门及实际应用_第16张图片

docker入门及实际应用_第17张图片

可视化

在这里插入图片描述

什么是portainer?

Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。

#Docker安装portainer
docker run -d -p 9000:9000 --restart=always --name portainer -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

​ 访问测试:ip:8088

Portainer展示:

  • 首页

​ 包含docker-compose、容器、镜像、卷、网络总体概况。

img

  • 容器

​ 包含容器的启、停,新增,监控,日志查看,容器控制台等功能。

img

  • 镜像

    包含镜像详细查看、删除、导入、导出等功能。

img

  • 节点管理

img

Docker镜像

docker入门及实际应用_第18张图片

docker入门及实际应用_第19张图片

docker入门及实际应用_第20张图片

至于容器如何获取镜像层文件而又不影响到是镜像层的呢?docker是这样实现的?
如果需要获取某个文件,那么容器曾会从上到下去下一层的镜像层去获取文件,如果该层文件不存在,那么就会去下一镜像层去寻找,直到最后一层。
对于用户而言,用户面向的是一个叠加后的文件系统。

docker入门及实际应用_第21张图片

而任何对于文件的操作都会记录在容器层,例如说修改文件,容器层会把在镜像层找到的文件拷贝到容器层然后进行修改,删除文件则会在容器层内记录删除文件的记录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mksEfwzg-1615787127735)(images/image-20210213161647643.png)]

测试:

#启动默认的tomcat  没有webapps 官方镜像的原因,默认webapps底下是没有文件的
#自己拷贝进去基本的文件  
cp -r webapps.dist/* webapps   
#将操作过的文件commit为一个镜像  以后使用修改过的镜像即可
docker commit -a="" -m="" id  name 

docker入门及实际应用_第22张图片

docker入门及实际应用_第23张图片

容器数据卷

容器数据卷是什么?

Docker原理回顾:把应用和环境打包成一个镜像。

如果数据保存在容器中,容器一删除就没了。新需求:数据可以持久化 例如mysql

容器之间可以有一个共享技术!Docker中产生的数据同步到本地。

这就是卷技术!说白了就是目录的挂载,将容器内的目录挂载到linux上面

docker入门及实际应用_第24张图片

一句话总结:容器的持久化和同步操作。容器间也是可以数据共享的。

使用数据卷

方式一:使用docker命令挂载 -v

docker run -it -v  主机目录:容器内目录
#测试
docker run -it -v /home/ceshi:/home centos /bin/bash  #把容器内home 文件下的内容同步挂载到linux系统的home下的ceshi
#启动起来可以通过docker inspect 容器id查看  如图:

docker入门及实际应用_第25张图片

测试文件的同步:

docker入门及实际应用_第26张图片

docker入门及实际应用_第27张图片

实战:安装mysql

https://hub.docker.com/

docker search mysql 
docker pull mysql:5.7
#运行容器  需要进行数据挂载  安装mysql是需要配置密码的  要注意!
#官方测试
 docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
 
#启动我们的
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

在这里插入图片描述

docker入门及实际应用_第28张图片

具名挂载 匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx 
#查看所有卷的情况
docker volume ls 
#这里发现数据如图 :这就是匿名挂载 -v只写了容器内的路径  没有写容器外的路径

docker入门及实际应用_第29张图片

#具名挂载 
docker run -d -P --name nginx01 -v juming-nginx:/ect/nginx nginx 
#通过-v  卷名:容器内路径
#查看这个卷
docker volume inspect juming-nginx

docker入门及实际应用_第30张图片

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes

通过具名挂载可以方便找到我们的一个卷,推荐使用。

#如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径   			#匿名挂载
-v 卷名:容器内路径 	  #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载

拓展:

#通过-v 容器内路径:ro rw改变读写权限
 ro  readonly  #只读
 rw  readwrite #可读可写
 #一旦设置里容器权限,容器对我们挂载出来的内容就有限定了
 docker run -d -P --name nginx01 -v juming-nginx:/ect/nginx:ro nginx 
 docker run -d -P --name nginx01 -v juming-nginx:/ect/nginx:rw nginx 
 #ro  说明这个路径只能通过宿主机来操作,容器内部无法操作

初识Dockerfile

DockerFile就是用来构建docker镜像的构建文件。命令脚本

通过这个脚本可以生成脚本,镜像是一层一层的,一个脚本就是一个命令

方式二:

#创建一个dockerfile文件 名字随机  建议Dockerfile
#文件内容  指令大写
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
#这里的每个命令 就是镜像的一层

#docker build -f dockerfile1 -t kuangshen/centos .

docker入门及实际应用_第31张图片

docker入门及实际应用_第32张图片

docker入门及实际应用_第33张图片

在这里插入图片描述

数据卷容器

多个mysql同步数据

docker入门及实际应用_第34张图片

docker入门及实际应用_第35张图片

docker入门及实际应用_第36张图片

docker入门及实际应用_第37张图片

DockerFile

DockerFile介绍

DockerFile是用来构建docker镜像的文件,命令参数脚本。

构建步骤:

1、编写一个DockerFile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(dockerhub、阿里云镜像仓库)

docker入门及实际应用_第38张图片

DockerFile构建过程

基础知识:

1、每个保留关键字(指令)都必须是大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每个指令都会创建提交一个新的镜像层,并提交。
docker入门及实际应用_第39张图片

DockerFile : 构建文件,定义了一切的步骤,源代码

DockerImages: 通过DockerFile构建生成的镜像,最终发布和运行的产品。

Docker容器 : 容器就是镜像运行起来提供服务器。

DockerFile的指令

FROM 		#基础镜像,一切从这里开始构建
MAINTAINER  #镜像是谁写的  姓名+邮箱
RUN 		#镜像构建的时候需要运行的命令
ADD 		#步骤 :tomcat镜像  添加tomcat压缩包
WORKDIR  	#镜像的工作目录
VOLUME  	#挂载卷的目录
EXPOSE		#暴露端口位置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 	#当构建一个被继承DockerFile,这个时候会运行ONBUILD指令,触发指令
COPY		#类似ADD 将文件拷贝到镜像中
ENV			#构建的时候设置环境变量

docker入门及实际应用_第40张图片
docker入门及实际应用_第41张图片

实战测试

Docker Hub 99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建
docker入门及实际应用_第42张图片

1、编写DockerFile文件

docker入门及实际应用_第43张图片

docker入门及实际应用_第44张图片

docker入门及实际应用_第45张图片

docker history #列出本地进行的变更历史

docker入门及实际应用_第46张图片

CMD ENTRYPOINT的区别

CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令

docker入门及实际应用_第47张图片

docker入门及实际应用_第48张图片

docker入门及实际应用_第49张图片

DockerFile中 很多命令都很相似,需要了解它们的区别。

实战:Tomcat镜像

1、准备镜像文件 Tomcat压缩包、jdk的压缩包

docker入门及实际应用_第50张图片

2、编写Dockerfile文件

vim Dockerfile    #创建并编辑
#内容#
FROM centos 
MAINTAINER wyh<[email protected]>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ##ADD添加的压缩包会自动解压
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim
NEV MYPATH /usr/local
WORK $MYPATH
NEV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out

3、构建镜像

##构建镜像
`docker build -t diytomcat .`

4、启动镜像

docker run -d -p 9090:8080 --name wyhtomcat -v /home/wyh/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/wyh/build/tomcat/tomcatelogs/:/usr/local/apache-tomcat-9.0.22/webapps/logs diytomcat 

5、访问测试

6、发布项目(由于做了挂载 在本地发布即可)

cd WEB-INF/
vim web.xml
vim index.jsp


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>dbdisplay-name>
 <welcome-file-list>
   <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.jspwelcome-file>
  welcome-file-list>
web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta charset="utf-8">
<title>hello   diytomcattitle>
head>
<body>
Hello World!<br/>
<%
System.out.println("----test   logs ----");
%>
body>
html>

docker入门及实际应用_第51张图片

发布自己的镜像

DockerHub

1、地址:https://hub.docker.com/ 注册账号

2、确定账号可以登录

3、在服务器上提交自己的镜像

docker入门及实际应用_第52张图片

#登录
docker login -u wyh

4、提交镜像 docker push

docker push wyh/diytomcat:1.0   #作者+版本号

docker入门及实际应用_第53张图片

解决问题:

docker tag id 镜像名:[tag] #指定版本号

在这里插入图片描述

docker入门及实际应用_第54张图片

阿里云镜像服务上 参考官方

1、登录阿里云 找到容器镜像服务

2、创建命名空间

在这里插入图片描述

3、创建容器镜像

docker入门及实际应用_第55张图片

4、浏览

在这里插入图片描述

docker入门及实际应用_第56张图片

小结

docker入门及实际应用_第57张图片

Dockerfile项目实战

出现的问题: 1、镜像启动成功了 但是docker ps查看不到 启动之后自动停止

百度出的原因 :通过 docker log 镜像id查看到错误原因:程序没有入口

解决办法:在项目的pom文件里添加以下代码 成功解决。

<build>
            <finalName>ammeterfinalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackagegoal>
                            goals>
                        execution>
                    executions>
                    <configuration>
                        <includeSystemScope>trueincludeSystemScope>
                    configuration>
                plugin>
            plugins>
        build>

出现的问题: 2、 镜像启动成功 外部访问拒绝连接

原因:项目的端口号和Dockerfile不一致

Dockerfile内容如下:

FROM java:8

VOLUME /tmp

ADD ammeter.jar ammeter.jar

EXPOSE 8085     ##项目写的8085   原来Dockerfile里写的8901

ENTRYPOINT ["java","-jar","ammeter.jar"]

出现的问题:3、 项目打包成jar包后 原来写的下载文件路径找不到。

即:docker下读取excel文件找不到路径,必须copy到容器或者映射文件

解决办法: 改变获取文件路径的方法、更改Dockerfile文件内容

==java代码
System.getProperty("user.dir");  ##就是绝对路径,不需要修改名称,  windows和linux通用
FROM java:8

MAINTAINER wyh

VOLUME /tmp

RUN mkdir /app

ADD ammeter.jar /app/ammeter.jar

WORKDIR /app

ADD WU-0057-08-A_Fab2棟配電室巡檢記錄表一.xls /app/   #添加文件到容器

EXPOSE 8085     ##和项目一致

ENTRYPOINT ["java","-jar","/app/ammeter.jar"]

容器里的目录就像这样,能够找到文件

/app/WU-0057-08-A_Fab2棟配電室巡檢記錄表一.xls

ps:挂载也可以解决 、暂未尝试。。

出现的问题 4、docker容器和本地时间相差8个小时 导致查不到数据

解决办法: dockerfile内容不变 启动容器时 添加 -e LC_ALL=“en_US.UTF-8” -e TZ=“Asia/Shanghai”

后遗症:导致下载文件名乱码 最后改为 -e TZ=“Asia/Shanghai”

docker run -d -p 8901:8085   -e TZ="Asia/Shanghai"  ammeter

相关命令:
`查看时区`
docker exec [容器id] date

`进入容器内部`:
docker exec -t -i 容器名 /bin/bash

出现的问题 5、下载文件时找不到路径 通过docker log 容器id查看到原因:中文名乱码

解决方法 在Dockerfile里加一句 ENV LANG C.UTF-8

最终版本的dockerfile文件:

FROM java:8

MAINTAINER wyh

VOLUME /tmp

ENV LANG C.UTF-8

RUN mkdir /app

ADD ammeter.jar /app/ammeter.jar

WORKDIR /app

ADD WU-0057-08-A_Fab2棟配電室巡檢記錄表一.xls /app/   #添加文件到容器

EXPOSE 8085     ##和项目一致

ENTRYPOINT ["java","-jar","/app/ammeter.jar"]

ps:小知识

前台上传文件到服务器后,服务器返回给前台的文件列表中出现中文乱码,所有的中文文件名全部变成?,英文文件名则正常显示。

  问题经过定位,发现后台代码的multipartfile类在执行transterto的方法时就发生了此异常,然而配置文件集中的multipartResolver以及encodingFilter均已经设置成了UTF-8,排除代码异常。kubectl exec进入到docker容器中进行查看时发现,文件在容器中也是中文文件名显示异常。查看docker容器编码格式:执行locale命令;可以看到当前编码格式为POSIX,而这种编码格式不支持中文
  解决办法:locale -a查看容器所有语言环境
  C.UTF-8可以支持中文,只需要把容器编码设置为C.UTF-8即可
    1.临时修改:
       locale
       locale -a
       LANG=C.UTF-8  (`有的是zh_CN.UTF-8,不过我在本地没发现这种编码,报错找不到`)
       source /etc/profile
    2.永久修改:修改Dockerfile
      在Dockerfile中添加一行
      `ENV LANG C.UTF-8`
      重新制作docker镜像,docker run -ti [镜像] 进入容器后执行locale发现编码格式已经被修改为C.UTF-8,之前出现的中文文件名乱码问题也没有了。

Docker网络

理解Docker0

docker入门及实际应用_第58张图片

##docker 是怎么处理网络访问的??
docker run -d -P --name tomcat01 tomcat

#查看容器的内部网络地址
docker exec -it tomcat01 ip addr

docker入门及实际应用_第59张图片

docker入门及实际应用_第60张图片

后台代码的multipartfile类在执行transterto的方法时就发生了此异常,然而配置文件集中的multipartResolver以及encodingFilter均已经设置成了UTF-8,排除代码异常。kubectl exec进入到docker容器中进行查看时发现,文件在容器中也是中文文件名显示异常。查看docker容器编码格式:执行locale命令;可以看到当前编码格式为POSIX,而这种编码格式不支持中文
解决办法:locale -a查看容器所有语言环境
C.UTF-8可以支持中文,只需要把容器编码设置为C.UTF-8即可
1.临时修改:
locale
locale -a
LANG=C.UTF-8 (有的是zh_CN.UTF-8,不过我在本地没发现这种编码,报错找不到)
source /etc/profile
2.永久修改:修改Dockerfile
在Dockerfile中添加一行
ENV LANG C.UTF-8
重新制作docker镜像,docker run -ti [镜像] 进入容器后执行locale发现编码格式已经被修改为C.UTF-8,之前出现的中文文件名乱码问题也没有了。

Docker网络

理解Docker0
docker入门及实际应用_第61张图片


##docker 是怎么处理网络访问的??
docker run -d -P --name tomcat01 tomcat

#查看容器的内部网络地址
docker exec -it tomcat01 ip addr

docker入门及实际应用_第62张图片

docker入门及实际应用_第63张图片

docker入门及实际应用_第64张图片

你可能感兴趣的:(Docker,docker,java,linux)