docker入门
目录
docker入门介绍
# 什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等
# 名词解释
-kvm,vmware---装在服务器上---虚拟化出一个个的机器(虚拟机)---机器上可以装操作系统
-openstack,阿里飞天---管理,点点点,创建释放虚拟机
-docker:容器技术
-k8s:多机容器管理(多机容器编排)
# Linux工具:
Nginx:反向代理服务器
lvs:负载均衡服务器
Ansible:python写的自动化运维软件,批量操作主机,paramiko;ssh
SalStack:python写的自动化运维软件,批量操作主机,性能更高,使用了mq,机器量大
Jenkins:java写的,cicd工具,自动部署
gitlab:gitops,自动部署
zabbix:php监控软件,监控磁盘,cpu,网络,监控进程。。。
Prometheus(普罗米修斯):go写的监控
Grafana:对数据展示的前端
docker
k8s
# 什么是Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护
Docker 的基础是 Linux 容器(LXC)等技术
用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单:把docker容器当成一个虚拟机装了一个操作系统
# docker的好处
-轻量级
-统一环境
-可以快速扩展到多台机器
# 容器与虚拟机比较
-docker 没有操作系统一层,更快,更轻量级
docker组件介绍
# docker 是cs架构:数据通信使用http协议的resful
-服务端:docker 主进程,负责接受docker 客户端传过来的命令
-Images:重点,镜像,一堆文件:当成虚拟机上装的操作系统的iso文件(操作系统+某个软件)
-Containers:重点:容器,运行的:当成在虚拟机上装了操作系统后开机了(centos系统,centos+redis)
-网络:网络模式,容器间通信,容器跟宿主机通信
-Volumes:数据卷,存放容器中软件,文件的地方
-Registry:远程仓库,镜像是从远程仓库下载下来的
Docker安装与启动
1.yum install -y yum-utils device-mapper-persistent-data lvm2
2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.yum install docker-ce -y
4.docker -v 查看版本,docker发布的年月命令
5.systemctl start docker 启动docker
6.systemctl stop docker 关闭docker
7.systemctl enable docker 开机自启动
8.docker info
镜像加速
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://x1566319.mirror.aliyuncs.com"]
}
重启
镜像相关命令
# 远程仓库下载的,官方的https://hub.docker.com/
# 镜像:images
#1 下载镜像
# docker pull下载
#centos:centos7 镜像名字:版本/tag
docker pull centos:centos7
docker pull redis # 默认下最新的latest
# 2 查找镜像---》是否是官方,点赞数大小
-方式一网址搜:https://hub.docker.com/
-方式二: docker search centos
# 3 查看本地镜像
docker images
# 4 镜像删除
docker rmi 镜像名字:tag/镜像id
# 5 一次性删除所有镜像
docker rmi `docker images -q`
# 名词解释
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
容器相关命令
# 1 查看正在运行的容器
docker ps
# 2 查看所有容器,无论停止还是运行
docker ps -a
# 3 创建容器并启动(创建容器,运行容器)
docker run -id --name=mycentos -v 宿主机路径:容器路径 -p 宿主机端口:容器端口
-i:表示运行容器 镜像名字:tag
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
### docker run -it centos:centos7
-启动容器,自动命名,进入到容器内部,如果exit退出,容器也就结束了,不运行了
-因为容器运行必须有一个前台进程夯住阻塞,前台进程结束,容器也就结束了
### docker run -id --name=mycentos7 centos:centos7
-进入到容器内部操作
-ssh连过去(需要容器支持,安装ssh,启动,监听22端口),一般不用
-docker exec -it 96a5 /bin/bash # 本质是在96a5容器上执行一下 bash命令
### docker run -id --name=mycentos2 -v /root/lqz:/home/lqz centos:centos7
-以后再容器内部操作lqz文件夹和在宿主机操作是一样的
### docker run -id --name=myredis -p 6380:6379 redis
-以后直接链接宿主机的6380就相当于链接容器的6379端口
#### mysql做目录映射,创建数据库,删除容器操作,再用别的容器运行,数据库还在
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
# 创建my.cnf配置文件
touch /home/mysql/my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysqlmy -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#3 停止容器
docker stop 容器id
# 启动容器
docker start 容器id
#4 删除容器:必须先停止再删
docker rm 容器id 容器id 容器id
#5 文件拷贝
# 从宿主机copy文件到容器
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp lqz.txt ff78cece7d61:/home
#从容器copy文件到宿主机
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp ff78cece7d61:/home/lqz.txt /root/lqz.txt
#6 查看容器详情,ip地址
docker inspect ff78cece7d61
docker inspect --format='{{.NetworkSettings.IPAddress}}' ff78cece7d61
# netstat 命令没有
yum install net-tools 安装
应用部署
# 运行mysql
docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysqlmy -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 运行redis
docker run -di --name=myredis5 -v /root/lqz/redis.conf:/data/redis.conf -p 6379:6379 redis redis-server /data/redis.conf
vim redis.conf
bind 0.0.0.0
daemonize no
protected-mode no
requirepass 123456
# 运行nginx
docker run -di --name=mynginx -p 80:80 nginx
迁移与备份
# 一个容器内,尽量只有一个软件,不要把mysql,redis多种服务集成一个容器中,而要放到多个容器
# 镜像---容器---装了软件(vim,mysql)---打包成镜像
# 打包后的镜像---运行成容器(带了软件)
docker commit 容器id centos-vim:v1 # 容器打包成镜像
docker history 镜像的id # 查看分层历史 镜像分层:上传,下载镜像加速,底层有的文件不需要再下载了
docker save -o centos-vim.tar 镜像id # 把镜像备份成压缩包,copy给别人
docker load -i centos-vim.tar # 把压缩包,load成镜像
docker tag 20fc287cc64f centos-vim:v1
Dockerfile
# 镜像如何获得
-1 从远程仓库拉
-2 通过容器做成镜像
-3 通过dockerfile构建 (文本文件)
-4 通过备份的压缩包load回来
# Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令。可以有多条。RUN mkdir lqz
CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
# cmd和ENTRYPOINT区别?
MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:设置对外暴露的端口。
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷
WORKDIR:设置工作目录
# Dockerfile
FROM centos:centos7
MAINTAINER lqz
LABEL author=lqz
WORKDIR /lqz
ENV NAME lqz
RUN echo $NAME
RUN yum install -y vim
COPY redis.conf /root/redis.conf
CMD sleep 50
# 构建镜像
docker build -t='centos7-vim' .
# 项目根路径会有dockerfile文件
FROM python:3.8
MAINTAINER lqz
WORKDIR /soft
COPY ./requestment.txt /soft/requestment.txt
RUN pip install -r requestment.txt -i https://pypi.doubanio.com/simple
#CMD ["uwsgi", "-x", "./luffy.xml"]
CMD ["uwsgi", "./luffy.ini"]
#CMD ["python", "manage_pro.py", "runserver"]
# 如果公司使用docker开发,部署
-项目根路径有个dockerfile文件----》开发完了传到git----》部署的机器上---》从git拉下源代码---》docker软件已经有了----》docker build -t='django-soft' .----》docker run -di --name=mysoft -p 8080:8080 -v ./luffy_api:soft django-soft
-又改了代码---》git上去----》git pull 代码拉下来----》docker restart mysoft----》就看到最新的代码了
Docker私有仓库
# 之前的镜像,从远程仓库拉去的,公共的,公司里自己做的镜像,不能传到公共远程仓库----》自己公司搭建私有仓库,把镜像传到私有仓库中
# 把自己做的镜像,传到公共仓库
docker tag 5977ea9eb152 liuqingzheng/centos7-vim:v1
docker login
docker push liuqingzheng/centos7-vim:v1
docker pull liuqingzheng/centos7-vim:v1 # 所有人都可拉
搭建私有仓库
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://10.0.0.205:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出。
{"insecure-registries":["10.0.0.205:5000"]}
此步用于让 docker信任私有仓库地址
(5)重启docker 服务
systemctl restart docker
6)标记此镜像为私有仓库的镜像
docker tag 5977ea9eb152 10.0.0.205:5000/centos7-vim
(7)再次启动私服容器
docker restart registry
(8)上传标记的镜像
docker push 10.0.0.205:5000/centos7-vim
Docker-compose
Docker Compose是一个能一次性定义和管理多个Docker容器的工具,python写的
单机容器编排,通过yaml文件
k8s 多机容器编排,谷歌公司开源的
#安装
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# docker-compose命令
# 启动管理容器
docker-compose up # 会自动搜索当前路径下的 docker-compose.yml文件
docker-compose -f 指定文件 up
docker-compose up -d # 后台执行,一般我们看日志输出,不用这个
docker-compose stop # 停止,不会删除容器和镜像
docker-compose down # 停止,并删除关联的容器
docker-compose start # 启动yml文件管理的容器
docker-compose ps # 正在运行的容器
docker-compose images # docker-compose管理的容器
docker-compose exec yml文件中写的service /bin/bash # 进入到容器内
# 写yaml文件
# 写flask项目app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
# redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
# 写Dockerfile文件
FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install flask redis -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD [ "python", "app.py" ]
# 写docker-compose的yaml文件 docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
# docker-compose up
Django
version: "3"
services:
nginx:
image: nginx
container_name: luffy_nginx
ports:
- "80:80"
- "8000:8000"
restart: always
volumes:
- ./luffycity/dist:/var/www/html
- ./docker_compose_files/nginx:/etc/nginx/conf.d
depends_on:
- django
networks:
- web
django:
build:
context: ./luffy_api
dockerfile: Dockerfile
container_name: luffy_django
# command: python manage_pro.py makemigrations && python manage_pro.py migrate && uwsgi ./luffy.ini
restart: always
ports:
- "8080:8080"
volumes:
- ./luffy_api:/soft
environment:
- TZ=Asia/Shanghai
depends_on:
- mysql
- redis
networks:
- web
redis:
image: redis:latest
container_name: luffy_redis
ports:
- "6379:6379"
volumes:
- ./docker_compose_files/redis/data:/data
- ./docker_compose_files/redis/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- web
mysql:
image: mysql:5.7
container_name: luffy_mysql
restart: always
ports:
- "3306:3306"
env_file:
- ./docker_compose_files/mysql.env
volumes:
- ./docker_compose_files/mysql/data:/var/lib/mysql
- ./docker_compose_files/mysql/logs:/var/log/mysql
- ./docker_compose_files/mysql/conf:/etc/mysql/conf.d
networks:
- web
networks:
web:
# 服务器:装docker,docker-compose
git clone xxxxxx
docker-compose up
一键部署luffy前后端项目
# 第一步:在自己机器拉取项目,修改前端连接后端地址
export default {
base_url: "http://10.0.0.205:8000/api/v1/"
}
#第二步:编译前端项目
npm run build
# 第三步:把最新代码提交到git
git push origin master
# 第四步:在要部署的服务器上(提前安装docker,docker-compose)
git clone 项目地址
cd luffy
docker-compose up
# 第五步:导入数据sql文件
# 第六步:在浏览器访问服务器80端口即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了