草庐IT

Docker使用总结

xushiyu1996818 2023-12-15 原文

目录

Docker安装

linux环境下安装

阿里云镜像加速

Docker基础使用 

Docker安装tomcat与运行删除

Docker常用命令

Docker宿主机与容器通信

Dockerfile基础指令

FROM-基于基准镜像

LABEL & MAINTAINER - 说明信息

WORKDIR - 设置工作目录

ADD & COPY - 复制文件

ENV - 设置环境常量

EXPOSE - 暴露容器端口

Dockerfile执行指令

RUN-构建时运行

Shell运行方式

Exec运行方式

ENTRYPOINT启动命令

CMD默认命令

通过Dockerfile构建Redis镜像 


Docker安装

linux环境下安装

Install Docker Desktop on Linux

Install Docker Desktop on Ubuntu

centos环境下安装

yum install -y yum-utils device-mapper=persistent-data lvm2
安装docker数据存储所需的软件,docker安装的工具包

yum-config-manager --add-repo http://mirrors.aliyum.com/docker-ce/linux/centos/docker-ce.repo
为yum安装源选择新的仓库,国外的太慢了,注意ce是开源版本的docker

yum makercache fase
让yum查看哪个安装源速度最快

yum -y install docker-ce
安装开源的docker

service docker start
启动docker

docker version
查看docker版本,能够看到是否安装成功,注意,里面会有docker客户端和服务端的信息,都安装了,默认客户端直连本机的服务端

docker pull hello-world
从国外的镜像仓库,拉取hello-world镜像(如果很慢,可以使用阿里云的加速代理)

docker run hello-world
运行镜像,看是否出现hello-world

阿里云镜像加速

阿里云-为了无法计算的价值

进入网站,登录后,搜索,容器镜像服务,点击开通

左侧栏里,镜像中心-镜像加速器,有一个加速器地址,每个用户都不同

找到下面对应的操作系统版本,复制代码,到系统执行即可

Docker基础使用 

Docker安装tomcat与运行删除

Docker

这是docker镜像的仓库 

进入后搜索tomcat,点击第一个,可以查看各个版本

 overview这里可以看到,每个版本,对应的其他配置环境

 再下面是如何使用镜像的说明

docker pull tomcat
抽取tomcat最新的版本

docker pull tomcat:8.5.87-jdk8-corretto-al2
或者执行这个,抽取对应的版本

docker images
可以看到本地的镜像,对应的版本和id

docker run tomcat
创建最新版本tomcat的容器,并且启动tomcat,默认是8080端口

crtl+c
退出tomcat,容器会停止

docker run -p 8000:8080 tomcat
启动新的tomcat,并且外部机器的8000映射容器的8080端口

然后外面的chrome浏览器,访问xxx.xxx.xxx.xxx:8000,即可访问,xxx为虚拟机的ip地址

netstat -tulpn
查看虚拟机端口使用情况,可以看到8000,并且对应docker-proxy,代理进行端口的转发

crtl+c
退出,注意:之前的run都是前台运行,不能退出

docker run -p 8000:8080 -d tomcat
-d表示在后台运行tomcat,会返回一个容器编号

docker ps
查看当前运行的容器,可以看到tomcat的容器id,端口映射,最后执行的命令

docker stop xxxxx
xxx为tomcat容器的id,停止tomcat服务

docker rm xxxxx
xxxx为tomcat容器的id,需要容器停止再删除

docker rm -f xxxxx
xxxx为tomcat容器的id,可以不用停止即可删除容器

docker images
查看本机的镜像

docker rmi tomcat:xxxxx
xxx为版本号,删除本机的tomcat镜像,注意需要所有运行的容器都要被删除

docker rmi -f tomcat
强制删除tomcat镜像

Docker常用命令

docker pull 镜像名<:tags>-从远程仓库抽取镜像

可以有版本号  例如 docker pull tomcat:7     拉取tomcat7

如果不写版本号,默认是最新的版本

docker images - 查看本地镜像

docker run 镜像名<:tags> - 创建容器,启动应用

如果本地没有镜像,会先进行pull到本地

docker ps - 查看正在运行中的镜像

docker rm <-f> 容器id - 删除容器

-f表示强制参数

docker rmi-<-f> 镜像名:<tags> - 删除镜像

-f表示强制参数

Docker宿主机与容器通信

132装的物理机,里面的tomcat容器端口8080,不能通过192.168.163.132:8080进行访问,需要进行端口映射,8000和8080进行映射,这样,192.168.163.132:8000即可访问,会转发给容器内部的8080端口。用户只需要知道对外暴露的端口,而且这样以后还可以改变容器内部的端口号,或者从tomcat改成其他服务,只需要对外提供的端口一样即可。

 

Dockerfile基础指令

FROM-基于基准镜像

FROM centos #制作基准镜像(基于centos:lastest)

FROM scratch #不依赖任何基准镜像base image

FROM tomcat: 9.0.22-jdk8-openjdk

尽量使用官方提供的Base Image

LABEL & MAINTAINER - 说明信息

MAINTAINER mashibing.com

有哪个机构维护

LABEL version = "1.0"

对文件进行描述,没有真实的意义,类似于注释

LABEL description = "无龙"

WORKDIR - 设置工作目录

WORKDIR /usr/local

WORKDIR /usr/local/newdir    #会自动创建文件夹

尽量使用绝对路径

ADD & COPY - 复制文件

两个指令基本一样,可以替换

ADD hello / #复制到根路径

ADD test.tar.gz / #添加根目录并解压

ADD 除了复制,还具备添加远程文件功能

ENV - 设置环境常量

ENV JAVA_HOME /usr/local/openjdk8

类似于装jdk时,要设置java_home环境常量,然后可以使用${xxx}进行替换对应的值

RUN ${JAVA_HOME}/bin/java -jar test.jar

尽量使用环境常量,可提高程序维护性
 

EXPOSE - 暴露容器端口

将容器内部端口暴露给物理机

EXPOSE 8080

docker run -p 8000:8080 tomcat

Dockerfile执行指令

RUN & CMD & ENTRYPOINT

RUN  : 在Build构建时执行命令

在创建镜像时,对镜像内部的文件或者资源执行命令,镜像创建完后,镜像就是只读的

这两个都是容器创建时,对容器执行的命令

ENTRYPOINT : 容器启动时执行的命令

CMD : 容器启动后执行默认的命令或参数

不同的执行时机

RUN-构建时运行

RUN yum install -y vim  #Shell 命令格式

正常的linux语句

RUN ["yum","install","-y","vim"] #Exec命令格式

具体和上面一样,但是最外面是中括号,里面是双引号和逗号

Shell运行方式

使用Shell执行时,当前shell是父进程,生成一个子shell进程

在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。

Exec运行方式

使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变

执行完毕,直接退出,并不会退回之前的进程环境

如果不清楚,推荐使用exec方式

ENTRYPOINT启动命令

ENTRYPOINT(入口点)用于在容器启动时执行命令

Dockerfile中只有最后一个ENTRYPOINT会被执行

ENTRYPOINT ["ps"] #推荐使用Exec格式

CMD默认命令

CMD用于设置默认执行的命令

如Dockerfile中出现多个CMD,则只有最后一个被执行

如容器启动时附加指令,则CMD被忽略(不一定被执行)

CMD ["ps" , "-ef"] #推荐使用Exec格式

cmd和entrypoint如果单独使用,没有啥区别,只是根据容器启动附加指令,判断是否执行。

但是2者可以组合使用,先输入entrypoint,再输入cmd,cmd可以作为前者的参数。同时,由于cmd可以被外来的指令覆盖,这样就可以修改这个参数,更加灵活

 

通过Dockerfile构建Redis镜像 

首先需要redis的压缩包和对应的配置文件

然后将2个文件放入docker的image目录下的docker-redis目录里面,然后里面再创建一个dockerfile文件

dockerfile里面,先基于centos,然后安装redis需要的配置软件,一些编译和网络程序

切换到local目录,将压缩包解压到里面

再进入到解压完的源代码目录,对源代码使用gcc进行编译和安装

切换到redis目录,将配置文件复制到里面

暴露7000端口

最后容器启动时,利用redis-server这个可执行文件,根据redis-7000这个配置文件,运行server端

根据dockerfile生成镜像

docker run即可启动容器

有关Docker使用总结的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐