超细致docker学习
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 是一个开源的平台,我们可以用 Docker 来开发、部署和运行我们的应用程序。Docker 可以帮助我们将应用程序和底层基础设施进行分离,以帮助我们更快的实现交付。通过 Docker 技术,我们可以像管理我们的应用一样管理我们的基础设施(比如操作系统、依赖的开发包等)。通过 Docker 技术,可以精简我们的整个开发和交互流程。
没了解过的人听上去可能会有些蒙(反正当时我蒙了🤣),这是什么意思呢?
众所周知,一个程序的运行需要各种环境:从操作系统到运行时环境再到各种包依赖,这些都需要我们去弄好,一般我们都是在本地开发,然后将自己的应用部署到服务器上去,那么我们在本地执行的这一系列操作都需要再在服务器上执行一遍,这对追求方便的程序员来说简直不可忍😡,更要命的是由于各种原因比如操作系统不同,你在本地的代码能正常跑,在服务器上可能跑不起来。
docker就是很方便的解决这个问题的,它提供了一种沙盒机制,将软件运行所需要的各种依赖和软件本身打包到一个“盒子”中,当我们需要部署应用时只需要把这个盒子传到需要的地方打开使用就好😆。
看到这里,了解过虚拟机的小伙伴可能会发现:唉,这和虚拟机虚拟化出一个操作系统似有异曲同工之妙,难道docker也是应用虚拟化技术虚拟出一个操作系统然后把应用一起打包吗?
非也,docker和虚拟机所用技术是有区别的,虚拟机是通过 Hypervisor(虚拟机监控器)在物理硬件上创建一个完整的虚拟硬件层,模拟 CPU、内存、存储等资源,然后在其上安装独立的操作系统(Guest OS),再运行应用程序。也就是说它会分出计算机的一部分资源来进行虚拟化,对计算机负荷较大。
为解决虚拟机过于冗余的问题,人们提出了一种Linux容器的方法,它并不会去模拟完整的操作系统,而是对一个进程进行一层封装,对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。它会使用我们计算机自己的系统资源,而不需要去在此虚拟化出一个完整的操作系统,所以使它具备启动快,占用小的优势。
但由于docker需要的是Linux的核心,如果在windows上使用需要开启 Hyper技术,或者下载wsl。不过目前似乎好像已经内置。
docker的用途
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
如何安装docker
Get Docker | Docker Docs在该网址下载即可。
注册登录完成后我们需要配置一下镜像代理,因为国内从docker官方源拉取镜像小慢。
在这里修改为
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.1ms.run"
]
}
如果是云服务器
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
创建一个镜像代理文件,增添mirror即可。
docker必知概念
镜像
镜像即image,他的本质是二进制文件,docker会把你的应用程序与环境打包成一个image文件,你可以把image文件看作一个可以运行的程序模板,开箱即用。通过image文件,我们才可以生成docker容器,同一个image文件可以生成多个容器实例。
一般我们在构建镜像时会在一个基础镜像的基础上进行一些个性化的添加,构建好的镜像可以传到自己的私有云仓库在云上使用或者docker hub供其他人使用。
容器
容器就是镜像所产生的实例(进程级别),如果将镜像比作模具,容器就可以看作模具制作的产品,所以可以有很多同一镜像产生的容器,并且由于沙盒机制,本质上使用的是Linux的Namespace + CGroup 机制(有兴趣可以去多做了解),容器间彼此隔离互不影响,所以可以同时运行多个容器。
dockerfile
如何构建镜像的脚本,就像菜谱一样,按照dockerfile的步骤一步步制作出镜像这个菜肴。
docker 网络
docker使用Linux桥接网卡,在宿主机虚拟一个docker容器网桥(docker0),docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网络网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。
如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p或-P参数来启用,访问容器的时候就通过宿主机IP:容器端口访问容器。

默认是bridge模式。
docker compose
它是一个定义与启动多个(当然也可以启动一个)docker容器的工具,下面会提到启动容器的命令,不同的容器可能需要不同的参数,那些参数甚至会很多(比如es),或者有时候有些容器需要配合使用(比如你的应用容器依赖mysql容器),但我们不想要每次都去终端敲那么多繁琐重复的命令,docker compose很好的解决了这个痛点,它可以让我们实现一键启动容器,你没有的镜像也会自动帮你拉取,真是妙极😆
windows安装docker desktop后就已经内置了docker compose了,如果是在服务器上,可以通过一下命令安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
docker常用指令
image
docker image ls //查看所有的镜像
docker image pull image-name//拉取镜像
docker image rm image-name(id前四位)//删除镜像
docker build -t image-name ./locate //build镜像
docker push image-name:tag//上传镜像
docker run imagename:tag(或id) -p 宿主机端口:容器端口 --name containername
//这些中间一般都有一堆可选参数,建议自己下去学习学习。
container
docker ps (-a)//列出容器(-a 则包含已退出的)
docker start //启动
docker stop //停止
docker restart //重启
docker rm //删除
docker logs //显示日志
docker exec //进入容器
端口和网络
docker network ls //查看所有创建的docker网络
docker network create name //创建docker网络
docker network rm name //删除docker网络
卷
docker volume ls //列出卷
docker volume create name //创建卷
docker volume rm name //删除卷
docker volume inspect name //查看卷信息
参数
-d //后台运行
-it //交互式终端运行,例:docker run -it ubuntu bash
-p //端口映射(宿主机端口:容器端口)
-v //-v /host/path:/container/path
-e //设置环境变量,-e ENV=prod
--network //指定网络
--name //命名
--restart //容器重启策略,--restart=always
dockerfile
dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。
通过编写 dockerfile,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。
关键字
FROM # 基础镜像,当前新镜像是基于哪个镜像的
LABEL #标签 maintainer="yourname <your@email.com>"
RUN # 容器构建时需要运行的命令,常为shell命令
EXPOSE # 当前容器对外保留出的端口,只是声明
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发
示例
FROM golang:1.23 AS builder
WORKDIR /app
# 设置 Go 模块代理
RUN go env -w GOPROXY=https://goproxy.cn,direct
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# 构建 Linux 可执行文件
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .
# 第二阶段:构建镜像
FROM alpine:latest
WORKDIR /root/
# 复制可执行文件
COPY --from=builder /app/main .
# 复制配置文件或目录
COPY --from=builder /app/infrastructure /root/infrastructure
EXPOSE 8080
CMD ["./main"]
docker compose
模板
version: '3.8' #指定版本
services:
service_name: # 服务名称,不能有空格
image: # 使用的镜像
build: # 指定 Dockerfile 构建上下文和选项
container_name: # 容器名称(非必填,方便识别)
restart: # 容器重启策略,比如 always, on-failure
environment: # 环境变量
- KEY=VALUE
- ANOTHER=VALUE
ports: # 端口映射,格式 hostPort:containerPort
- "8080:80"
volumes: # 挂载卷,格式 hostPath:containerPath
- ./data:/app/data
networks: # 连接的网络
- my-net
实例
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: my-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: xxx # 设置root密码
MYSQL_DATABASE: testdb # 初始化数据库
MYSQL_USER: testuser # 创建用户
MYSQL_PASSWORD: test123 # 用户密码
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
参考资料
https://juejin.cn/post/7041923410649153543
https://blog.csdn.net/weixin_43980547/article/details/136914370

浙公网安备 33010602011771号