1 docker介绍,跟传统虚拟机的比较
0 各种软件用什么语言写的
zabbix(监控软件):php
ansible(批量管理主机,执行命令,无angent):python
openstack(云计算,管理虚拟机):python
jekins(ci/di):自动化部署,java
salstack(批量管理主机,执行命令,有angent):python
普罗米修斯(Prometheus,监控):go写的
docker:go
k8s:go
1 什么是虚拟化?
-vmware,kvm,openstack,docker,k8s
-云服务器:vmware,kvm虚拟化出来的
-阿里云,腾讯云:opensatck,阿里飞天,用来管理虚拟化出来的操作系统
-docker:进程级别的隔离,装在虚拟机,云服务器上,一个云服务上开业跑出成几百个docker容器,成百上千的服务器上,就会有个上万个容器
-k8s:不同机器的上万个容器如何管理
-虚拟化:打破实体结构间的不可切割的障碍
2 什么是Docker?
- Go语言实现,开源出来,很多人用
- docker-ce(免费),docker-ee(收费)
- 通过go语言对lxc技术的一个封装
3 容器与虚拟机比较
-docker不需要虚拟硬件和操作系统,轻量级,占用体积小,启动快
4 Docker是一个客户端-服务器(C/S)架构程序(mysql,redis都是cs架构),整套 RESTful API
5 docker非常重要的概念:镜像(image)与容器(container)
镜像 ---》容器
运行镜像得到容器(真正的执行单位)
面向对象的类 对象
6 镜像是从哪里来的?
-镜像就是一堆文件
-从远程仓库获取(拉取)
2 docker架构图

3 docker安装
3.1 windows安装
windows安装(不建议你装)http://get.daocloud.io/
3.2 乌班图
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y install docker-ce
systemctl status docker
3.3 centos上安装(必须7.0以上)
卸载 docker
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
安装 docker
1 更新yum
yum update
2 安装需要的软件包, yum-util
yum install -y yum-utils device-mapper-persistent-data lvm2
3 执行(向你的yum源,增加一条记录)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4 安装
yum install docker-ce
5 验证安装(查看版本)
docker -v
Docker version 19.03.12, build 48a66213fe
启动 ,停止 ,重启 ,开机启动 docker 及 查看概要信息
启动,停止,重启docker服务
systemctl start docker
systemctl stop docker
systemctl restart docker
开机启动
systemctl enable docker
查看概要信息
docker info
3.4 远程仓库
https://hub.docker.com/ 注册,登录
配置国内仓库
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
4 镜像操作
-1 hello-world
docker run hello-world
1 客户端连到服务端,服务下载了hello-world镜像
2 通过镜像跑起容器来
3 容器输出一些东西,通过服务端发送给客户端,客户端展示在窗口里了
0 查找镜像
方式一:https://hub.docker.com/ 点点点搜索(用这种)
方式二:docker search
1 拉取镜像
docker pull hello-world 最新版本latest
docker pull hello-world:nanoserver
2 查看机器上有哪些镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像名字 版本 id号 创建时间 大小
3 删除镜像
docker rmi 镜像名字/id号
4 拉取python3.6镜像,redis最新镜像,mysql5.7镜像
docker pull python:3.6
docker pull redis
docker pull mysql:5.7
docker pull centos:centos7
5 镜像是什么?
-就是一堆文件,这堆文件通过docker跑起来,就是容器(centos+redis)
-centos7的镜像跑起来,容器你就当成在你宿主机上跑了一个centos7的操作系统(虚拟机)
6 补充(了解)
docker image inspect 46ff56815c7c
docker image ls
docker image rm
5 容器操作
1 删除容器
docker rm 容器名字/容器id
2 启动并运行容器
docker run -di --name=mycentos centos:centos7
打印出容器的id号
3 查看机器上正在运行的容器
docker ps
4 查看宿主机上所有的容器(包括停止的)
docker ps -a
5 停止容器
docker stop 容器名字/id号
6 启动容器
docker start 容器id/名字
7 容器的创建和启动(******)
-创建:docker create --name=xxx redis
docker create --name=test-container centos:centos7 ps -A
-启动
docker start test-container
-容器一直运行的原因
-它有一条前台进程,一直在运行
-以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
-如果该命令结束,该容器也就结束了
-创建并启动(run)
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
--name :为创建的容器命名。如果不写,会自动分配一个名字(英文人名)
-v:表示目录映射关系(前者是宿主机目录,后者是容器目录,映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
docker run -it --name=myredis redis
8 进入容器的几种方式(并不是真进入)
第一种:docker exec -it 容器id /bin/bash
docker exec 容器id ls
exec真正的作用是在容器内执行命令
第二种:ssh连接(容器内部装ssh服务端)
9 退出
exit
10 文件拷贝
-从宿主机拷贝到容器内部
docker cp lqz.txt 容器id:/home
-从容器内部拷贝到宿主机
docker cp 容器id:/home/lqz.txt /app
11 目录挂载
docker run -di --name=mycentos99 -v /home/lqz:/home centos:centos7
12 端口映射
docker run -di -p 6377:6379 redis:latest
13 查看容器详细信息
docker inspect f81
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
6 应用部署
docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -di -p 6377:6379 redis:latest
docker run -di --name=mynginx -p 8080:80 nginx
部署应用映射外部目录
-1 mkdir /reids /redis/conf /redis/data
-2 vim /redis/conf/redis.conf
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456
-3 创建并运行容器
docker run -p 6378:6379 --name redis_6379
-v /redis/conf/redis.conf:/etc/redis/redis.conf
-v /redis/data:/data
-di redis
redis-server /etc/redis/redis.conf
redis-cli -h 101.133.225.166 -p 6378
auth 123456
save或者是bgsave
迁移与备份
2.0 其他操作
docker rm `docker ps -a -q`
docker rmi `docker images -q`
docker run -id --name=mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
docker logs 容器id
1 启动一个python容器
docker run -di --name=lqz python:3.6
2 进入装软件
docker exec -it lqz /bin/bash
mkdir /project
pip install django==1.11.1 -i https://pypi.douban.com/simple/
退出
3 把项目拷贝到容器内部
docker cp /opt/lqz/django_test lqz:/project
4 把容器做成镜像
docker commit lqz mydjango
5 基于自己做的镜像运行容器
docker run -id --name=mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
2.1 容器保存为镜像
docker commit 容器名字 镜像名字
docker commit 19b mydjango
2.2 把镜像打包成压缩包
docker save -o mydjango.tar mydjango
2.3 把压缩包回复为镜像
docker load -i mydjango.tar
3 Dockerfile(很重要)
1 dockerfile是什么
一个文件,里面一堆指令,通过这个文件可以生成镜像
2 dockerfile指令
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
3 写一个dockerfile(文件名字必须交Dockerfile)
vim dockerfile
FROM python:3.6
MAINTAINER lqz
EXPOSE 8080
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
VOLUME ["/home"]
WORKDIR /home/django_test
CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"]
4 通过dockerfile构建出镜像
docker build -t='django_1.11.11' .
5 查看镜像
docker images
6 启动容器
docker run -di --name=mydjango2 -v /opt/lqz/:/home -p 8080:8080 django_1.11.11
7 在外部访问即可
8 配置nginx转发
mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
vim nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream node {
server 101.133.225.166:8080;
server 101.133.225.166:8081;
server 101.133.225.166:8082;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://node;
}
}
}
docker run --name nginx -id -p 8888:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx
9 配置负载均衡
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream node {
server 101.133.225.166:8080;
server 101.133.225.166:8081;
server 101.133.225.166:8082;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://node;
}
}
}
docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8081:8080 django_1.11.11
docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8082:8080 django_1.11.11
上传自己的镜像
docker login 输入用户名密码
docker tag 5452fa6715c0 liuqingzheng/django1.11.9:v1
docker images
docker push liuqingzheng/django1.11.9:v1
私有仓库
1 拉取私有仓库镜像
docker pull registry
2 启动容器
docker run -di --name=registry -p 5000:5000 registry
3 打开浏览器 输入地址http://101.133.225.166:5000/v2/_catalog
看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
4 配置
修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出
{"insecure-registries":["101.133.225.166:5000"]}
此步用于让 docker信任私有仓库地址
5 重启docker 服务
systemctl restart docker
6 重启容器
docker start registry
7 打标签
docker tag 5452fa6715c0 101.133.225.166:5000/django1.11.11
8 上传到私有仓库
docker push 101.133.225.166:5000/django1.11.11
9 从私有仓库拉取镜像
docker pull 101.133.225.166:5000/django1.11.11
docker-compose
1 docker-compose:是一个单机情况下容器编排的工具
2 yml 文件:通过yml文件定义多个容器 ——默认名字docker-compose.yml
三个概念,Service Networks ,Volumes
一个service代表一个container,
这个container可以从docker hub的image来创建,或者从本地dockerfile build的image来创建
version:有1,2,3版本,目前都用"3"
6 安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
7 验证安装成功
docker-compose -v
部署多应用
1 创建Dockerfile
vim Dockerfile
FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
2 创建docker-compose文件
vim docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
3 创建app.py
vim 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)
@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)
4 启动--运行
docker-compose up
docker-compose.yml 如何写
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
volumes:
- mysql-data:/var/lib/mysql
多个容器直接通信方式
1 端口映射到宿主机,直接访问宿主机
2 通过ip地址访问
3 run的时候指定 --link 容器
docker run -di --name=centos1 centos:centos7
docker run -di --name=centos2 --link centos1 centos:centos7
进入到centos2中 ping centos1 可以ping通
-端口映射
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现