Docker学习

Docker概述

将jar包和环境一起打包,以降低项目部署的困难性

跨平台需求!

镜像(image):docker如模板,通过该模板创建容器服务。tomcat镜像->run->tomcat1容器(提供服务器)。通过该镜像可创建多个容器,(最终服务运行或者项目运行在容器中)。

容器(container):Docker利用容器技术,独立运行一个或一个组应用,通过镜像来创建。

命令:启动、停止、删除

将容器理解为一个精简linux

仓库(repository):存放镜像的地方。

公有仓库&私有仓库

Docker Hub(国外)

阿里云、网易云容器服务(镜像服务)

通过客户端启动docker容器,下载。

check OS version
……………………
# CE社区版
# 卸载软件包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# 安装.deb软件包
sudo dpkg -i ./containerd.io_<version>_<arch>.deb \
  ./docker-ce_<version>_<arch>.deb \
  ./docker-ce-cli_<version>_<arch>.deb \
  ./docker-buildx-plugin_<version>_<arch>.deb \
  ./docker-compose-plugin_<version>_<arch>.deb

#运行镜像验证Docker Engine是否安装成功
sudo service docker start
docker version
sudo docker run hello-world

帮助命令

帮助命令

docker version      # 版本信息
docker info         # 更详细系统信息,镜像&容器
docker 命令 --help  # 帮助命令

帮助文档

镜像命令

docker images 查看本地所有镜像

REPOSITORY  仓库源
TAG         镜像标签
IMAGE ID    镜像id
CREATED     镜像创建时间
SIZE        镜像大小

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

docker search 搜索镜像

# 可选项,通过收藏过滤
    --filter=STARS=***  # 大于***收藏数

docker pull 下载镜像

docker pull [:tag]
# 无tag则最新版
# 分层下载(联合文件系统)
# docker.io:真实地址
docker pull mysql:5.7

docker rmi 删除镜像

docker rmi -f 镜像id 镜像id ...     # 依据id删除镜像
docker rmi -f $(docker images -aq) # 递归删除所有镜像

容器命令

通过docker下载centos镜像

docker pull centos

新建容器并启动

docker run [可选参数] image
# 参数说明
--name="NAME"   # 容器名,用以区分
-d              # 后台方式运行 nohup
-it             # 交互方式运行,进入容器查看内容
-p              # 指定容器端口  -p 8080:8080
    -p  ip:主机端口:容器端口
    -p  主机端口:容器端口(常用)
    -p  容器端口
    容器端口
-P              # 随机指定端口
# 对于centos
docker run -it centos /bin/bash # 启动并进入容器
exit    # 停止并退出
Ctrl+P+Q    # 容器不停止退出

列出所有运行的容器

# docker ps 命令
    # 列出当前运行的容器
-a  # 列出当前运行的容器+历史运行过的
-n=# 显示最近创建的容器
-q  # 只显示容器的编号

删除容器

docker rm 容器id                # 删除指定容器,无法删除正在运行的容器
docker rm -f $(docker ps -aq)   # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器

启动和停止容器的操作

docker start    # 启动容器
docker restart  # 重启容器
docker stop     # 停止正在运行的容器
docker kill     # 强制停止当前容器

常用其他命令

后台启动容器

docker run -d 镜像名
# docker 容器使用后台运行,必须要有个前台进程,否则自动停止

查看日志

docker logs -f -t --tail [number] 要显示日志条数
    -tf     # 显示日志
    --tail number   # 显示日志数
# 查看容器中进程信息    ps
docker top 容器id

查看容器元数据

docker inspect 容器id

进入当前正在运行的容器

# 通常容器使用后台方式运行,需要进入容器修改配置
docker exec -it 容器id bashShell

# 方式2
docker attach 容器id

# 区别
docker exec     # 进入容器后开启新终端,可进行操作
docker attach   # 进入容器正在执行的终端,不会启动新进程

从容器内拷贝文件到主机

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

端口暴露的概念

# tomcat镜像 官方使用
docker run -it --rm tomcat:9.0

# 通常后台启动,停止容器之后,仍然可以查到容器, docker run -it --rm,一般用于测试,用完即删

# 一般方法
docker pull tomcat:9.0

# 查看
docker images

# 启动运行
docker run -d -p 外部端口:8080 --name tomcat01 tomcat

# 进入容器
docker exec -it tomcat01 /bin/bash

部署ES+kibana

# es 暴露的端口多
# es 耗费内存
# es 需要吧数据放置到安全目录,使用挂载的方式
# --net somenetwork ? 网络配置

# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 查看cpu状态
docker stats

# 测试ES是否成功
curl localhost:9200

# 关闭ES,增加内存限制,修改配置文件 -e

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

由于Linux的UFS,Docker的第一层为BootFS,通过其中的bootloader引导加载宿主机的kernel。

第二层用于获取发行版,rootfs,包含Linux系统中的标准目录和文件,为各种不同操作系统的发行版。

第三层定制化依赖包

第四层是docker层,容器层,仅该层可修改,可写入如代码程序等。

理解分层

如已有三层镜像层

在添加额外镜像层的同时,镜像始终保持是当前所有镜像的组合,如有两层,每层包含三个文件,镜像包含了来自两个镜像层的6个文件。

假设有三层镜像,在外部看来整个镜像只有六个文件,实际上是因为文件7是文件5的升级版本

Docker镜像都是只读的,当容器启动时,一个新的可写层被添加到镜像的顶部,即docker层,容器层。

当进行操作时,是对容器层进行操作,操作完成后,将镜像层和容器层一起打包成为一个新的镜像层。

Commit镜像

docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

# 如对tomcat进行操作
# 启动默认tomcat
# 进行修改
# 打包
docker commit -a="AAA" -m="reason" id tomcat02:1.0

容器数据卷

若将数据保存在容器中,当容器被删除,数据会丢失。因此,需要对数据持久化存储。

Docker容器中产生的数据同步到本地

目的:容器的持久化和同步操作,实现容器之间的数据共享

使用数据卷

# 1.使用命令挂载
docker run -it -v 主机目录:容器内目录
# 查看容器详细信息
docker inspect 容器id

尝试安装MySQL

# 获取镜像
docker pull mysql:5.7

# 运行容器,做数据挂载 启动时需要配置密码
# 启动
-d      # 后台运行
-p      # 端口映射
-v      # 卷挂载
-e      # 环境配置
--name  # 命名

docker run -d -p 3306: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

# 成功后,可从本地连接
# 即使将容器删除,保留在本地的数据也不会丢失
具名挂载和匿名挂载
# 匿名挂载
-v 容器内路径
-P 随机映射端口
docker run -d -P --name nginx01 -v /ect/nginx nginx

# 查看所有 volume 的情况 均为匿名, 只写了容器内的路径,并未指定容器外路径
docker volume ls

# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 通过 -v 卷名:容器内路径

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

通过具名挂载,可以方便的找到卷,大多数情况下使用的都是具名挂载

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

拓展:

# 可以通过在 -v 容器内路径:ro/rw 来改变读写权限
# 一旦设定容器权限,容器对挂载出来的内容就被限制
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
# ro:说明该路径只能通过宿主机操作,容器无权操作,只读

DockerFile

Dockerfile 即用来构建Docker镜像的构建文件、命令脚本,通过该脚本可生成镜像,每个命令都是一层

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "------end------"
CMD /bin/bash
docker build -f dockerfile -t 镜像name .
# 继承与绑定卷
docker run -it --name docker01 镜像id
Ctrl+P+Q
docker run -it --name docker02 --volumes-from docker01 镜像id
# docker01上创建的数据可同步到docker02上
# 删除docker01后,docker02仍然可访问

可实现:多个MySQL实现数据共享。

DockerFile

dockerfile是用于构建docker镜像的文件,为命令参数脚本。

步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、镜像仓库)

DockerFile指令

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

DockerHub中,大部分镜像都由基础镜像:FROM scratch,然后配置需要的软件和配置来进行构建

FROM centos
MAINTAINER 。。。。。。

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN ......

EXPOSE 80
CMD echo $MYPATH
CMD echo "-----END-----"
CMD /bin/bash
docker build -f file路径 -t name:[tag] .
# 制作tomcat镜像
# 1. 准备镜像文件,Tomcat压缩包,jdk安装包

# 2. 编写dockerfile文件,官方命名 Dockerfile, build会自动寻找,不用指定
FROM centos
MAINTAINER .......

COPY readme.txt /usr/local/readme.txt

ADD jdk-.......tar.gz /usr/local/
ADD apache-tomcat..... /usr/local/

RUN apt-get .....

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk...
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-....
ENV CATALINA_BASE /usr/local/apache-....
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat....../bin/startup.sh && tail -F /url/local/apache-tomcat...../bin/logs/catalina.out
# 构建
docker build -t diytomcat .
# 启动
# 发布
docker login -u username
docker push diytomcat:1.0

Docker 网络

Docker0

lo:本机回环
eth0:内网地址
docker0:docker0地址
# docker如何处理容器网络访问
# 启动tomcat服务
docker run -d -P --name tomcat01 tomcat

ip addr # 得到一个eth0@xxx,为docker分配

# linux可以ping通docker容器内部

原理:

  1. 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是veth-pair技术。
  2. 再启动一个容器,会再多一对网卡。veth-pair就是一堆的虚拟设备接口,成对出现,充当桥梁连接各种虚拟网络设备
  3. 所有容器在不指定网络的情况下,由docker0路由。

–link

将两个容器连接起来。

docker run -d -P --name tomcat02 --link tomcat01 tomcat

连起来后,两个容器可ping通,但是反向不行,需要额外配置。

本质上就是在hosts配置中加了一个映射

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值