Docker 原理和基础命令

Docker 原理和基础命令

基本原理

用任何一种技术首先都要先了解它的技术原理,做到心中有数。

Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

Docker 经常拿来和虚拟机来比较,因为它们两个的用处和用法都很相似,就是在一台实体机上启动多个虚拟系统(暂且这么说)。如果基于使用的层面来讲,你完全可以把 Docker 当做虚拟机来用,然而实际的底层技术原理是完全不一样的。

假设你现在变身了,站在了 Docker 和 虚拟机的内部,从里面向外看,发现虚拟机有自己的 CPU(虚拟 CPU)、内存、硬盘,再往外才是宿主机的 CPU、硬盘、内存等。而如果是在 Docker 内部向外看,发现你无论站在当前实体机的哪个容器里,看到的都是宿主机的 CPU、硬盘、内存等。说明 Dokcer 容器是直接拿宿主机的资源当自己的用,所以每个容器的硬件配置都是一样的,而虚拟机是完全虚拟出来一套。

基础命令

Dokcer 的命令有一大堆,但是常用的就那几个。

镜像相关

查找镜像

docker search 镜像名称

获取镜像

docker pull 镜像名称

查看镜像列表

docker image ls
容器相关

查看容器

docker ps -a

新建并启动容器

docker run -t -i ubuntu:12.04  /bin/bash

进入容器

docker exec -it 容器id bash

安装 Docker Desktop

接下来开始本地实践了,用 Docker 快速搭一套本地环境。

有一些 Docker 的可视化客户端可以安装,帮我们更方便更直观的管理镜像、容器,当然如果你很厉害的话,完全用命令行也不是不行。

作者就没这么厉害了,那些参数根本记不住,所以必须要装客户端。作者安装的是 Docker Desktop,官方客户端,支持 Mac、Linux、Windows

如果你只用 Mac 的话,也可以安装 OrbStack(https://orbstack.dev/),据说比 Docker Desktop 要流畅一些。

下载安装

访问 Docker Desktop 官网 https://www.docker.com/products/docker-desktop/,根据你的系统下载对应的版本。

在这里插入图片描述

下载完一键安装就可以了,Docker 环境直接帮你装好了,省心省事儿。下面是它的控制台界面。左侧导航可以查看镜像列表、容器列表、映射的Volumes。

在这里插入图片描述

我们在命令行输入 docker -v,如果出现正确的版本号,说明 docker 服务已经安装正常了。

Docker version 24.0.2, build cb74dfc

接下来有一件事儿是必须要做的,那就是设置国内镜像源,道理大家都懂,你要是用国外的镜像源,一天都不一定能搞下来一个。

点击「设置」按钮,在左侧选择「Docker Engine」

在这里插入图片描述

然后在右侧的配置框中添加如下配置,加到最下面即可:

"registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com/"
  ]

加完后,点击「Apply & restart」,这时候会重启 Docker 服务。

安装一个服务

图形化界面部署posgresql

在这个搜索框输入关键词,查找对应的镜像,我在这里输入关键词 PostgreSQL。如果安装 Nginx 那就是输入 Nginx,以此类推。

在这里插入图片描述

search看,出来了一大堆,我一般都是找第一个,也就是下载量最大的这个。

在这里插入图片描述

可以 pull 或者 run,pull 是拉取镜像,run 是拉取镜像+启动容器。

在这里插入图片描述

一般都是直接 run,点一下 run,等一会儿,因为前面已经设置了国内镜像源,所以速度很快,十几秒钟。(根据网速快慢不同,因为要下载镜像文件,有的应用有上百M)

下载完之后,因为选的是 run,所以直接弹出了启动参数。

在这里插入图片描述

设置镜像名称

容器名称(Container name)就是为了我们一看到它就知道是干什么的,用来方便管理的,我就直接命名为 PostgreSQL了。

设置端口映射(Ports)

服务本身有自己的端口,例如 MySQL 是3306,这是服务本身在容器内的启动端口,但最终我们要通过宿主机去访问服务,所以要将这个容器内的端口绑定到一个宿主机端口,这叫做端口映射,这样一来,我们就可以通过宿主机的端口访问到容器内的端口了。比如将 MySQL 容器的 3306 端口映射到宿主机的 13306 端口,之后在设置数据库连接的时候,就用本机 IP:13306就能访问 MySQL 容器了。

在这个 PostgreSQL 容器上,将本机的 15432和容器的 5432端口绑定,之后就可以用 15432做连接端口了。

目录映射(Volumes)

很多服务都会用到存储目录,但是容器本身就在宿主机上,所以需要将服务在容器内的目录映射到宿主机的目录上,这叫目录映射。例如将 Nginx 容器的 /etc/nginx目录映射到宿主机的 /apps/nginx/目录上,那之后在宿主机访问 /apps/nginx目录时,就能看到 Nginx 容器的配置文件了。

在这个PostgreSQL 容器上,作者将 /etc/postgresql/postgresql.conf配置文件映射到了其本地的一个目录上。

环境变量

一个服务启动可能会用到启动变量,这些变量可以通过环境变量的方式进行配置。例如,我们启动一个 Java jar 包,要配置 JVM 相关的参数,这些参数就可以放到环境变量中,供启动的时候使用。

因为 PostgreSQL 需要密码,所以这里就设置一个密码的环境变量 POSTGRES_PASSWORD

都设置好之后,点击run按钮,启动容器。

然后我们看到容器已经启动了,有相应的日志打印出来。

在这里插入图片描述

然后点击左侧的Containers,可以看到已经启动的容器和一些基本配置。

在这里插入图片描述

然后就可以通过客户端进行连接了。

在这里插入图片描述

在这里插入图片描述

另外,还可以在容器详情中查看容器的内部文件、状态、配置信息、日志等,以及进入命令行。

在这里插入图片描述

部署nginx

先查找nginx的镜像

docker search nginx

在这里插入图片描述

拉去nginx镜像,这里直接nginx的最新版本

docker pull nginx

在这里插入图片描述

创建好容器需要挂载的目录和文件

在这里插入图片描述

在这里插入图片描述

以下有两种方式来运行容器

第一种使用docker desktop图形化界面来运行

在这里插入图片描述

在这里插入图片描述

ps:启动容器时,点击三个点,只能选中目录,无法选择文件,如果需要选择文件,则自己手动添加。

在这里插入图片描述

第二种使用命令行
docker run
-p 9002:80 --name nginx
-v D:/software/Docker_Volumes/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v D:/software/Docker_Volumes/nginx/log:/var/log/nginx
-v D:/software/Docker_Volumes/nginx/html:/usr/share/nginx/html
-d nginx:latest

关于命令参数的解释

在这里插入图片描述

部署zookeeper

准备好需要挂载的文件夹和配置文件

在这里插入图片描述

在这里插入图片描述

zoo.cfg

dataDir=/data  # 保存zookeeper中的数据
clientPort=2181 # 客户端连接端口,通常不做修改
dataLogDir=/datalog
tickTime=2000  # 通信心跳时间
initLimit=5    # LF(leader - follower)初始通信时限
syncLimit=2    # LF 同步通信时限
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
server.1=localhost:2888:3888;2181

docker run 
-d  --name zookeeper --privileged=true 
-p 2181:2181  
-v D:/software/Docker_Volumes/zookeeper/data:/data 
-v D:/software/Docker_Volumes/zookeeper/conf/conf 
-v D:/software/Docker_Volumes/zookeeper/logs:/datalog  zookeeper

docker安装容器时挂载目录,该怎么知道容器有什么目录?

如果是第三方镜像

应该熟读官方文档,在http://hub.docker.com 找到镜像,并仔细阅读说明。

例如,MySQL的镜像下面说的非常仔细且清晰,如何映射目录这些操作。

如果是公司内部镜像,可以统一路径,统一输出位置,或者使用环境变量。

如果是无名镜像,比较野,那就手动启动一个docker run --rm -it image /bin/sh,进去看

jar包封装成docker镜像并运行

  1. 新建dockerFile文件(无后缀名)
#通过FROM指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,必须位于第一条非注释指令 FROM <IMAGE> 或FROM<IMAGE>:<TAG>
FROM java:8
#用于向容器添加卷,可以提供共享存储等功能 VOLUME ['/data']
VOLUME /tmp
#ADD和COPY
#添加jar到镜像并命名为sys-service.jar
ADD sys-service.jar sys-service.jar
#与CMD类似,ENTRYPOINT不会被docker run中指定的命令覆盖,如果想覆盖ENTRYPOINT,则需要在docker run中指定--entrypoint选项
#下面"/app.jar" 必须与上面第七行复制位置一致
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/sys-service.jar"]
#指定运行该镜像的容器使用的端口,可以是多个。EXPOSE <PORT> 
EXPOSE 8101
  1. 将dockerFile和jar包放在一个目录下

在这里插入图片描述

3.此处打开cmd,并输入命令打包镜像

docker build -t sys -f D://a//dockerFile .

  • -t 指定文件名
  • -f 指定dockerFile
  • 命令行最后必须有 .

再打开dockerDeskTop刷新可看见制作的镜像

“/sys-service.jar”]
#指定运行该镜像的容器使用的端口,可以是多个。EXPOSE
EXPOSE 8101


2. 将dockerFile和jar包放在一个目录下

[外链图片转存中...(img-QjKfnOQ5-1692262449172)]

3.此处打开cmd,并输入命令打包镜像

`docker build -t sys -f D://a//dockerFile .`

- -t 指定文件名
- -f 指定dockerFile
- 命令行最后必须有 .

再打开dockerDeskTop刷新可看见制作的镜像



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值