1.docker介绍
一个软件,支持在win\linux\mac上安装。
作用:在一台电脑上根据模板创建出多个隔离的环境,相比其他方式节省资源。
1.1 隔离环境作用
1.2 名词解释
-
DockerHub:远程镜像仓库。仓库中有官方的一些镜像文件,也有开发者自定义的镜像文件。https://hub.docker.com/
-
Images:本地镜像仓库。镜像就是模板,内部包含打包好了运行所需依赖 + 业务代码,后期基于镜像一键创建出的容器也就会自动包含依赖和业务代码,直接就可以运行了,不需要再安装+拷贝代码了。
-
Container:容器,根据镜像创建的隔离环境。
2.环境搭建
2.1 window环境
需要下载虚拟机和centos
虚拟机下载地址:https://www.vmware.com/sg/products/workstation-pro/workstation-pro-evaluation.html
centos下载地址:https://developer.aliyun.com/mirror/?lang=zh-CN
下载的VMware-workstation-full-17.0.0-20800274和centos-7-x86-Minimal-2009.ios
虚拟机激活码:MC60H-DWHD5-H80U9-6V85M-8280D
2.1.1 安装docker社区版
-
配置repo源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum clean all && yum makecache
-
查看可下载版本
yum list docker-ce --showduplicates | sort -r
-
安装
# 最新版 yum install -y docker-ce # 指定版本 yum install -y docker-ce-23.0.6
2.1.2 启动docker-ce社区版
-
设置开机启动
systemctl enable docker
-
启动docker
systemctl start docker
systemctl restart docker
-
停止docker
systemctl stop docker
-
其他
## 查看docker信息 docker version ## 查看docker信息 docker info ## docker-client which docker ## docker daemon ps -ef |grep docker
-
查看本地镜像
docker images
-
搜索镜像
docker search 镜像名
-
拉取镜像
docker pull 镜像名
拉取时在dockerhub国外网站会很慢,设置加速器,类似于pip源,以后在docker中下载镜像时,使用加速器,下载就会比较快。
1.https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ixmef0s2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.https://www.daocloud.io/mirror#accelerator-doc
当centos提供请求时,转发到各个docker容器实现。
设置网口转发
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/docker.conf
3.docker使用实例
from flask import Flask
app = Flask(__name__)
@app.route("/index")
def index():
return "欢迎光临红浪漫"
if __name__ == "__main__":
app.run(host="0.0.0.0",port=8000)
3.1 下载镜像
步骤:
1.docker search ubuntu
或者上网站https://hub.docker.com/查找需要的镜像
2.docker pull ubuntu:18.04
3.docker images 查看镜像
这个只有基础镜像,我们可以在基础镜像的基础上创造出一个新的镜像:基础镜像 + 必备环境 + 代码
3.2 构建镜像
在宿主机cetos7创建Dockerfile和app.py文件
编写Dockerfile:
# Base images 基础镜像
FROM ubuntu:18.04
#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com
#RUN 执行以下命令
RUN apt update
RUN apt install python3 python3-pip -y
RUN pip3 install flask
RUN mkdir -p /data/www/
#拷贝文件至工作目录
COPY app.py /data/www/app.py
#工作目录
WORKDIR /data/www/
#EXPOSE 映射端口
EXPOSE 80
#容器启动时执行命令
CMD ["python3","app.py"]
构建镜像
docker build -t v0:0.1 . -f Dockerfile
使用此命令构建时,RUN中的下载会有缓存,执行docker build -t v0:0.2 . -f Dockerfile
第二次构建时会使用之前RUN中的下载,不需要使用缓存就使用 docker build -t v0:0.1 . -f Dockerfile --no-cache
删除镜像docker rmi 镜像id
3.3 创建容器
1.基于刚构建的镜像,来创建容器并启动。
docker run 镜像名
将访问本机80转发到8000端口
docker run -p 80:8000 镜像id或名
在后台运行:不卡住界面,可以创建多个,会返回容器id
docker run -d -p 80:8000 镜像
指定容器名:
docker run -d -p 80:8000 --name 容器名 镜像
通过宿主ip:80访问:
2.关闭容器
docker ps //显示运行容器
docker ps -a //显示所有容器
docker stop 容器名/id/id前3位 //关闭容器
docker rm 容器id //删除容器
docker stop `docker ps -ap` //批量停止
docker rm`docker ps -ap` //批量删除
注意:容器必须有前台进程,否则创建就销毁,即CMD或者ENTRYPOINT中必须有执行界面卡住,宿主机执行时必须有后台进程,加上-d
那基础镜像都没有执行界面,就只能用于构建自己镜像吗?
也可以人为进入容器,实现有前台进程docker run -ti ubuntu:18.04 bash
或docker run -ti ubuntu:18.04 sh
,要实现退出后自动删除使用docker run -ti --rm ubuntu:18.04 sh
再次进入存货容器docker exec -ti 容器id bash
3.4 3.Dockerfile指令
Dockerfile是一堆指令,在docker build的时候,按照该指令进行操作,最终生成我们期望的镜像
-
FROM 指定基础镜像,必须为第一个命令
格式: FROM <image> FROM <image>:<tag> 示例: FROM mysql:5.7 注意: tag是可选的,如果不使用tag时,会使用latest版本的基础镜像
-
MAINTAINER 镜像维护者的信息
格式: MAINTAINER <name> 示例: MAINTAINER wupeiqi MAINTAINER wupeiqi@live.com MAINTAINER wupeiqi <wupeiqi@live.com>
-
ENV
格式: ENV <key> <value> ENV <key>=<value> 示例: ENV myName John ENV myCat=fluffy 指定环境变量后在其他地方使用$变量名使用
-
COPY|ADD 添加本地文件到镜像中 app.py /data/www/info/app.py
格式: COPY <src>... <dest> 示例: ADD hom* /mydir/ # 添加所有以"hom"开头的文件 ADD test relativeDir/ # 添加 "test" 到 $WORKDIR/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/ 注意:针对压缩包使用ADD的话,会自动解压。
-
WORKDIR 工作目录
格式: WORKDIR /path/to/workdir 示例: WORKDIR /a (这时工作目录为/a) 注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
-
RUN 构建镜像过程中执行命令
格式: RUN <command> 示例: RUN yum install nginx RUN pip install django RUN mkdir test && rm -rf /var/lib/unusedfiles 注意: RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
-
CMD 构建容器后调用,也就是在容器启动时才进行调用
格式: CMD ["executable","param1","param2"] (执行可执行文件,优先) CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 (执行shell内部命令) 示例: CMD ["/usr/bin/wc","--help"] CMD ping www.baidu.com 注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。CMD会被覆盖,只有最后一条有效或者当执行指令中指定时就不执行。
-
ENTRYPOINT 设置容器初始化命令,使其可执行化
格式: ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先) ENTRYPOINT command param1 param2 (shell内部命令) 示例: ENTRYPOINT ["/usr/bin/wc","--help"] 注意: ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
-
EXPOSE 暴漏端口
格式: EXPOSE <port> [<port>...] 示例: EXPOSE 80 443 EXPOSE 8080 EXPOSE 11211/tcp 11211/udp 注意: 就是一个端口的标识,实际开发时,没什么意义。因为端口的映射会在run命令时进行指定。
4.django项目部署实例
1.拉取镜像
docker pull centos:7.9.2009
2.编写Dockerfile
# Base images 基础镜像
FROM centos:7.6.1810
#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com
# GCC编译器
RUN yum install gcc -y
# Python依赖
RUN yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel mysql-devel python-devel libffi-devel
# wget
RUN yum install wget -y
# 目录
RUN mkdir -p /data/
WORKDIR /data/
# SQLite升级
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz --no-check-certificate
RUN tar -zxvf sqlite-autoconf-3420000.tar.gz
WORKDIR /data/sqlite-autoconf-3420000
RUN ./configure
RUN make && make install
ENV LD_LIBRARY_PATH="/usr/local/lib"
# Python3.9环境
WORKDIR /data/
RUN wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
RUN tar -xvf Python-3.9.5.tgz
WORKDIR /data/Python-3.9.5/
RUN ./configure
RUN make && make install
RUN pip3.9 config set global.index-url https://pypi.douban.com/simple/
# git
RUN yum install git -y
RUN git config --global user.name "lililimj"
RUN git config --global user.email "lililimj@qq.com"
# git拉代码
WORKDIR /data/
RUN git clone https://lililimj:Lmj763512\!@gitee.com/wupeiqi/blog.git
# 虚拟环境
RUN pip3.9 install virtualenv
RUN virtualenv /envs/dj --python=python3.9
RUN /envs/dj/bin/pip3.9 install django==3.2
# 运行项目
WORKDIR /data/blog
CMD ["/envs/dj/bin/python","manage.py","runserver","0.0.0.0:9000"]
3.构建容器
docker build -t dj . -f Dockerfile
- 启动容器
# 测试启动
docker run -p 80:9000 --rm dj
# 正经启动
docker run -d -p 80:9000 dj
5.镜像导入导出和发布
后期在项目部署时,会经常使用:CentOS + Python3.9.5 的环境,为了避免每次都编译生成,我们可以自己制作一个【CentOS + Python3.9.5 】的基础镜像,便于后续使用。
Dockerfile
# Base images 基础镜像
FROM centos:7.6.1810
#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com
# GCC编译器
RUN yum install gcc -y
# Python依赖
RUN yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel mysql-devel python-devel libffi-devel
# wget
RUN yum install wget -y
# 目录初始化
RUN mkdir -p /data/
WORKDIR /data/
# SQLite升级
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz --no-check-certificate
RUN tar -zxvf sqlite-autoconf-3420000.tar.gz
WORKDIR /data/sqlite-autoconf-3420000
RUN ./configure
RUN make && make install
ENV LD_LIBRARY_PATH="/usr/local/lib"
RUN rm -rf /data/sqlite-autoconf-3420000*
# Python3.9环境
WORKDIR /data/
RUN wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
RUN tar -xvf Python-3.9.5.tgz
WORKDIR /data/Python-3.9.5/
RUN ./configure
RUN make && make install
RUN rm -rf /data/Python-3.9.5
RUN pip3.9 config set global.index-url https://pypi.douban.com/simple/
2.构建镜像
docker build -t wupeiqi/centos76py39:v1 . -f Dockerfile
3.本地导出和导入
docker image save wupeiqi/centos76py39:1.0 > /data/centos76py39.tgz #将镜像保存到本地/data/下
docker image load -i /data/centos76py39.tgz #将镜像从本地/data/下导入
4.发布
注册hub.docker.com账号
登录docker并上传镜像:注意在push时格式必须为dockerhub用户名/镜像名 ,否则会失败
docker login
docker push limeijing/centos76py39:1.0
#后续使用
docker pull limeijing/centos76py39:1.0
6. Django_uwsgi_nginx部署实例
7.开发机使用docker
win+docker:安装桌面版
mac+docker
拉取基础镜像,编写dockerfile,拉取代码等配置,构建后就能运行。
实现了在win上跑需要其他环境配置的代码。