你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Docker镜像理解

[复制链接]
gaosmile 发布时间:2020-10-5 21:26
Docker镜像理解Docker镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件
Docker镜像加载原理
UnionFs:联合文件系统
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,UnionFs联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
Docker的镜像实际上由一层一层的UnionFs文件系统组成bootfs:主要包含 bootloader和 Kernel,bootloader主要是引导加 kernel,Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含bootfs加载器和内核,当bootfs加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs:在 bootfs之上,包含的就是典型 Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如:Ubuntu,、CentOS等等
简单理解:
1. 对于Docker安装OS来说:就是Docker使用了Linux本身的bootfs,只需要安装自己所需的rootfs。
2. 对于Docker安装普通镜像来说:就是Docker本身是分层下载镜像,所以可以提取出公共层镜像,进行复用。
Docker镜像的特点
Docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部
这一层就是我们通常说的容器层,容器之下的都叫镜像层
微信图片_20201005212338.png Commit镜像# 提交本地镜像
' O: D1 Q+ X0 I% |3 j/ s+ p# \# -a:作者信息 -m:描述信息 容器ID 镜像名称:版本信息
5 T7 }; |3 G& q" X( Ydocker commit -a="test" -m="test" 容器id tomcat01:1.0
Docker容器数据卷什么是容器数据卷
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
容器数据卷使用命令# 命令
. M6 S( J3 z: z& x5 X$ [3 f0 z+ g7 G  Gdocker run -it -v 主机目录:容器内目录 /bin/bash
2 p# q5 o/ x% w3 k
挂载MySQL数据库到Liunx宿主机# 1. 下载MySQL, g* ]4 c- l: K9 H% _6 Q; M
docker pull mysql
5 l: V9 c3 g/ b) I& O# 2. 启动并挂载 -e:特别注意需要设置密码
( x% @" i3 y' h! h' P7 G) R% C/ P' |docker run -d -p 3344:3306 -v /home/conf:/etc/mysql/conf.d -v /home/logs:/logs -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql$ u3 ?& f: s: G9 W+ v# N
此时我们使用远程连接软件会报错
微信图片_20201005212342.png # 解决报错
$ U# I" J# G8 t4 [) Z: @# 1. 进入容器内4 R' }! X( J; X* I) c* v0 @4 n
docker exec -it 容器ID /bin/bash+ k0 T7 Q2 V  V
# 2. 进入MySQL
/ i6 B; N5 D6 }. Z  Nmysql -uroot -p123456$ n0 B0 d8 ~8 C
# 3. 授权
% ^0 g% C# y5 j- @6 B' ]! Kmysql> GRANT ALL ON *.* TO 'root'@'%';
, n$ `2 n3 p  a+ G2 Z( f% k" Q, p" i# 4. 刷新权限:
8 u. x/ B3 p$ E$ mmysql> flush privileges;
9 h' ~- v; [5 r% A; F# 5. 更新加密规则:+ y( R2 k3 k7 N' h, c& t  ?
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;' M% V7 Q! i* f+ m2 `* F
# 6. 更新root用户密码:
0 r" J1 a1 H5 D; xmysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';  [7 x( b, n5 m" L# O8 n& |! r- j& u
# 7. 刷新权限:
. f+ V3 G& |7 o. V0 w" @( umysql> flush privileges;
0 l3 t  j' T; |# h( e
具名和匿名挂载-v 容器内路径          # 匿名挂载
0 L) Q0 \% s/ }-v 卷名:容器内路径         # 具名挂载
) ?* p! f  A- A: A  c$ l" {-v 宿主机路径:容器内路径 # 指定路径挂载
" {$ I6 N6 t6 }; S/ N$ WDocker容器内的卷,在没有指定目录的情况下都在/var/lib/docker/volumes/xxx/_data下0 t% q. H2 X" ]5 q
拓展:绑定权限# 通过 -v 容器内路径:ro rw 改变读写权限
  I$ }, i' C7 a" C) Q9 e' K5 D* a3 Kro # readonly 只读
6 G  W# x1 @2 E/ Y/ nrw # readwrite 可读可写
! D% s& ~. g- M/ n4 gdocker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx
4 n/ |7 v. h2 I' q& j$ r, ^3 j$ jdocker run -d nginx01 -v nginxdemo:/etc/nginx:rw nginx
2 w; S' c2 p; [" T4 S# ro:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作/ y/ G: W4 T; Z; u  ^9 l/ N
数据卷容器挂载
目的:实现多个容器间的数据同步(多个MySQL间共享数据)
# 使用 --volumes-from 容器名称 此命令实现数据卷容器挂载( f7 L. ^1 B, {# A- o# E" N
docker run -d --name mysql02 -p 3345:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql
DockerFile
DockerFile是用来构建Docker镜像的文件(命令参数脚本)
DockerFile构建指令FROM                # 基础镜像,一切从这里开始构建. u/ x* v5 ^, _9 k* @3 }
MAINTAINER             # 镜像是谁写的, 姓名+邮箱" _  Z! @  A* |
RUN                    # 镜像构建的时候需要运行的命令
0 M( [  \/ K' y) K. B6 kADD                    # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
9 v7 W; ?- L% ?WORKDIR                # 镜像的工作目录
- C6 R  J" |0 z1 `  JVOLUME                # 挂载的目录# Z" Q9 |: ^. k) V
EXPOSE                # 保留端口配置
$ x! x+ V3 q, M+ y' ^CMD                    # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代, D/ z2 y. d; \. o: e9 R4 {: p
ENTRYPOINT            # 指定这个容器启动的时候要运行的命令,可以追加命令
+ ^* \3 r& o, G5 CCOPY                # 类似ADD,将我们文件拷贝到镜像中$ b( y5 K- ^# n2 A6 m! P" m3 K
ENV                    # 构建的时候设置环境变量!# Y: q- S# K' Z' [
创建一个自己的CentOS镜像
  • 创建DockerFile
    2 R6 y" r; Y$ H
vim mycentos+ p; J9 z5 ]8 I' I, Q
  • 编写DockerFile
    4 ~; Z8 h4 `- g* G
FROM centos2 U# \) |5 Q2 e. x. d* S# t
MAINTAINER MT<1746344046@qq.com>" C7 |3 |7 P* g% V

" `9 I$ s% n$ r# D) ~# DENV MYPATH /usr/local
- y) h6 U: ~8 m* ?' o) mWORKEDIR $MYPATH5 `  O0 H0 @; b3 C2 J

2 i0 g8 ^. t, Y  @  XRUN yum -y install vim
/ Q6 }4 G7 ]) ^
1 r  k. ^: @) R1 g1 ^6 ]" WEXPOSE 80
7 ?3 A: ?( ?+ e  H% p6 V: t% o$ ~- X! p, b% A3 t! ^) E* h5 R1 |
CMD /bin/bash
7 C  Q# }5 i( e8 ?5 G7 B% h
  • 构建自己的镜像
    & T3 |4 M' ^5 {# M& m
docker build -f mycentos -t mycentosdemodo:1.0 .7 t. R- M- _$ ~: m, V
  • 查看镜像生成历史9 D) L0 j* U% P9 j$ u
docker history 镜像ID创建Tomcat镜像
1.准备镜像文件:Tomcat和JDK的压缩包
2.编写DockerFile
FROM centos3 V: o! o0 K5 I
MAINTAINER fortuneteller<1746344046@qq.com>
& E' J$ d8 ^, U- A0 V+ n/ i0 t9 d- A  s
COPY README.txt /usr/local/README.txt
% R. U0 g9 t. O5 K) \* Z- u8 a* F! c* D+ i; j* d; X- {4 [- @/ w
ADD jdk-8u251-linux-x64.tar.gz /usr/local
  n$ [& d! d2 K2 uADD apache-tomcat-9.0.35.tar.gz /usr/local
0 S3 [5 R. i, F# I6 X0 x* W! t3 ]- D$ A
RUN yum -y install vim5 D; W5 T3 w$ M( K
# p# ]$ |/ l8 ^% \- G
ENV MYPATH /usr/local: J6 N) W1 L$ m' W/ [3 t: Y4 x
WORKDIR $MYPATH$ n0 |- @' ^( P7 N/ ]! e* g
. Y+ H) u* e1 U' d3 ^9 E- O" d
ENV JAVA_HOME /usr/local/jdk1.8.0_2518 W  K4 s, l- I$ o/ e
ENV CLASSPATH $JAVA_HOME/lib/dt.jarJAVA_HOME/lib/tools.jar3 u6 ^& H" G/ P  {, o
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35/ L) A% @% T% v2 |; c
ENV CATALINA_BASH /usr/local/apache-toacat-9.0.35& V! S% l# i2 i& H
ENV PATH $PATHJAVA_HOME/binCATALINA_HOME/libCATALINA_HOME/bin
2 \. F7 Y" S% L+ D( C5 W( ?7 _& B$ s; o; H) c0 t* K2 Z
EXPOSE 8080
4 x7 M: t, n  V$ F  f% X& h& P6 I# N: N4 v8 q+ f
CMD ["/usr/local/apache-tomcat-9.0.35/bin/catalina.sh", "run"]
% c" \- n  n+ W, ]6 G8 [  b9 N( e
3.打包镜像
# 这里使用的是Dockerfile来明白的脚本,所以省略-f# L5 a8 k" h& B0 H9 B
docker build -t mytomcat .
% t: C. G* R5 I& d
4.启动镜像
docker run -d -p 3344:8080 --name mttomcat -v /home/fortuneteller/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/fortuneteller/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs mytomcat
3 Q" k- R8 \& F5 `* c+ l4 e: x
5.测试运行
微信图片_20201005212345.png
6.在宿主机的/home/fortuneteller/tomcat/test目录下创建WEB-INF目录与mt.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
& }1 W9 P6 E; j% `8 N" K) i" A<html>
% ?0 Y( W2 q( x9 V7 l<head>* K' f; b# {* c, c' Y; _
    <title>docker</title>3 \  `, t7 n. g% H- g7 _6 f$ e
</head>. g/ r% {! Z+ @5 Q  v6 m' }6 ]9 [, ]
<body>
- E; U# w$ _  J$ Y----------welcome------------
; `' C! @7 }* J) g<%="这是一个测试页面"%>
& E  {/ j$ E- M' {/ z0 W4 J' @</body>6 d) t7 c& g& W! o! h. U9 |
</html>& y; `9 r" z7 |3 e& p0 }
7.在WEB-INF目录下编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
1 s- P. n- e- [( s. a9 O<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
0 Z# t! A8 i+ w; ~: I" ?         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"5 Z) }( h' j( C
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"# @! L9 I8 d/ p2 p* E" `
         version="3.1">
0 j. B: C/ ]8 C# m6 q    <display-name>test</display-name>% M! ~6 c; Z" h5 L
</web-app>/ S7 d9 N0 J, ^, u! J
8.测试访问
微信图片_20201005212348.png 本地镜像上传阿里云
  • 登陆阿里云容器镜像服务
  • 创建命名空间
  • 创建仓库
  • 设置固定密码 微信图片_20201005212352.png 6 s. |- A% x( @" v; r$ `+ _
  • 查看自己的推送命令 微信图片_20201005212355.png 3 p( ~, F" y+ V2 O/ c- F: f
  • 使用推送命令完成上传 微信图片_20201005212358.png 5 Q1 b& N/ L7 y  [% o; x! L* U
  • 拉取时同理根据阿里云提示命令完成即可
    2 J- z7 r# T& _  x
Docker总结 微信图片_20201005212401.png Docker部署SpringBoot项目
  • 使用Maven构建获得jar包
  • 编写Dockerfile
    ; Y: d2 g4 h; V6 D) H2 G( J0 d6 l
FROM java:8. e8 g+ D8 Y0 L+ Y2 b
% M( V1 h# D. |$ s; M" J- V
COPY *.jar /app.jar
( s8 a8 C- ?- @8 \4 P; I
/ G% p3 i+ s, {4 vCMD ["--server.port=8080"]
% ^* q- _1 Y  b+ T0 x- Y
3 p) J- ?$ Z) I& YEXPOSE 8080! J' e2 A3 Q* C
5 e, q( s' t' e
ENTRYPOINT ["java", "jar", "app.jar"]4 \, |+ L! m* \! Z) W. z
  • 上传Docker与jar包到Linux服务器
  • 使用命令获得镜像
    ! p- G, V6 H* r& `
docker build -t ideatest .
. Y% X( j7 I/ |
  • 使用命令查看获取到镜像编号5 y/ q0 T8 T! o' L$ E
docker images+ M1 s" x  h( z6 o
  • 启动镜像
    * k# m8 H  f% p0 b* K  Q
docker run -d -p 3344:8080 ideatest  # 3344端口需要提前在阿里云放开% b9 Z8 C% L9 t, i" @
  • 测试访问
    - W; A! k! H3 R; F1 @
在浏览器输入:服务器ip:3344

2 j# W3 W0 M; \9 ^) V# A3 I- y
赞 收藏 评论0 发布时间:2020-10-5 21:26

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版