这里写目录标题
简介
本文将全面说明docker的使用教程,包括docker的简介、原理、常用命令、dockerfile构建、docker compose构建、设置docker下载源和docker使用案例(安装postgres数据库)。通过文本的学习,你将掌握使用docker部署应用的能力。
为什么使用docker?
在日常安装软件的过程中,会遇到各种报错。docker存在的意义就在于更加快速地下载和安装软件
什么是docker?
docker体系
docker client和docker server
- docker client只用于前端交互,输入命令
- docker server是针对docker client输入命令给予反馈,用于创建镜像,运营容器
docker image和docker container
- docker image是一个保存着所有程序运行所需的步骤和配置的文件
- docker container是image的一个实例,用于运行程序。一个image可以实例化出多个container
docker的实现原理
docker和虚拟机
- 虚拟机VM:一个虚拟机运行一个完整的操作系统,每个虚拟机都有一个内核
- docker:所有容器container都运行在linux操作系统上,并共享同一个内核。无论有多少个容器,都只有一个操作系统和一个内核
结论:VM要比docker消耗更多的资源
namespace和cgroups
docker就是利用linux的namespace和cgroups特性,实现的内核虚拟化技术
- namespace:隔离资源,使得每个容器使用的资源互不影响
- cgroups:控制资源,实现对资源的配额和度量
常用命令
查看docker版本
- docker --versioin: 查看docker版本信息
查看正在运行的容器
- docker ps: 查看docker正在运行的容器
- docker ps --all: 查看docker运行容器的记录
创建容器
- docker create : 创建容器
- docker start -a : 启动容器
- -a: 可选,选中则打印容器运行信息
- docker run -d : 创建并启动容器,=docker create+docker start
- -d: 可选项,选中表明容器在后台运行
清理停止使用的容器
- docker system prune
获取容器日志
- docker logs : 获取容器日志,执行该命令并不会启动或退出容器
关闭正在运行的容器
- docker stop : 向容器进程发出停止指令,但会预留一段时间(10秒内)给程序做一些清理、保存、发消息等操作
- docker kill : 向容器进程发出停止指令,进程会立即被关闭
在容器内运行语句
- docker exec -it commend: 在容器内运行命令,-it实现容器进程的输入输出流重定向(使得docker内的容器进程输入输出流重定向到pc端的命令行)
根据Dockerfile构建image
- docker build -t dockerID/dockerName:dockerVersion .: 根据编写的Dockerfile构建image,-t表明为生成image命名(dockerID/dockerName:dockerVersion)
tips:
golang项目的编译无法跨平台,即操作系统不同、cpu内核不同,都会造成错误,“standard_init_linux.go:219: exec user process caused: exec format error”
解决方法:
在build的时候指定platform
docker build --platform linux/amd64 -t hub/xx/xxx:v1 ./
docker compose
使用模版文件Dockerfile文件可以快速让用户创建一个自定义的容器,但是在实际的项目中,往往需要将多个容器组合起来使用。例如,在web项目中,需要后端、数据库、负载均衡容器等
compose允许用户通过一个单独的docker-compose.yml模版文件,来定义一组关联的容器为一个项目。
docker-compose.yml文件
version: '3'
services:
redis-server:
image: 'redis'
node-app:
restart: always
build: .
ports:
- "8081:8081"
compose语句
-
docker compose up -d --build: 通过docker-compose.yml文件启动项目
- -d: 可选,选中则在后台运行项目
- –build: 可选,选中则重新构建容器
-
docker compose down: 将项目中的所有容器关闭
-
docker compose ps: 根据docker-compose.yml文件中提及的container,查看container的运行情况(如果该目录下没有docker-compose.yml文件,则会报错“docker-compose.yml not found”)
restart类型
- no: 如果容器停止或中断,不会尝试重启
- always: 无论因为什么原因停止或中断,总是尝试重启
- on-failure: 当因为错误代码(除了0之外的代码)中断时,才尝试重启
- unless-stopped: 总是尝试重启,除非人为去停止
构建容器
流程
构建容器的复杂度在于编写Dockerfile,在Dockerfile中定义我们需要构建的容器是怎么样的
Dockerfile编写
- FROM alpine: 预先安装一系列有用的程序
- RUN apk add --update redis: apk是预先安装alpine中的包管理器,安装redis
- CMD [“redis-server”]: 容器启动命令
复制文件
- COPY ./ ./: 将当前电脑目录中的文件复制到容器container特定路径中
多步构建
# Use an existing docker image as a base
FROM alpine
# Download and install a dependency
RUN apk add --update gcc
RUn apk add --update redis
# Tell the image what to do when it starts
CMD [ "redis-server" ]
以上语句的image构建过程如图所示
在构建的过程中,每一步都会在上一步的基础上构建一个新的image
启动时的命令
- CMD: 容器启动时执行的命令,不可追加
- ENTRYPOINT: 容器启动时执行的命令,可追加命令
CMD和ENTRYPOINT同时使用时,CMD作为ENTRYPOINT的追加命令
先执行start.sh脚本进行数据库相关的配置,再执行main程序
CMD ["/app/main"]
ENTRYPOINT ["/app/start.sh"]
设置docker下载源
-
新建或编辑daemon.json
vi /etc/docker/daemon.json
-
daemon.json新增内容
``
{
“registry-mirrors”:[“http://hub-mirror.c.163.com”]
}
``
-
重启docker服务
systemctl restart docker.service
docker安装postgres
- 输入
docker pull postgres:12-alpine
进行postgres镜像安装
- 安装完成
- 输入
docker images
查看docker镜像
- 输入
docker run --name postgres12 -p 5432:5432 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=secret -d postgres:12-alpine
进行postgres实例化
- 输入
docker ps
查看postgres是否成功实例化