ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker学习笔记

2022-01-27 21:34:00  阅读:114  来源: 互联网

标签:容器 tomcat -- 笔记 id 学习 镜像 Docker docker


Docker

概述

Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。

和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。

组成

镜像

docker镜像 相当于一个模板, 通过这个模板来创建容器服务,可以创建多个容器

联合文件系统

下载B镜像时,如果已下载镜像A有部分内容重复,那么这部分内容将复用,复用的部分称为镜像的镜像层,而下载的部分为容器层

容器

docker利用容器技术,独立运行一组应用

启动 停止 删除 基本命令

理解为一个简易的linux系统

仓库

公有仓库和私有仓库 docker hub(默认是国外的)

阿里云 有容器服务器(镜像加速)

存放镜像!

安装

卸载旧的

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

在linux上安装docker

软件包

sudo yum install -y yum-utils
//设置镜像仓库 阿里云 默认是国外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新软件包索引

yum makecache fast

安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

命令

启动

systemctl start dockers
systemctl start docker.service

查看版本

docker version

运行hello-world镜像

docker run centeros /bin/echo "Hello world"
# Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

查看镜像

docker images

卸载

sudo yum remove docker-ce docker-ce-cli containerd.io

sudo rm -rf /var/lib/docker

sudo rm -rf /var/lib/containerd

帮助命令

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

docker version  # 显示docker版本信息
docker info  # docker系统信息 包括镜像和容器数量 
docker 命令 --help #帮助命令

镜像命令

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

#解释
REPOSITORY 镜像的仓库源
TAG   镜像的标签
IMAGE ID 镜像id
CREATED  镜像的创建时间
SIZE  镜像大小
# 可选项
-a --all # 列出所有镜像
-q --quiet # 只显示id

docker serach 搜索镜像名(如mysql)

--filter=STARS=3000 搜素出来的镜像starts大于3000的
例子 docker search mysql --filter=stars=5000

docker pull 下载镜像

docker pull 镜像名:版本
docker pull mysql等价于
docker pull mysql docker.io/libray/mysql:latest

docker rmi 删除镜像

docker rmi -f 镜像id                    删除容器
docker rmi -f 镜像id 镜像id 镜像id   删除多个容器
docker rmi -f $(docker images -aq)  删除全部容器

容器命令

有了镜像后 才能创建容器

下一个centeros

docker pull centos

新建容器并启动 ,操作对象是镜像, 进入后可修改镜像内的文件

docker run [可选参数] image

#参数
-t  在新容器内指定一个伪终端或终端。
-i  允许你对容器内的标准输入 (STDIN) 进行交互。
--name="Name" 容器名字
-d 以后台方式运行 nohup
-it 使用交互方式运行
-p 指定容器的端口 -p 8080:8080
-P 随机指定端口
--restart alway  # always容器退出时重启  on-failure:容器故障退出(返回值非零)时重启 no:容器退出时不重启
 -v 宿主机目录:容器目录  #
  30                   [OK]
# 启动并进入容器
docker run -it centos /bin/bash
exit 会退出并停止容器运行

列出所有运行的容器

docker ps

docker ps #当前正在运行的
-a        #加上历史运行过的
-n=?      #显示最近运行过的
-q        #只显示容器id 

退出容器 启动容器

exit # 停止并退出
Ctrl + P + Q #不停止退出
docker stop 容器id # 退出后 停止运行容器
docker start 容器id
docker restart 容器id
docker kill 容器id #强制..

删除容器

docker rm 容器id               #删除指定容器
docker rm -f $(docker ps -aq) #删除所有容器 

启动容器和停止容器

docker start 容器id
docker restart 容器id
docker stop 容器id 
docker kill 容器id

进入正在运行的容器

#退出当前容器
exit 
# 进入容器 并新起命令行 
docker exec  -it 容器id bash
#进入正在运行的命令行
docker attach 容器id bash 

docker run 和docker exec的区别

  • docker run 根据镜像创建一个容器,然后操作镜像
  • docker exec 是进入一个正在运行的容器

根据容器创建一个新镜像

docker run -it -p xxx  #启动容器
修改容器内的内容

新开一个窗口
docker commit -m="一次提交的信息"  [要修改的容器id] 新的镜像名  #提交镜像
docker commit -a='yc9064' -m='docker新镜像提交测试' 96dd74b37e87 mynginx:v1

docker images #查看重新打好的镜像

docker run -d -p 8080:80 --name mynginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  mynginx:v1
  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

常用其他命令

后台启动

docker run -d centos 
#发现问题
docker ps 发现停止了
后台运行 必要有一个前台进程  docker发现没有应用会自动停止

常看日志

#执行循环脚本
docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;donre"

#查看容器id
docker ps

#查看输出的日志
docker logs -tf --tail 100 容器id

查看容器中进程信息

docker top 容器id

3.查看容器的元数据

docker inspect 容器id

从容器内拷贝文件到主机

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxSBlhvO-1640666584521)(.\img\1.png)]

阿里云镜像加速

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

找到镜像加速地址

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{   
  "registry-mirrors": ["https://5gw6wzma.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

使用镜像

安装nginx

docker pull nginx
#查看开放的端口号
firewall-cmd --list-ports 
#开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent 
#重启
firewall-cmd --reload 
#-p暴露端口(容器的) -d 后台运行 -name 给容器取名
#运行 nginx容器, 名字为nginx01 使用机器的8080端口映射到容器的80端口 
# --restart always重启docker后启动容器
[root@masterServr ~]# docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
b435252b28d1b6a6bf944d470102371658744e10f948b6632249d3e59a0b9311

[root@masterServr ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
b435252b28d1   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
f67252424cc0   centos    "/bin/bash"              18 hours ago     Up 18 hours                                             silly_zhukovsky


安装tomcat

# --rm     停止就删除 用来测试
docker run -it --rm tomcat:9.0

开放端口号
docker pull tomcat:9.0

docker runn -d -p ...

访问url,得到tomcat 404页面

进入容器中的webapp目录 发现为空

说明tomcat镜像被缩减

原因:默认是最小镜像,所有不必要的东西都剔除

容器数据卷

问题:如果数据存在容器中,那么我们删除容器,数据也一并被删除了.

需求: 数据可以持久化.

将容器内的目录挂载到主机上即可

总结: 为了容器的持久化和同步操作,容器间目录也可以共享

命令 -v 主机目录:容器目录

例:

docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx

具名和匿名挂载

docker  run ...  -v  [容器内目录] ... # 匿名

docker  run ...  -v  [取个名字]:[容器内目录]:[文件权限 ro/rw] ... # 具名  ro是容器文件只读权限,要改变文本需要走宿主机
docker volume ls # 查看所有挂载
docker inspect [volumeName]

容器间文件同步

容器间信息的传递, 比如mysq容器的l数据同步

docker run -it --name docker01 xxx:1.0
#把dcoker02 绑定到docker01  数据同步
docker run -it --name docker02 --volumes-from dcoker01 xxx:1.0


docker run -it --name docker01 mycentos:v1 bash
docker run -it --name docker02 --volumes-from docker01 mycentos:v1 bash

DockerFile

用来构建docker镜像的构建文件,一段命令脚本

所以 我们不仅可以通过修改容器并commit构建新的镜像到本地 ,也可以通过 docker build [dockerfile文件] 的方式来构建镜像

DockerFile构建过程

我们以后发布项目 ,做镜像 就要编写dockerfile

基础知识:

1.每个保留关键字(指令)必须大写

2.从上到下执行

3.#表示注释

4.每一个指令都会创建提交一个新的镜像层,并提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPCpp8pD-1640666584523)(.\img\2.jpg)]

Dockerfile指令详解

  • FROM

    基础镜像, FROM centos

  • MAINTAINER

    标注作者和邮箱 FROM liuyinchuan yc906478@163.com

  • RUN

    此操作会影响镜像

    • RUN [command]

      shell中使用/bin/sh运行command 比如 RUN echo '这个容器的镜像是通过dockerfile构建的' > readMe.txt

    • RUN ['指定程序','参数1','参数2']

      RUN["/bin/bash","-c","echo hello"]

  • CMD

    CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,

    构建镜像后,若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令

    CMD ['指定程序','参数1','参数2']

  • ENTRYPOINT

    与CMD类似

    构建镜像后,若容器启动时指定了运行的命令,则会在原来的指令中追加

  • EXPOSE

    暴露端口配置 也可 run的时候加上 -p 【端口号】

  • ADD

    加入文件到镜像内 如果是压缩包 会解压缩

    ADD [源文件路径] [镜像内路径]

  • COPY

    与ADD类似 不会解压文件

  • ENV

    设置容器环境变量

    ENV JAVA_HOME=/usr/local/jdk_1.8.201/

  • WORKDIR

    为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

    WORKDIR /path

FROM		#基础镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR		#镜像的工作目录	
VOLUME		#匿名挂载的目录
EXPOSE		#暴露端口配置  也可 run的时候加上 -p 【端口号】
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY 		#类似ADD,将我们文件拷贝到镜像中

例:

新建一个dockerfile1

上传 jdk-8u281-linux-x64.tar.gz

vim dockerfile1

FROM centos                        # 使用centos作为基础镜像
MAINTAINER OBy yc906478@163.com

ENV MYPATH=/usr/local
WORKDIR $MYPATH

VOLUME ["volume01","volume02","volume03"]   #匿名挂载目录 

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo
CMD echo "---end---"
CMD /bin/bash
docker build -f dockerfile1 -t mycentos:v1 . #使用当前目录的dockerfile构建v1版的mycentos
docker run -it my

构建镜像

编写好dockerfile后, 可构建镜像到本地

docker build -t nginx:v3 .
docker build -f dockerfileName -t /filepath .

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

实战

Centos

创建名为Dockerfile的文件,这样不输入文件名build的时候会 找到这个文件

FROM centos:7                       
MAINTAINER OBy yc906478@163.com

ENV MYPATH=/usr/local
WORKDIR $MYPATH

VOLUME ["volume01","volume02","volume03"]

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo "---end---"
CMD /bin/bash

构建:

docker build -f mydockerfile-centeros -t mycentos:0.1 

Tomcat

Dockfile

FROM centos
#作者
MAINTAINER yc 906478612@qq.com
#拷贝tomcat jdk 到镜像并解压
ADD apache-tomcat-8.5.73.tar.gz /usr/local/tomcat
ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk

RUN yum -y install vim
#定义交互时登录路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk 和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.73
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#设置暴露的端口
EXPOSE 8080
#运行tomcat
CMD /usr/local/tomcat/apache-tomcat-8.5.73/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.73/logs/catalina.out

docker run -d -p 8080:8080 --name mytomcat -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.73/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.73/webapps/ diytomcat

标签:容器,tomcat,--,笔记,id,学习,镜像,Docker,docker
来源: https://www.cnblogs.com/yc9064/p/15851265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有