Java填坑工程--Docker

Docker是一个开源平台,用于快速开发、部署和运行应用程序。它不是虚拟机,而是通过轻量级容器实现高效运行。文章介绍了Docker的安装、卸载、常用命令,以及核心概念如镜像、容器和数据卷。还讨论了Docker比虚拟机更快的原因,并强调了不要使用import/export等命令构建镜像。此外,文章探讨了Dockerfile用于构建镜像,Compose进行容器编排,以及Docker的网络配置。最后提到了Docker的整体架构和相关书籍推荐。
摘要由CSDN通过智能技术生成

Docker不是虚拟机,容器只是进程。

docker-image
Docker是什么:

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

简单理解:Docker的目标是“Build,Ship and Run Any App,Anywhere”,通过对应用组件的封装、分发、部署、运行等生命周期的管理,使开发的应用及其运行环境能够做到“一次镜像,处处运行”。

Docker不是虚拟机

一、Docker入门

1.1、Docker安装

以阿里云服务器centos7.7为例,参考官网安装步骤

#安装yum工具包
yum install -y yum-utils
#墙太高我太矮,更换repo源为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装最新版本的docker:23.0.1,
# 安装特定版本命令:添加版本号既可:yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 开启docker,
systemctl start docker
systemctl enable docker
# 验证docker安装成功
docker version

在这里插入图片描述

1.2、Docker卸载

# 卸载同样重要呀
# 停止服务
systemctl stop docker
# yum 删除
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 删除文件,含docker-engine及其他文件
rm -rf /var/lib/docker 
rm -rf /var/lib/containerd

FAQ1:镜像加速器的使用

虽然使用了阿里云的repo源,但在docker pull拉取镜像的时候,还是会很慢,确实墙太高我太矮,在这里可以使用 Docker 镜像加速器来解决这个问题。加速器就是镜像、代理的意思。阿里云服务器提供了免费的镜像加速器,注册阿里云开发账户后,访问这个链接这是阿里云镜像加速器地址,可以看到你自己的加速器地址:

通过修改daemon的配置文件,/etc/docker/daemon.json,使用加速器,配置方式如下:

mkdir -p /etc/docker

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

systemctl daemon-reload
systemctl restart docker

也有人不建议这么做,因为CentOS 7 开始使用 systemd 进行系统初始化管理,对于使用 systemd 的系统,应该通过编辑服务配置文件 docker.service 来进行加速器的配置。

FAQ2:为什么Docker会比VM虚拟机快?

(1) docker有着比虚拟机更少的抽象层

由于docker不需要实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际宿主机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

(2)docker利用的是宿主机的内核,而不需要加载操作系统OS内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

docker和虚拟机比较

1.3、Docker 常用命令,记录以当字典查

启动docker: systemctl start docker
停止docker: systemctl stop docker
查看docker状态: systemctl status docker
重启docker: systemctl restart docker
开机启动: systemctl enable docker
查看docker帮助文档: docker --help

1.4、Docker核心之Image

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们开发出应用程序后,将其和配置、依赖打包形成一个可交付的运行环境(代码、库、环境变量和配置文件等),这个运行环境就是image镜像文件。

docker的镜像实际上由一层一层的文件系统UnionFS组成。

常用命令

列出镜像: docker images
查找有关XXX的镜像:docker search centos
从仓库拉取镜像:docker pull centos:7.4
查看镜像/容器/数据卷所占的空间: docker system df 
删除某个镜像: docker rmi  -f 镜像ID
删除全部镜像:docker rmi -f $(docker images -a -q)
推送镜像到仓库:docker push 镜像名称:TAG
# 这个命令有点意思,在命名自己的镜像名称时,要符合私服命名规范:Host:Port/Repository:Tag,当执行docker push命令时,会解析到host、port、仓库名,上传自己的镜像。使用 docker tag命令修改符合规范的名称。

1.5、Docker核心之Container

镜像执行docker run 命令后产生容器,有镜像才能创建容器。

docker run 命令参数:
--name="容器新名字"       为容器指定一个名称;
-d: 后台运行容器并返回容器ID,启动守护式容器(后台运行)-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
 #使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 -it交互模式  -d 后台运行
docker run -it centos:7.4 /bin/bash 

常用命令:

#查看所有容器
docker ps OPTIONS
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
#停止容器
docker stop 容器ID或者容器名
#启动已停止运行的容器
docker start 容器ID或者容器名
# 删除已停止的容器
docker rm 容器ID
#杀死容器(我的理解就是先停止后删除)
docker kill 容器ID或容器名
#查看某个容器日志
docker logs 容器ID
# 产看容器内部细节
docker inspect 容器ID
#查看容器内运行的进程
docker top 容器ID
# 进入容器,
docker exec -it 容器ID /bin/bash #exec用exit退出,不会导致容器的停止。
docker attach 容器ID #attach 命令用exit退出,会导致容器的停止。
#退出容器 
exit  #exit退出,容器停止
ctrl+p+q # ctrl+p+q退出,容器不停止

1.6、Docker核心之容器数据卷

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能保存数据在docker中我们使用卷。

特点:
1:数据卷可在容器之间共享或重用数据.
2:卷中的更改可以直接实时生效,爽.
3:数据卷中的更改不会包含在镜像的更新中.
4:数据卷的生命周期一直持续到没有容器使用它为止.

使用方式:
第一种,在启动镜像的时候,使用-v参数 将docker容器内的数据保存进宿主机的磁盘中。

# docker run -it -v /宿主机绝对路径目录:/容器内目录      镜像名
 eg:docker run -it -v /software/do:/test --name myu2 ubuntu /bin/bash

第二种,复用其他容器的数据卷

#docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu,e8de是myu2的id前四位
docker run -it --volumes-from e8de --name myu3 ubuntu

二、Docker进阶

2.1、Dockerfile

Dockerfile解决镜像的由来问题, 其实在docker的容器命令中有这样一个命令:docker commit,可以利用现有的容器的副本,反向形成自己的镜像。

docker commit -m="描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

但不建议这样做。

因为使用 docker commit 制作的镜像被称为黑箱镜像,换句话说,就是里面进行的是黑箱操作,除creater外无人知晓。当有些东西需要改变时,或者因基础镜像更新而需要重新制作镜像时,忘记了之前的操作,会让一切变得很困难,失去了 Docker 的优势。

Dockerfile来了。

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程等等;

看不懂话,看看例子,以一个springboot项目为例:

第一步、编写Dockerfile文件,语法见官网Dockerfile语法

FROM java:8
# 作者
MAINTAINER swc
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为test_docker.jar
ADD springbootdemo2-0.0.1-SNAPSHOT.jar test_docker.jar
# 运行jar包
RUN bash -c 'touch /test_docker.jar'
ENTRYPOINT ["java","-jar","/test_docker.jar"]
#暴露8082端口作为微服务
EXPOSE 8082

2>将微服务jar包和Dockerfile文件上传到同一个目录下/software/test
qidong

3> 执行docker build -t 镜像名称:版本 .命令,构建镜像。

命令的最后有一点,看清了,看清了,看清了

在这里插入图片描述
镜像启动成功,开启容器。

在这里插入图片描述

浏览器测试。
在这里插入图片描述

FAQ3、为什么说不要使用 import, export, save, load, commit 来构建镜像?

import 和 export ,实际上是将一个容器来保存为 tar 文件,然后在导入为镜像。这样制作的镜像同样是黑箱镜像,不应该使用。而且这类导入导出会导致原有分层丢失,合并为一层,而且会丢失很多相关镜像元数据或者配置,比如 CMD 命令就可能丢失,导致镜像无法直接启动。

save 和 load 是镜像的保存和加载,但是这是在没有 registry 的情况下,只能手动把镜像CTRL C+ CTRL V,这同样是不推荐的,镜像的发布、更新维护应该使用 registry。

2.2 、Compose 容器编排

使用Dockerfile能够成功构建镜像,使用容器启动业务应用,但如果我们同时部署好多个服务,每个服务单独写Dockerfile的话,构建镜像、容器,累都累死了.所以docker官方给我们提供了docker-compose,多服务部署的编排工具。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

安装Docker的时候,我们已经安装了Compose

在这里插入图片描述
改造上面的springboot项目,

第一步,编写docker-compose.yaml文件

version: "3"
 
services:
  testService:
    image: demo:3.0
    container_name: web1
    ports:
      - "8088:8088"
    volumes:
      - /software/web:/data
    networks: 
      - web_net 
    depends_on: 
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db_test'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - web_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
networks: 
   web_net: 
 

第二步,执行 docker-compose up或者执行 docker-compose up -d容器启动,测试访问。

命令执行
Compose常用命令

docker compose up                           # 启动所有docker-compose服务
docker compose up -d                        # 启动所有docker-compose服务并后台运行
docker compose down                         # 停止并删除容器、网络、卷、镜像。

dokcer compose config     # 检查配置
dokcer compose config -q  # 检查配置,有问题才有输出

docker compose exec  yml里面的服务id                 # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker compose ps                      # 展示当前docker-compose编排过的运行的所有容器
docker compose logs  yml里面的服务id     # 查看容器输出日志

2.3、Network

Docker 启动会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

Docker network 总共有4种模式

模式命令
bridge-network bridge 默认使用docker0
host-network host
none-network none
container–network container:NAME或者容器ID指定

常用命令:

在这里插入图片描述

2.4、总结推荐

综合上述,Docker整体架构如图所示:
架构

参考书籍《Docker技术入门与实践》第三版,仅仅入门,多练多用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值