开场白
大家好,我是不爱折腾, 这期视频可以让大家学习到以下知识点。
- 什么是 docker?虚拟机他不香么?
- Docker 怎么安装?
- Docker 怎么使用?
怎么用Docker创建镜像?
请大家带着这四个疑问,听我给你一一解答。
首先是第一个问题什么是Docker,虚拟机他不香么?
要回答这个问题,咱们要先了解一个系统是由什么构造的
- 内核,是操作系统中最基本、最核心的部分,它负责管理计算机硬件资源,并为上层应用软件提供运行所需的基本服务和接口。内核的主要功能包括,进程管理、内存管理、设备管理、文件系统、网络通信
- 系统库是由一系列预先编译好的代码组成的软件库,这些软件库提供程序运行时所需的各种功能和服务。开发者在编写应用程序时,可以调用这些库中的函数,而无需从头编写所有的代码。
- 系统工具、任务管理器、磁盘工具、top、ls
- 用户程序 curl 、vim
虚拟机创建的时候会把内核、系统库、系统工具全部重新创建,而docker使用系统的内核,只需添加当前程序需要的系统库、即可运行,这样还带来了一个好处,忽略系统依赖不同带来的问题。就比如说你用windows在安装一些程序时,有些系统没有默认安装.NET库,你需要自己安装才可以使用该软件,如果此时可以用Docker的话,开发者就可以把相关依赖打包到Docker镜像里。
Docker由什么组成的?
- (Docker Engine) Docker 核心、命令行工具、REST API
- 镜像(Images)
- 容器(Containers)
- 仓库(Registry)
核心就是提供命令行、RESTAPI 来管理镜像、容器、运行的工具。镜像你可以理解为一个设计师设计的图纸,你可以根据这个来建造你自己的房子。容器就是你的房子,一个图纸可以建造多个房子,而仓库就是一个设计网站,设计师们把他们的作品上传到这个网站,你去这个网站下载图纸,然后建造自己的房子。
相信大家根据我讲的已经理解了Docker的构造以及基本的运行逻辑,如果理解请评论1、没理解请评论0。让我知道大家的学习情况。
安装Docker
下面呢先带搭建安装一个docker,不过安装之前咱们要先创建一个虚拟机,来运行docker。
- 下载ubuntu镜像: https://mirrors.ustc.edu.cn/
- 创建虚拟机
- 安装docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo DOWNLOAD_URL=https://mirrors.ustc.edu.cn/docker-ce sh get-docker.sh
不需要 sudo 使用 docker
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
sudo chmod a+rw /var/run/docker.sock
Docker 命令
安装好 docker 之后咱们来看一下 docker 的命令。命令会有这么几个部分。
镜像管理
- docker pull [IMAGE]:从远程仓库拉取镜像到本地。
- docker build -t [TAG] .:根据当前目录的Dockerfile构建新镜像。
- docker images:列出本地所有镜像。
- docker rmi [IMAGE_ID]:删除一个或多个本地镜像。
容器管理
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]:
启动一个新容器,可附加选项如-d后台运行,-p端口映射等。
- 例如-p 8080:80 ,左边是宿主机端口,右边是容器内端口。
- -v /etc/appconfig:/appconfig 同上
- -e NAME:BUZHETENG
- docker ps:列出所有正在运行的容器。
- docker stop [CONTAINER_ID]:停止一个或多个运行中的容器。
- docker start [CONTAINER_ID]:启动一个或多个已停止的容器。
- docker rm [CONTAINER_ID]:删除一个或多个容器。
- docker exec -it [CONTAINER_ID] bash:进入正在运行的容器内部。
容器日志与监控
- docker logs [CONTAINER_ID]:查看容器的日志输出。
- docker stats:显示所有容器的实时资源使用情况。
网络管理
- docker network ls:列出所有网络。
- docker network create [OPTIONS] [NETWORK]:创建一个新的网络。
- docker network rm [NETWORK]:删除一个或多个网络。
数据卷管理
- docker volume create [OPTIONS] [VOLUME]:创建一个数据卷。
- docker volume ls:列出所有数据卷。
- docker volume rm [VOLUME]:删除一个或多个数据卷。
创建镜像
然后是创建镜像,创建会用到一个文件,叫做Dockerfile 这是他的文档: https://docs.docker.com/reference/dockerfile/
常用到的会有这么几个
- *FROM: 设定基础镜像
- RUN: 执行命令
- COPY: 从宿主机复制文件到容器中
- ADD: 类似于COPY,但是更复杂,支持自动解压缩
- CMD: 容器启动默认执行的命令
- EXPOSE: 声明端口
- ENV: 设置环境变量
- ENTRYPOINT: 设置容器启动时运行的命令
VOLUME: 创建挂载点
下面我给大家演示一下创建一个测试镜像。
咱们先创建一个test
文件夹,mkdir test
创建 js 测试项目
需要有node环境
sudo apt install npm nodejs
npm init -y && npm install express
//index.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(80, () => {
console.log('Server is running on port 80');
});
然后创建一个文件
nano Dockerfile
FROM node:16
# 添加作者信息
LABEL maintainer="buzheteng.org"
WORKDIR /usr/src/app
#将当前目录内容复制到容器的 /usr/src/app
COPY . .
RUN npm install
EXPOSE 80
ENV NODE_ENV production
CMD ["node", "index.js"]
首先是基础镜像,一般程序都会依赖一些系统库,这时候就可以考虑基于带系统库的镜像来创建一个新的镜像,常用的有ubuntu、debian、alpine,然后就是维护者信息,这个顾名思义,一般是制作者的邮箱、网站。
然后是RUN,用于在容器创建完之后执行初始化命令,可以使用系统库的所有命令,比如mkdir、touch、curl,可以运行多次。WORKDIR是设置运行文件夹,比如你设置的/root,输入RUN pwd当前文件夹就是/root,设置/buzheteng,RUN pwd就是/buzheteng。
下面是COPY,用于将本地的文件、文件夹复制到容器内。
EXPOSE
用于告诉 Docker 容器服务监听的端口,但不直接映射这些端口到主机上。在运行容器时,你仍需要使用 -p
或 -P
参数来实际映射端口。
一次性也可以映射多个,比如
EXPOSE 80 443
CMD
指令用于指定容器启动时要运行的默认命令。每个 Dockerfile 只能有一个 CMD
指令,如果指定了多个,则只有最后一个生效。CMD
有三种主要的使用方法:
exec格式(推荐
CMD ["curl", "https://baidu.com"]
shell
CMD curl https://baidu.com
ENTRYPOINT格式,
ENTRYPOINT curl CMD https://baidu.com
有了这些知识,咱们就可以创建自己的镜像了,也就是前面说的图纸。在文件夹下运行下面的命令即可。
docker build -t buzheteng/test:v1 ./
本文由 不爱折腾 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。