docker使用
1.docker使用
0 django操作原生sql
# 有时候我们通过django的orm写不出一些复杂sql--》使用django执行原生sql
#2 django 执行原生sql
方式一:
from django.db import connection
cur=connection.cursor()
cur.execute('select distinct id, book_name from test_book')
print(cur.fetchall())
cur.close()
方式二:
# 原生sql,方式一,跟对象做映射:
book_list=Book.objects.raw('select id,name,price,publish from app01_book where id =2')
# print(book_list) # RawQuerySet
# for book in book_list:
# print(book.name)
# 了解的,咱们不这么写
# obj_list = User.objects.raw('select id,name,price,publish from app01_book where id =2')
# print(obj_list) # RawQuerySet
# for obj in obj_list:
# print(obj.name)
# print(obj.price)
1 docker 介绍
1.1 虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
# kvm,VMware,openstack,docker,k8s
-kvm,vmware:虚拟化软件
-openstack,阿里飞天:虚拟化软件管理web项目 -- python
-docker:容器化
-k8s:容器管理编排

1.2 docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 加了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在上进行维护。
容器化技术,区分于虚拟机,又类虚拟机,兼具虚拟机隔离的优点,又有速度快的优点
容器资源隔离,网络隔离
把容器当成一个虚拟机即可
docker 容器管理
-docker swarm
-k8s
Docker 的基础是 Linux 容器(LXC)等技术
1.3 docker和其他虚拟机比较
# docker 不需要虚拟化出 操作系统这一层---》更轻量级--占空间更小---》还能实现隔离
# 虚拟机技术的缺点:
1.资源占用太多
2.冗余步骤多
3.启动很慢
# 容器化技术
1.服务器资源利用率高
2.比较轻量化
3.打包镜像测试,一键运行
比较Docker和虚拟机技术不同:
1.传统虚拟机,虚出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
2.容器内的应用之间运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以久轻便了
3.每个容器间是互相隔离的,每个容器内都有属于自己的文件系统,互不影响
4.安全性,docker的安全性更弱,
5.与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离
7docker创建时秒级的,docker的快速迭代性,无论是开发、测试、部署都可以节约大量时间
1.4 docker架构
# cs 架构---》客户端服务端
- c 端:用户操作,输入命令
- s端:接收用户命令,执行
-c、s通信,使用http协议,遵循restful规范
-mysql:tcp---》自定义的
-redis:tcp---》自定义的
# 架构
1 client:客户端,输入命令
2 服务端:
containers:容器
images:镜像--》从注册中心下来下来的
3 register:注册中心
-放了很多镜像--》redis,nginx,mysql
2 docker安装和配置
2.1 ubuntu docker安装
- 连接ssh
apt install vim
apt install openssh-server
systemctl status ssh
systemctl start ssh
apt update
apt upgrade -y
ifconfig
- 切换到root用户
sudo su -
- 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
1. 安装Docker
1.1 卸载原有Docker(如果已安装)
首先,如果你之前已经安装了Docker,需要先卸载它。可以使用以下命令:
sudo apt-get remove docker docker-engine docker.io containerd runc
1.2 更新软件包列表
更新Ubuntu的软件包列表:
sudo apt-get update
1.3 安装Docker依赖
安装Docker所需的依赖软件包:
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
1.4 添加GPG密钥
从Docker官方获取GPG密钥:
官方获取GPG密钥出现timeout问题,可以从阿里云源获取GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
从阿里云源获取GPG密钥:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
1.5 添加Docker软件源
添加Docker官方软件源到APT源列表(这里使用的是阿里云的Docker镜像源):
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
注意:
$(lsb_release -cs) 需要替换成自己的ubuntu版本
查看自己的ubuntu版本,终端输入以下命令:
lsb_release -c
2. 安装Docker CE
2.1 更新软件包列表
在添加了Docker软件源之后,再次更新软件包列表:
sudo apt-get update
2.2 安装Docker CE
安装Docker CE(Community Edition,社区版):
sudo apt-get install docker-ce docker-ce-cli containerd.io
3. 验证Docker安装
安装完成后,可以通过运行以下命令来验证Docker是否安装成功:
docker -v
安装成功后会显示docker版本号
4. 配置阿里云镜像加速(可选)
如果你需要进一步提高Docker镜像的下载速度,可以考虑配置阿里云提供的镜像加速服务。
4.1 登录阿里云并获取镜像加速地址
在阿里云上创建一个账号(如果还没有的话),然后找到容器镜像加速服务,获取一个专属的镜像加速地址。
配置Docker使用阿里云镜像加速
● 创建一个Docker配置文件(如果/etc/docker/daemon.json不存在):
sudo apt install vim
sudo touch /etc/docker/daemon.json
# https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
{
"registry-mirrors": ["https://iidz09c5.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker #开机自启动
# 0 搜索镜像
-去网站搜:https://hub.docker.com/
-使用命令行搜:docker search mysql
# 1 获取镜像,拉去镜像---》从register下载到本地--》阿里云镜像站--》加速拉取
docker search mysql #搜索镜像
docker pull mysql:5.7 # 下载mysql 5.7镜像
docker pull mysql:8.0 # 下载mysql 8.0镜像
docker pull python:3.8 #下载python3.8
docker pull redis:latest # 下载redis最新的镜像
docker pull nginx:latest # 下载 nginx最新的镜像
docker pull centos:centos7 # 下载 nginx最新的镜像
clear #清空
# 2 查看镜像
docker images
# 3 删除镜像
docker rmi redis:latest
2.2 centos docker安装
- 查看IP地址
ip addr
- 如果IP地址没有出现
vim /etc/sysconfig/network-scripts/ifcfg-ens32
# 注意:ifcfg-ens32可能存在不同,你需要根据自己的机器进行修改
# 以下两处也需要修改
bootproto=dhcp
onboot=yes
回到终端:systemctl restart network
- 安装
# 1 linux win 安装
# 2 win:https://www.docker.com/products/docker-desktop/ 下载 docker-desktop
-一路下一步安装
# 3 centos 7.9 安装
-视频,软件:vmware ,镜像文件
# 4 创建一个centos 7.9的虚拟机,在这个基础上讲docker
# 5 如果之前装过,卸载
# yum remove docker docker-common docker-selinux docker-engine
# rm -rf /var/lib/docker
yum update # 更新yum仓库
# 6 安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
# 7 查看安装的版本
docker --version
# 8 目前我们只装了 docker-ce,
-只有:c 和 s端
-没有docker-compose
-没有图形化解码
-跟docker-destop的区别
# 9 启动docker
systemctl status docker
systemctl start docker
# 10 镜像--》从远程下载下来的---》
hub.docker.com -->仓库下的
-有非常多镜:可以搜索,搜到以后,镜像有不同版本
-目前:访问不到了,拉去不下来
-配置:国内镜像站:阿里云
-https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
sudo mkdir -p /etc/docker # 如果有,就不需要创建了
vi /etc/docker/daemon.json
# 加入
{
"registry-mirrors": ["https://iidz09c5.mirror.aliyuncs.com"]
}
# 按 esc
# 输入 :wq 敲回车
# 保存退出
systemctl daemon-reload # 重新加载docker配置
systemctl restart docker # 重启docker
3 docker镜像操作
3.1 镜像和容器
# 镜像:images
-一堆文件---》目前咱们从register---》下载---》放在宿主机(centos 7.9机器)
-类比:虚拟上装系统
- 操作系统文件 xx.iso--->装在虚拟机上
- 镜像你当成 xx.iso 操作系统文件
-把iso装在不同虚拟机中---》启动---》多台有操作系统的机器
# 容器:container
-镜像运行---》运行成容器
-类比:
-容器当成一个正在运行的操作系统
-一个镜像,可以运行成多个容器
# python面向对象
类:镜像
对象:实例化得到多个对象,每个对象间独立的
# 以后一个容器,你们当成 :一个操作系统+软件--》正在运行
3.2 镜像操作
# 0 搜索镜像
-去网站搜:https://hub.docker.com/
-使用命令行搜:docker search mysql
# 1 获取镜像,拉去镜像---》从register下载到本地--》阿里云镜像站--》加速拉取
docker pull mysql:5.7 # 下载mysql 5.7镜像
docker pull mysql:8.0 # 下载mysql 58.0镜像
docker pull redis:latest # 下载redis最新的镜像
docker pull nginx:latest # 下载 nginx最新的镜像
docker pull centos:centos7 # 下载 nginx最新的镜像
# 2 查看镜像
docker images
# 3 删除镜像
docker rmi redis:latest
4 容器操作
#1 镜像操作
-docker search
-docker pull
-docker images
-docker rmi
#2 镜像运行,变成容器---》一个镜像可以运行处多个容器--》把一个容器当成一个虚拟机
-操作系统
-文件
-软件
-网络
# 3 运行出一个容器
4.1 run
# 1 把镜像运行成容器
# 运行,如果镜像没有,会去远程仓库下载
docker run -id --name=centos7 centos:centos7
# -id :启动容器,不进入容器内部
# -it :启动容器,进入容器内部
# --name:指定容器名字,容器名字不能重复,如果重复就报错,可以随便起
# centos:centos7:基于哪个镜像运行成容器
# 2 查看正在运行的容器
docker ps
# 3 执行:docker run -it centos:centos7
进入到容器内部,可以执行centos的命令,但是它是最精简的系统,很多命令可能没有,用的话需要安装
退出容器,回到宿主机:exit
# 4 容器需要创建然后运行
-创建:create命令
-运行:run
# 5 #### 容器要运行,内部必须有个前台进程阻塞,否则容器就会停掉###
# 6 docker ps -a #查看所有容器,包括停止的
# 7 删除容器
docker rm 容器名字/容器id
4.2 run 时参数
# docker run 参数
-i 表示运行容器
-d 以守护式容器在后台运行,用这个参数创建出来的容器,命令行还在宿主机上,没有进入到容器内部
-t 表示容器启动后会进入容器命令行。加入这参数后,容器创建就能登录进去。即分配一个伪终端。
--name 指定容器名字,如果不指定,会随机一个名字
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
几个小案例
# 1 启动一个centos容器并且进入,名字叫mycentos,在内部装个vim,然后退出
docker pull python
1 docker run -id --name=mycentos centos:centos7
2 在宿主机 docker ps
3 docker exec -it afdf5fc846b8 /bin/bash
# 新开了一个bash进程
4 yum install vim -y
5 exit
6 容器停还是没有停?没有,因为容器运行时的 bash 进程没有结束
# 2 docker exec 命令
在宿主机,链接容器,执行命令,把命令结果返回给宿主机
docker exec 362a ls
# 3 进入到容器内部
# 在容器上执行命令
docker exec 容器名字/id 命令
docker run -id --name=python python:3.10
# 利用这个特性-->进入到容器内部
docker exec -it 容器名字/id /bin/bash
#有时候用ssh
docker exec -it python sh
# 退出,结束掉 /bin/bash
exit
4.3 -v
# 1 -v 参数表示运行容器时,跟宿主机的文件目录做映射
#2 小案例
# 运行出一个 centos77 容器,不进入, 做目录映射
# 把宿主机的 /root/hope文件夹 映射到 容器内部的 /hope文件夹 容器如果没有文件夹会自动创建
# -v可以写多个,可以是文件或文件夹
1 cd # 回家 前提是你是root用户
2 mkdir hope # 在root目录下创建hope文件夹
3 运行容器,做目录映射
docker run -id --name=centos77 -v /root/hope:/hope centos:centos7
4 在宿主机的 /root/hope 下新建 xx.txt
vim xx.txt
5 来到容器内部:看这个文件在不在
cat xx.txt
6 他们是相互影响的:
容器内部修改文件---》会影响外部
外部修改文件---》影响内部
# 3 目录映射好处是,后期咱们部署django项目
1 有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
2 运行mysql容器---》mysql配置文件,数据data目录,放在宿主机上做好映射
如果 mysql容器---》表数据,放到容器中---》如果删了容器---》数据库全没了
表数据,放在宿主机上---》把容器删除---》表数据还在----》再启动一个容器做好映射---》数据都还在
# 4 一次性删除
# 一次性删除所有容器
docker rm `docker ps -a -q`
# 一次性删除所有镜像
docker rmi `docker images -q`
4.4 -p
# 1 -p参数:端口映射 容器中启动一个mysql5.7 --》容器中的3306监听,宿主机3306没人监听,做端口映射后,宿主机的3306就被docker的这个容器监听了
# 2 小案例,运行一个mysql容器--》做端口映射
docker run -id --name=mysql8.0 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# -p: 启动mysql容器 -p 宿主机端口:容器端口
# -e :启动的mysql的root密码是123456
# 以后台守护进程运行mysql容器,mysql的root用户密码是123456,宿主机和容器做了端口映射
宿主机 3307 映射容器 3306
## 2.1 查看宿主机 3307端口占用情况
# netstat -nlp |grep 3307 查看本机80端口占用情况
# 查看宿主机 3307端口占用情况
yum install net-tools -y
netstat -nlp | grep 3307 # 被docker占了
## 2.2 远程链接宿主机的3307端口
以后访问宿主机3307端口就等于访问容器的3306端口
# win机器可以远程链接 mysql
-命令行链接:mysql -h 192.168.71.130 -P 3307 -uroot -p
-Navicate: 链接,创建hope数据库
# 宿主机--》进入到容器内部--》进入到mysql,查看有没有创建hope这个库
docker exec -it mysql8.0 /bin/bash # 进入容器内部
mysql -uroot -p # 进入mysql
show databases; # 查看所有数据库
4.5其他
#1 启动容器
docker start 容器id
docker start mysql8.0
#2 停止容器
docker stop 容器id
#3 mysql的容器底层的操作系统是 debian 装软件需要用
apt-get update
apt-get install vim -y
#4 文件拷贝(宿主机执行)
# 容器的文件copy到宿主机上(不是在容器内执行)
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp 0a9633190cb9:/xx.txt /root/hope/hope.txt
# 宿主机的文件copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp /root/hope/xx.txt 0a9633190cb9:/xx.txt
# 5 查看容器IP地址
docker inspect 容器名称 # 查看容器的详细描述,很多
docker inspect ea5f3c9ee99a --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
# 6 在多个容器之间是可以ping通的(容器和宿主机也可以)
# python:172.17.0.3
# mysql5.7:172.17.0.2
# 宿主机--》ping 它俩
# 容器--》容器
apt-get update #更新一下先
apt-get install iputils-ping
ping 172.17.0.2
# 7 删除容器(删除已停止的容器)
docker rm 容器id
docker rm `docker ps -a -q`
# 8 无状态的服务(在容器中尽量运行无状态的服务)
-mysql reids 有状态,运行过程中产生数据,保存,容器删除,数据就没了
-uwsgi+django 无状态的服务
# 9 补充
1 ip地址 ip
10.0.88.110
10.0.0.111
10.0.0.1
10.0.11.1
2 子网掩码 mask
255.255.0.0
3 网关 gatway
10.0.0.1
5 应用部署
5.1 mysql 部署
#0 dokcer 中部署mysql,以后不需要在宿主机上装mysql
#1 没有做目录映射---》配置文件--》表数据都在容器中---》一旦删除--》所有都没了
docker run -di --name=mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 2 做目录(配置文件和数据文件)和端口映射
# 做目录映射:data文件,配置文件
# 创建文件夹
mkdir /mysql
mkdir /mysql/conf.d
mkdir /mysql/data/
vi /mysql/my.cnf
[client]
default-character-set=utf8
[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 rm mysql8.0 -f
docker run -it -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# 创建库,创建表,插入数据
# 关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着
docker stop mysql2
docker rm mysql2
##docker rm mysql -f 容器之间删了
# 再运行起一个容器,做好目录映射,数据都回来了
docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 补充 -e参数--》环境变量
-不同镜像提供不同参数
-传入后放入环境变量
echo $MYSQL_ROOT_PASSWORD
5.2 redis部署
docker run -d -p 6379:6379 --name redis redis:latest
#1 拉取redis镜像
docker pull redis #最新
mkdir /root/data
vi /root/redis.conf
bind 0.0.0.0
daemonize NO
protected-mode yes
requirepass 123456
# 运行
#启动容器时,运行的命令是什么 redis-server /etc/redis/redis.conf
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis redis-server /etc/redis/redis.conf
# 在容器运行时,可以自己定制运行命名 举例:docker run -id centos:centos7 ls
# 远程链接redis操作
5.3 nginx部署
# 拉取nginx镜像
docker pull nginx
# run起容器
# docker run -id --name nginx -p 80:80 nginx
# /usr/share/nginx/html
docker run -id --name nginx1 -p 8008:80 -v /root/html:/usr/share/nginx/html nginx
# 以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的
6 迁移与备份
#1 镜像从哪来的?
1 docker pull 拉的,远程仓库--》国内镜像站
2 通过容器打包成镜像
-centos镜像运行成容器---》装了vim
-把装了vim的容器---》打包成镜像
-以后拿到这个镜像--》再运行成容器,都会带vim命令
3 Dockerfile构建
#把之前创建的容器删掉
docker rm `docker ps -a -q` -f
#2 容器保存为镜像
-运行一个centos容器
docker run -id --name centos centos:centos7
-在容器中装vim
docker exec -it centos /bin/bash
yum install vim -y
-把容器做成镜像(centos+vim)容器名字 镜像名字
docker commit centos centos_vim_image
-把centos_vim 容器删除
docker rm centos_vim -f
-基于新构建的镜像,运行成容器
docker run -id --name centos_vim centos_vim_image
#docker run -id --name centos_vim centos_vim_image:latest
-进入到容器中,查看,软件都在
docker exec -it fe6adfe3106e /bin/bash
#2 本地镜像---推送到远端docker仓库中---》私有仓库
-早期 这个是免费的---》后期好像收费
-给镜像打个tag
docker tag 镜像id 镜像新名字(账号名/镜像名)
-登录到你账号中 docker login 输入账号密码
-docker push 镜像名字
docker push 镜像新名字
-别人就可以下载了
#3 镜像备份和恢复
docker save -o centos_vim_image.tar centos_vim_img
#删除容器
docker rm `docker ps -a -q` -f
#删除镜像
docker rmi 镜像名字
-把备份的镜像恢复
docker load -i centos_vim_image.tar
#删除
#rm -rf centos_vim_image.tar
7 Dockerfile
7.1 dockerfile介绍和常用命令
#1 镜像从哪里来的?
1 远程仓库拉取的 docker pull (hub.docker---》搭建私有仓库)
2 用容器做成的镜像 docker commit
3 把备份的恢复 docker load
4 使用Dockerfile来构建(这种多)
#2 什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建一个新的镜像
# centos7中,装了vim,在根路径下新建了一个文件 hope.txt,写了写内容
# 3 Dockerfile的命令
FROM 基础镜像 #基于哪个基础镜像来构建
MAINTAINER hope # 声明镜像的创建者
ENV key value # 设置环境变量 (可以写多条)
ENV key value # 设置环境变量 (可以写多条)
RUN command #是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file #将宿主机的文件复制到镜像内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR hope # 设置工作目录,运行起这个容器,来到的路径就是这个路径
CMD # 启动并运行容器执行的命令



7.2 小案例
# 构建一个带vim的centos:7镜像,根路径下有/hope/ss.py
vim Dockerfile
FROM centos:centos7
MAINTAINER hope
ENV name hope
ARG age 19
#RUN yum update&&yum install vim -y
RUN yum install vim
RUN mkdir /hope
RUN touch /hope/ss.py
RUN echo 'print(1)' > /hope/ss.py
RUN echo $name
RUN echo $age
WORKDIR /hope
# 基于dockerfile构建镜像,不要忘了 . 基于当前路径下的Dockerfile 构建镜像
docker build -t='centos_hope_vim' .
docker images
# 基于这个镜像运行容器
docker run -id --name xx centos_hope_vim
# 进入到容器
docker exec -it xx /bin/bash
# 验证vim,和文件夹,文件是否存在

7.3 案例2
#删除某个容器
docker rm 容器名字/id
#删除某个镜像
docker rmi 镜像名字/id
vim Dockerfile
FROM centos:centos7
MAINTAINER hope
ENV name hope
RUN mkdir /hope
RUN touch /hope/ss.py
RUN echo 'input()' > /hope/ss.py
WORKDIR /hope
CMD ['python' ,'./ss.py'] # 运行容器时会默认加上 /bin/sh -c
# 基于dockerfile构建镜像,不要忘了 . 基于当前路径下的Dockerfile 构建镜像
docker build -t='centos_py' .
docker images
# 基于这个镜像运行容器
docker run -id --name yy centos_py python /hope/ss.py
# 进入到容器
docker exec -it xx /bin/bash
# 查看环境变量
# python看
os.environ.get('name')
# shell看
echo $name
7.4常用和不常用命令
# 1 所有命令
https://zhuanlan.zhihu.com/p/419175543?utm_id=0
FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build
CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
LABEL:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:设置对外暴露的端口。
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷
USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:设置工作目录
# 2 docker logs 容器名字/id号 查看镜像运行成容器时,错误日志
docker -a 在没有执行的状态
docker logs 容器名字/id号
-如果容器没起来,看日志排查错误
# 3 CMD ENTRYPOINT --https://zhuanlan.zhihu.com/p/548188679
#相同点:
只能写一条,如果写了多条,那么只有最后一条生效。
容器启动时才运行,运行时机相同。
# 不同点:
ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖。
如果我们在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
# 4 ARG 和 ENV
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
7.5 ARG 演示
# 案例Dockerfile
FROM centos:centos7
MAINTAINER hope
ENV name hope
ARG age=19
RUN mkdir /hope
RUN touch /hope/ss.py
RUN echo 'input()' > /hope/ss.py
RUN echo $age
WORKDIR /hope
CMD python ./ss.py
# docker build -t='xxxx' .
7.6 dockerfile构建一个djagno项目(books图书管理系统)
# 以图书管理系统为例---》公司使用docker流程
# 公司中,使用Docker开发的工作流程
第一步:有一个项目,pycharm开发着,开发完后
第二步:在项目路径下新建Dockerfile,写入
FROM python
MAINTAINER hope
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","manage.py","runserver","0.0.0.0:8080"]
第三步:把代码提交到git
------------------
第四步:上线人员:在上线机器上,把代码啦下来
mkdir project
cd project
git clone https://gitee.com/liuqingzheng/books.git
#进入到books目录
cd books
第五步:构建镜像
docker build -t='django_books' .
第六步:运行容器
docker run -id --name=books -v /root/project/books:/soft -p 8080:8080 django_books:latest
第七步:其它人访问宿主机的8080端口就能看到项目了
---------
第八步:开发人员继续提交代码
第九步:运维人员pull代码,重启容器,用户就可以看到最新的了
docker restart books
重启docker容器即可(第三方依赖变了)--》重写构建镜像,运行容器
7.7 乌班图构建redis(跟底层宿主机无关)
https://zhuanlan.zhihu.com/p/623811065
8 docker 私有仓库
# 有个远程仓库 ,docker官方提供的 ---》我们可以把我们的镜像传上去
# 公司做的镜像,一般不放在远程仓库,公司会自己搭建私有仓库(把公司制作的镜像传到私有仓库)
8.1 镜像传到官方仓库
# 第0步:在远端创建仓库
# 第一步:给镜像打标签
docker tag 086e6b3e71c0 liuqingzheng/hope_books:v1
# 第二步:登录到远程
docker login
用户名:不是邮箱
密码:挺复杂
# 第三步:提交
docker push liuqingzheng/hope_books:v1
# 第四步:别人就可以下载了
docker pull liuqingzheng/hope_books:v1
8.2 镜像分层
每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交,通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID
# 只要执行一个命令就会多一层
RUN yum install vim -y
RUN yum install git -y
# 查看镜像分层的命令
docker history 某个镜像
# 好处:
构建快,分发方便,如果本地有某一层了,这一层就不需要下载了
# 补充:Dcokerfile写命令,建议多条命令合为一条---》只会生成一层
RUN python -m pip install --upgrade pip &&\
python -m pip install --upgrade setuptools &&\
pip install -r requirements.txt
8.3 私有仓库搭建
# 自己搭建私有仓库
-harbor:企业级私有仓库---》(有图形化界面--》跟hub.docker 很像) https://blog.csdn.net/weixin_47085247/article/details/129237979
-registry:用docker搭建私有仓库(没有图形化界面)
# 搭建步骤:(使用docker搭建docker私有仓库)
-第一步:拉取镜像 docker pull registry
-第二步:运行容器:docker run -di --name=registry -p 5000:5000 registry
-就是一个web服务端--》从浏览器中访问它
#docker下查看私有仓库中所有镜像
curl http://192.168.71.129:5000/v2/_catalog
-第三步:打开浏览器 输入地址http://192.168.71.129:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
-第四步:修改daemon.json
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://iidz09c5.mirror.aliyuncs.com"],
"insecure-registries":["192.168.71.129:5000"]
}
-第五步:重启docker 让配置生效
systemctl restart docker
docker start registry
-第六步:把某个镜像tag成私有仓库的镜像
docker tag 镜像名字/id 192.168.71.129:5000/django_books:v1
#打标签
docker tag django_books:latest 192.168.71.129:5000/django_books:v1
-第七步:提交到私有仓库
docker push 192.168.71.129:5000/django_books:v1
#删掉本地的 可以强制删除 docker rmi -f id
-第八步:其他人,只要配置了私有仓库就可以直接拉取
docker pull 192.168.71.129:5000/django_books:v1
docker run -id --name=books -v /root/project/books:/soft -p 8080:8080 192.168.71.129:5000/django_books:v1
# 以后公司用harbor多---》自己搭建个harbor



8.4 Harbor的部署和使用
https://blog.csdn.net/weixin_47085247/article/details/129237979
https://blog.csdn.net/Cnm_147258/article/details/135869167
-
Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。
它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制,AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。简单说来,Harbor封装了Docker的registry v2,帮用户提供了许多便捷管理的特性,方便用户操作。
8.4.1 下载
- 直接下载
https://github.com/goharbor/harbor/tags?after=v2.5.0-rc2
- 使用命令下载
# wget + 复制的下载链接
wget https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz
8.4.2 安装
#在下载好的Harbor安装包目录下进行解压
tar xvf harbor-offline-installer-v2.4.1.tgz
#在同目录下会生成一个harbor文件夹
ls
#data Dockerfile harbor harbor-offline-installer-v2.4.1.tgz
#如果有证书,还需要解压证书包
unzip 证书.zip
#解压后会生成一个证书文件和密钥文件
#将证书文件和密钥文件全部移到harbor文件夹里
mv 证书 harbor
mv 密钥 harbor
进入harbor文件夹,查看文件信息
cd harbor
ls
#common.sh harbor.v2.4.1.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
#复制
mv harbor.yml.tmpl harbor.yml
#打开 harbor.yml文件
vi harbor.yml
宿主机的host
不用https的话把https注掉
8.43 执行
#先装docker compose
wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64
cp ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose # 想在任意路径下执行docker-compose都有相应----》需要把可执行文件放到环境变量所在的目录下
chmod +x /usr/local/bin/docker-compose
#执行预备工具
./prepare
执行脚本
./install.sh
一共是9个容器
docker ps #查看容器
8.44 查看Harbor启动镜像
cd /usr/local/harbor/
docker-compose ps
docker-compose up -d #启动
docker-compose stop #停止
docker-compose restart #重新启动
8.45 浏览器访问
- 浏览器访问:http://192.168.71.129登录 Harbor WEB UI 界面,
- 用户名:admin
- 密码:123456
vim daemon.json
3.daemon.json文件中修改如下内容
{ "insecure-registries":["你的harborip:端口"] }
#这里填入的就是你的harbor ip地址
4.之后一个步骤是,重新加载这个配置文件
systemctl daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。
5.重启docker服务
Systemctl restart docker
6 ./prepare
执行脚本
./install.sh
一共是9个容器
docker-compose ps
docker login http://192.168.71.129:80
#打标签
docker tag django_books:latest 192.168.71.129:80/books/harbor:v1
#不带端口就默认成https请求了
#上传
docker push 192.168.71.129:80/books/harbor:v1

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异